Skip to content

Commit 7cb4d33

Browse files
authored
feat: NGINXaaS - Certificate Fetch via Private Endpoint support (#1137)
This commit updates the NGINXaaS documentation to add instructions for fetching certificates via private endpoints.
1 parent 2e9dc3f commit 7cb4d33

File tree

5 files changed

+196
-20
lines changed

5 files changed

+196
-20
lines changed

content/includes/nginxaas-azure/ssl-tls-prerequisites.md

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,12 +12,14 @@ NGINXaaS natively integrates with [Azure Key Vault (AKV)](https://azure.microsof
1212

1313
- If using Access Policies for AKV, ensure that your MI has *GET secrets* or higher permissions.
1414

15+
- Access to AKV through a public or private endpoint. If public access to AKV needs to be restricted, refer to [Restrict Public Access to Key Vault]({{< ref "/nginxaas-azure/quickstart/security-controls/certificates.md#restrict-public-access-to-key-vault" >}}).
16+
1517
- In addition to the MI permissions, if using the Azure portal to manage certificates, ensure that you have read access to list certificates inside the Key Vault:
1618

1719
- If using Azure RBAC for AKV, ensure that you have [Key Vault Reader](https://learn.microsoft.com/en-us/azure/role-based-access-control/built-in-roles#key-vault-reader) or higher permissions.
1820

1921
- If using Access Policies for AKV, ensure that you have *LIST certificates* or higher permissions.
2022

21-
- If public access is disabled on your key vault, [configure Network Security Perimeter]({{< ref "/nginxaas-azure/quickstart/security-controls/certificates.md#configure-network-security-perimeter-nsp" >}}) and add an inbound access rule to allow your client IP address.
23+
- If public access is disabled on your key vault, add an inbound access rule to allow your client IP address.
2224

2325
- If you're unfamiliar with Azure Key Vault, check out the [Azure Key Vault concepts](https://docs.microsoft.com/en-us/azure/key-vault/general/basic-concepts) documentation from Microsoft.

content/nginxaas-azure/changelog.md

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,10 @@ To review older entries, visit the [Changelog archive]({{< ref "/nginxaas-azure/
1919

2020
Users can now test the availability of specific IP addresses from their deployment's dataplane. This is useful for debugging connectivity issues and determining if a problem is in NGINX configuration or Azure network configuration. Please see the docs for the [connectivity test tool]({{< ref "/nginxaas-azure/get-help/connectivity.md" >}}) for further details.
2121

22+
- {{% icon-feature %}} **Support for downloading AKV certificates via Private Endpoints**
23+
24+
NGINXaaS now supports downloading certificate from Azure Key Vault via Private Endpoints. This will allow users to increase network security by disabling public access on their Key Vault. For more information, please visit [Integrate with Private Endpoint]({{< ref "/nginxaas-azure/quickstart/security-controls/certificates.md#integrate-with-private-endpoint" >}})
25+
2226
## September 18, 2025
2327

2428
- {{% icon-feature %}} **Notification on update to deployments using the Stable Upgrade Channel**

content/nginxaas-azure/getting-started/ssl-tls-certificates/overview.md

Lines changed: 131 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -95,7 +95,7 @@ The following section describes common errors you might encounter while adding S
9595

9696
- **User assigned managed identity**
9797

98-
Please ensure the following environment variables are set before copying the below Azure CLI command.
98+
Set the following environment variables before copying the below Azure CLI command.
9999
- `MI_NAME`: the name of the managed identity
100100
- `MI_RESOURCE_GROUP`: the name of the resource group the managed identity is in
101101
```shell
@@ -106,7 +106,7 @@ The following section describes common errors you might encounter while adding S
106106

107107
- **System assigned managed identity**
108108

109-
Please ensure the following environment variables are set before copying the below Azure CLI command.
109+
Set the following environment variables before copying the below Azure CLI command.
110110
- `DEP_NAME`: the name of the NGINXaaS deployment
111111
- `DEP_RESOURCE_GROUP`: the name of the resource group the NGINXaaS deployment is in
112112
```shell
@@ -116,7 +116,7 @@ The following section describes common errors you might encounter while adding S
116116
```
117117
1. Get the resource ID of the key vault.
118118

119-
Please ensure the following environment variables are set before copying the below Azure CLI command.
119+
Set the following environment variables before copying the below Azure CLI command.
120120
- `KV_NAME`: the name of the key vault
121121
- `KV_RESOURCE_GROUP`: the name of the resource group the key vault is in
122122
```shell
@@ -145,7 +145,7 @@ The following section describes common errors you might encounter while adding S
145145
146146
- **User assigned managed identity**
147147
148-
Please ensure the following environment variables are set before copying the below Azure CLI command.
148+
Set the following environment variables before copying the below Azure CLI command.
149149
- `MI_NAME`: the name of the managed identity
150150
- `MI_RESOURCE_GROUP`: the name of the resource group the managed identity is in
151151
```shell
@@ -156,7 +156,7 @@ The following section describes common errors you might encounter while adding S
156156
157157
- **System assigned managed identity**
158158
159-
Please ensure the following environment variables are set before copying the below Azure CLI command.
159+
Set the following environment variables before copying the below Azure CLI command.
160160
- `DEP_NAME`: the name of the NGINXaaS deployment
161161
- `DEP_RESOURCE_GROUP`: the name of the resource group the NGINXaaS deployment is in
162162
```shell
@@ -167,7 +167,7 @@ The following section describes common errors you might encounter while adding S
167167
168168
1. Create the access policy.
169169
170-
Please ensure the following environment variables are set before copying the below Azure CLI command.
170+
Set the following environment variables before copying the below Azure CLI command.
171171
- `KV_NAME`: the name of the key vault
172172
- `KV_RESOURCE_GROUP`: the name of the resource group the key vault is in
173173
```shell
@@ -178,26 +178,29 @@ The following section describes common errors you might encounter while adding S
178178
```
179179
</details>
180180
181-
#### Error code: `ForbiddenByFirewall`
181+
#### Error code: `ForbiddenByFirewall` or `ForbiddenByConnection`
182182
183183
**Description:** The key vault's firewall is enabled and NGINXaaS is not authorized to fetch certificates.
184184

185-
**Resolution:** [Configure Network Security Perimeter]({{< ref "/nginxaas-azure/quickstart/security-controls/certificates.md#configure-network-security-perimeter-nsp" >}}) to allow the subscription of the NGINXaaS deployment to access the key vault.
185+
**Resolution:**
186186

187+
Allow NGINXaaS to access the key vault through one of these mechanisms:
188+
189+
1. [Configure Network Security Perimeter]({{< ref "/nginxaas-azure/quickstart/security-controls/certificates.md#configure-network-security-perimeter-nsp" >}}) to allow the subscription of the NGINXaaS deployment to access the key vault.
187190
<details>
188191
<summary>Create a network security perimeter - Azure CLI</summary>
189192

190193
1. Create a network security perimeter.
191194

192-
Please ensure the following environment variables are set before copying the below Azure CLI command.
195+
Set the following environment variables before copying the below Azure CLI command.
193196
- `NSP_NAME`: the name of the network security perimeter
194197
- `NSP_RESOURCE_GROUP`: the name of the resource group the network security perimeter will be in
195198
```shell
196199
az network perimeter create --name $NSP_NAME --resource-group $NSP_RESOURCE_GROUP
197200
```
198201
1. Create a profile for the network security perimeter.
199202

200-
Please ensure the following environment variable is set before copying the below Azure CLI command.
203+
Set the following environment variable is set before copying the below Azure CLI command.
201204
- `PROFILE_NAME`: the name of the network security perimeter profile
202205
```shell
203206
az network perimeter profile create --name $PROFILE_NAME \
@@ -206,7 +209,7 @@ The following section describes common errors you might encounter while adding S
206209
```
207210
1. Get the resource ID of the key vault.
208211

209-
Please ensure the following environment variables are set before copying the below Azure CLI command.
212+
Set the following environment variables before copying the below Azure CLI command.
210213
- `KV_NAME`: the name of the key vault
211214
- `KV_RESOURCE_GROUP`: the name of the resource group the key vault is in
212215
```shell
@@ -230,7 +233,7 @@ The following section describes common errors you might encounter while adding S
230233
```
231234
1. Add an inbound access rule to allow the NGINXaaS deployment's subscription.
232235
233-
Please ensure the following environment variables are set before copying the below Azure CLI command.
236+
Set the following environment variables before copying the below Azure CLI command.
234237
- `RULE_NAME`: the name of the access rule
235238
- `DEP_SUBSCRIPTION_ID`: the subscription ID of the NGINXaaS deployment
236239
```shell
@@ -242,6 +245,118 @@ The following section describes common errors you might encounter while adding S
242245
```
243246
</details>
244247
248+
2. Integrate with a Private Endpoint to allow NGINXaaS to fetch certificates via Azure Private Link.
249+
<details>
250+
<summary>Create a Private Link - Azure CLI</summary>
251+
252+
1. Get the resource ID of the key vault.
253+
254+
Set the following environment variables before copying the below Azure CLI command.
255+
- `KV_NAME`: the name of the key vault
256+
- `KV_RESOURCE_GROUP`: the name of tshe resource group the key vault is in
257+
```shell
258+
key_vault_id=$(az keyvault show --name $KV_NAME \
259+
--resource-group $KV_RESOURCE_GROUP \
260+
--query id --output tsv)
261+
```
262+
263+
1. Create a private endpoint.
264+
265+
Set the following environment variables before copying the below Azure CLI command.
266+
- `PE_NAME`: the name of the private endpoint
267+
- `PE_RESOURCE_GROUP`: the name of the resource group the private endpoint will be in
268+
- `VNET_NAME`: the name of the virtual network that is delegated to NGINXaaS
269+
- `VNET_RESOURCE_GROUP`: the name of the resource group the virtual network is in
270+
- `SUBNET_NAME`: the name of the subnet for private endpoints
271+
- `PE_CONNECTION_NAME`: the name of the private endpoint connection
272+
- `LOCATION`: the location of the virtual network
273+
```shell
274+
az network private-endpoint create --name $PE_NAME \
275+
--resource-group $PE_RESOURCE_GROUP \
276+
--vnet-name $VNET_NAME \
277+
--subnet $SUBNET_NAME \
278+
--private-connection-resource-id $key_vault_id \
279+
--group-id vault \
280+
--connection-name $PE_CONNECTION_NAME \
281+
--location $LOCATION
282+
```
283+
284+
1. Create a private DNS zone and link VNet.
285+
286+
Set the following environment variables before copying the below Azure CLI command.
287+
- `ZONE_RESOURCE_GROUP`: the name of the resource group for the DNS zone
288+
- `ZONE_NAME`: the name of the DNS zone
289+
- `DNS_LINK_NAME`: the name of the DNS zone link
290+
```shell
291+
vnet_id=$(az network vnet show --name $VNET_NAME \
292+
--resource-group $VNET_RESOURCE_GROUP \
293+
--query id --output tsv)
294+
```
295+
```shell
296+
az network private-dns zone create --resource-group $ZONE_RESOURCE_GROUP \
297+
--name $ZONE_NAME
298+
az network private-dns link vnet create --resource-group $ZONE_RESOURCE_GROUP \
299+
--zone-name $ZONE_NAME \
300+
--name $DNS_LINK_NAME \
301+
--virtual-network $vnet_id \
302+
--registration-enabled false
303+
```
304+
305+
1. Add DNS zone group to the private endpoint.
306+
307+
Set the following environment variables before copying the below Azure CLI command.
308+
- `DNS_ZONE_GROUP_NAME`: the name of the resource group for the DNS zone
309+
```shell
310+
az network private-endpoint dns-zone-group create \
311+
--resource-group $PE_RESOURCE_GROUP \
312+
--endpoint-name $PE_NAME \
313+
--name $DNS_ZONE_GROUP_NAME \
314+
--private-dns-zone $ZONE_NAME \
315+
--zone-name $ZONE_NAME
316+
```
317+
</details>
318+
319+
3. Allow access from Virtual Network delegated to NGINXaaS.
320+
321+
<details>
322+
<summary>Allow Virtual Network access - Azure CLI</summary>
323+
324+
1. Get the resource ID of the virtual network.
325+
326+
Set the following environment variables before copying the below Azure CLI command.
327+
- `VNET_NAME`: the name of the virtual network that is delegated to NGINXaaS
328+
- `VNET_RESOURCE_GROUP`: the name of the resource group the virtual network is in
329+
```shell
330+
vnet_id=$(az network vnet show --name $VNET_NAME \
331+
--resource-group $VNET_RESOURCE_GROUP \
332+
--query id --output tsv)
333+
```
334+
335+
1. Get the resource ID of the subnet.
336+
337+
Set the following environment variable before copying the below Azure CLI command.
338+
- `SUBNET_NAME`: the name of the subnet that is delegated to NGINXaaS
339+
```shell
340+
subnet_id=$(az network vnet subnet show --name $SUBNET_NAME \
341+
--vnet-name $VNET_NAME \
342+
--resource-group $VNET_RESOURCE_GROUP \
343+
--query id --output tsv)
344+
```
345+
346+
1. Add the virtual network rule to the key vault.
347+
348+
Set the following environment variables before copying the below Azure CLI command.
349+
- `KV_NAME`: the name of the key vault
350+
- `KV_RESOURCE_GROUP`: the name of the resource group the key vault is in
351+
```shell
352+
az keyvault network-rule add --name $KV_NAME \
353+
--resource-group $KV_RESOURCE_GROUP \
354+
--subnet $subnet_id
355+
```
356+
357+
{{< call-out "note" >}} Ensure that the Network Security Group on the subnet delegated to the NGINXaaS deployment allows outbound traffic to the internet{{< /call-out >}}
358+
</details>
359+
245360
#### Error code: `AnotherOperationInProgress`
246361
247362
**Description:** Another operation on this, or a dependent resource, is in progress.
@@ -273,7 +388,7 @@ The following section describes common errors you might encounter while adding S
273388
274389
- **User assigned managed identity**
275390
276-
Please ensure the following environment variables are set before copying the below Azure CLI command.
391+
Set the following environment variables before copying the below Azure CLI command.
277392
- `MI_NAME`: the name of the managed identity
278393
- `MI_RESOURCE_GROUP`: the name of the resource group the managed identity is in
279394
```shell
@@ -284,7 +399,7 @@ The following section describes common errors you might encounter while adding S
284399
285400
- **System assigned managed identity**
286401
287-
Please ensure the following environment variables are set before copying the below Azure CLI command.
402+
Set the following environment variables before copying the below Azure CLI command.
288403
- `DEP_NAME`: the name of the NGINXaaS deployment
289404
- `DEP_RESOURCE_GROUP`: the name of the resource group the NGINXaaS deployment is in
290405
```shell
@@ -295,7 +410,7 @@ The following section describes common errors you might encounter while adding S
295410
296411
1. Create the access policy.
297412
298-
Please ensure the following environment variables are set before copying the below Azure CLI command.
413+
Set the following environment variables before copying the below Azure CLI command.
299414
- `KV_NAME`: the name of the key vault
300415
- `KV_RESOURCE_GROUP`: the name of the resource group the key vault is in
301416
```shell
@@ -323,7 +438,7 @@ The following section describes common errors you might encounter while adding S
323438
324439
1. Get the resource ID of the certificate.
325440
326-
Please ensure the following environment variables are set before copying the below Azure CLI command.
441+
Set the following environment variables before copying the below Azure CLI command.
327442
- `CERT_NAME`: the name of the certificate
328443
- `KV_NAME`: the name of the key vault
329444
```shell

content/nginxaas-azure/known-issues.md

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,14 @@ url: /nginxaas/azure/known-issues/
99

1010
List of known issues in the latest release of F5 NGINXaaS for Azure (NGINXaaS).
1111

12+
### {{% icon-bug %}} Certificate failures when managed identities with access is added after deployment creation
13+
14+
This issue occurs when public access is disabled on Azure Key Vault (AKV) and the managed identity that has access to AKV is added to the NGINXaaS deployment after creation.
15+
16+
Updating managed identities on an NGINXaaS deployment after creation may result in the managed identity not being correctly delegated to the dataplane, which can cause certificate fetch failures.
17+
18+
**Workaround**: To avoid this issue, when you create an NGINXaaS deployment, make sure that the managed identity with access to AKV is assigned during initial creation. If managed identities need to be updated after creation, enable public access to AKV or [configure Network Security Perimeter]({{< ref "/nginxaas-azure/quickstart/security-controls/certificates.md#configure-network-security-perimeter-nsp" >}})
19+
1220
### {{% icon-bug %}} Custom and precompiled security policies cannot both be referenced in an NGINX configuration
1321

1422
When using NGINX App Protect WAF, you can only reference default or custom security policies in your NGINX configuration, not both.

0 commit comments

Comments
 (0)