使用 Key Vault 证书进行 TLS 终止

Azure Key Vault 是平台托管的机密存储,可以用来保证机密、密钥和 TLS/SSL 证书的安全。 Azure 应用程序网关支持与密钥保管库集成,以存储附加到支持 HTTPS 的侦听器的服务器证书。 此支持仅限 v2 SKU 版应用程序网关。

应用程序网关为 TLS 终止提供两种模型:

  • 提供附加到侦听器的 TLS/SSL 证书。 此模型是将 TLS/SSL 证书传递到应用程序网关进行 TLS 终止的传统方式。
  • 在创建启用 HTTPS 的侦听器时,提供对现有密钥保管库证书或机密的引用。

应用程序网关与 Key Vault 集成具有许多优势,其中包括:

  • 更高的安全性,因为 TLS/SSL 证书不直接由应用程序开发团队处理。 集成允许独立的安全团队执行以下操作:
    • 设置应用程序网关。
    • 控制应用程序网关生命周期。
    • 授权选定的应用程序网关访问存储在 Key Vault 中的证书。
  • 支持将现有证书导入 Key Vault 中。 或者使用 Key Vault API 与任何受信任的 Key Vault 合作伙伴一起创建并管理新证书。
  • 支持自动续订存储在 Key Vault 中的证书。

支持的证书

应用程序网关目前仅支持经软件验证的证书。 不支持硬件安全模块 (HSM) 验证的证书。

在应用程序网关在配置为使用 Key Vault 证书以后,其实例会从 Key Vault 检索证书并将其安装到本地进行 TLS 终止。 实例按 4 小时的时间间隔轮询密钥保管库,以便检索证书的续订版本(如果存在)。 如果找到更新的证书,会自动轮换与 HTTPS 侦听器关联的 TLS/SSL 证书。

提示

对应用程序网关的任何更改都强制检查 Key Vault,以查看是否有任何新版本的证书可用。 这包括(但不限于)对前端 IP 配置、侦听器、规则、后端池、资源标记等的更改。 如果找到更新的证书,会立即显示新证书。

应用程序网关在密钥保管库中使用机密标识符引用证书。 对于 Azure PowerShell、Azure CLI 或 Azure 资源管理器,我们强烈建议使用未指定版本的机密标识符。 这样,如果 Key Vault 中有更新的版本可用,应用程序网关会自动轮换证书。 没有版本的机密 URI 的一个示例是 https://myvault.vault.azure.cn/secrets/mysecret/。 可参考以下部分中提供的 PowerShell 步骤。

Azure 门户仅支持密钥保管库证书,而不支持机密。 应用程序网关仍支持从密钥保管库引用机密,但只能通过非门户资源,如 PowerShell、Azure CLI、API 和 Azure 资源管理器模板(ARM 模板)。 Key Vault 证书必须具有可导出的私钥,以便应用程序网关能够使用这些私钥。

支持对其他 Azure 订阅中的 Key Vault 的引用,但必须通过 ARM 模板、Azure PowerShell、CLI、Bicep 等进行配置。应用程序网关目前不支持通过 Azure 门户跨订阅配置密钥保管库。

密钥保管库中的证书设置

对于 TLS 终止,应用程序网关仅支持个人信息 Exchange (PFX) 格式的证书。 可以导入现有的证书,也可以在 Key Vault 中创建新证书。 若要避免任何失败,请确保在密钥保管库中将证书的状态设置为“已启用”。

集成工作原理

应用程序网关与密钥保管库集成是一个三步配置过程:

将应用程序网关与密钥保管库集成的三步骤演示图。

注意

Azure 应用程序网关与 Key Vault 的集成支持保管库访问策略和 Azure 基于角色的访问控制权限模型。

获取用户分配的托管标识

应用程序网关使用托管标识,以代表你的身份从密钥保管库检索证书。

你可以创建新的用户分配的托管标识,也可以通过集成重复使用现有的标识。 若要创建新的用户分配的托管标识,请参阅使用 Azure 门户创建用户分配的托管标识

将用户分配的托管标识委托给 Key Vault

定义用于将用户分配的托管标识与 Key Vault 一起使用时的访问策略:

  1. 在 Azure 门户中,转到“密钥保管库”。

  2. 选择包含证书的 Key Vault。

  3. 如果使用的是权限模型“保管库访问策略”:选择“访问策略”,选择“+ 添加访问策略”,针对“机密权限”选择“获取”,然后针对“选择主体”选择由用户分配的托管标识。 然后,选择“保存”。

    如果正在使用 Azure 基于角色的访问控制,请遵循文章向托管标识分配对资源的访问权限,并向用户分配的托管标识分配对 Azure Key Vault 的“Key Vault 机密用户”角色。

验证对 Key Vault 的防火墙权限

从 2021 年 3 月 15 日起,Key Vault 通过利用用户托管标识在 Azure Key Vault 中进行身份验证,从而将应用程序网关识别为受信任的服务。 使用服务终结点并为 Key Vault 的防火墙启用“受信任的服务”选项,可以在 Azure 中构建安全的网络边界。 你可以拒绝访问从所有网络到密钥保管库的流量(包括 Internet 流量),但仍可让密钥保管库访问你订阅的应用程序网关资源。

使用受限制的 Key Vault 时,请使用以下步骤将应用程序网关配置为使用防火墙和虚拟网络:

提示

如果 Key Vault 启用了专用终结点,则不需要执行步骤 1-3。 应用程序网关可以使用专用 IP 地址访问 Key Vault。

重要

如果使用专用终结点访问 Key Vault,则必须将 privatelink.vaultcore.chinacloudapi.cn 专用 DNS 区域(包含引用的密钥保管库的相应记录)链接到包含应用程序网关的虚拟网络。 自定义 DNS 服务器可能继续在虚拟网络上使用,而不是在 Azure DNS 提供的解析程序上使用,但专用 DNS 区域仍然需要保持与虚拟网络的链接。

  1. 在 Azure 门户中的 Key Vault 中,选择“网络”。

  2. 在“防火墙和虚拟网络”选项卡中,选择“选定的网络”。

  3. 对于“虚拟网络”,请选择“ + 添加现有虚拟网络”,然后为应用程序网关实例添加虚拟网络和子网。 如果出现提示,请确保“此时不要配置 'Microsoft.KeyVault' 服务终结点”复选框未选中,以确保在子网上启用 Microsoft.KeyVault 服务终结点。

  4. 选择“是”以允许受信任的服务绕过 Key Vault 的防火墙。

    显示用于将应用程序网关配置为使用防火墙和虚拟网络的选项的屏幕截图。

注意

如果你是通过 ARM 模板来部署应用程序网关实例(不管是使用 Azure CLI 还是使用 PowerShell),或通过从 Azure 门户部署的 Azure 应用程序来执行此操作,SSL 证书将以 Base64 编码的 PFX 文件形式存储在 Key Vault 中。 必须完成在部署过程中使用 Azure Key Vault 传递安全参数值中的步骤。

enabledForTemplateDeployment 设置为 true 尤其重要。 证书可能包含也可能没有密码。 对于包含密码的证书,以下示例显示了适用于应用程序网关的 ARM 模板配置的 properties 中的 sslCertificates 条目的可能配置。

"sslCertificates": [
     {
         "name": "appGwSslCertificate",
         "properties": {
             "data": "[parameters('appGatewaySSLCertificateData')]",
            "password": "[parameters('appGatewaySSLCertificatePassword')]"
        }
    }
]

将从 Key Vault 中查找 appGatewaySSLCertificateDataappGatewaySSLCertificatePassword 的值,如appGatewaySSLCertificateData中所述。 请遵循 parameters('secretName') 中的后向引用,了解查找方法。 如果证书无密码,请省略 password 条目。

配置应用程序网关侦听器

Key Vault 权限保管库访问策略模型

在 Azure 门户中导航到应用程序网关,然后选择“侦听器”选项卡。选择“添加侦听器”(或选择现有侦听器)并指定协议的 HTTPS。

在“选择证书”下,选择“新建”,然后在“Https 设置”下选择“从 Key Vault 中选择证书”。

针对“证书名称”,请键入证书的友好名称,以便在 Key Vault 中引用。 选择托管标识、Key Vault 和证书。

选择后,如果要将引用的 Key Vault 证书应用到侦听器,请选择“添加”(如果要创建)或“保存”(如果要编辑)。

Key Vault Azure 基于角色的访问控制权限模型

应用程序网关支持在 Key Vault 中通过基于角色的访问控制权限模型引用的证书。 引用 Key Vault 的前几个步骤必须通过 ARM 模板、Bicep、CLI 或 PowerShell 完成。

注意

不支持通过门户指定受基于角色的访问控制权限模型约束的 Azure Key Vault 证书。

在本示例中,我们将使用 PowerShell 来引用新的 Key Vault 机密。

# Get the Application Gateway we want to modify
$appgw = Get-AzApplicationGateway -Name MyApplicationGateway -ResourceGroupName MyResourceGroup
# Specify the resource id to the user assigned managed identity - This can be found by going to the properties of the managed identity
Set-AzApplicationGatewayIdentity -ApplicationGateway $appgw -UserAssignedIdentityId "/subscriptions/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx/resourceGroups/MyResourceGroup/providers/Microsoft.ManagedIdentity/userAssignedIdentities/MyManagedIdentity"
# Get the secret ID from Key Vault
$secret = Get-AzKeyVaultSecret -VaultName "MyKeyVault" -Name "CertificateName"
$secretId = $secret.Id.Replace($secret.Version, "") # Remove the secret version so Application Gateway uses the latest version in future syncs
# Specify the secret ID from Key Vault 
Add-AzApplicationGatewaySslCertificate -KeyVaultSecretId $secretId -ApplicationGateway $appgw -Name $secret.Name
# Commit the changes to the Application Gateway
Set-AzApplicationGateway -ApplicationGateway $appgw

执行命令后,可以导航到 Azure 门户中的应用程序网关,然后选择“侦听器”选项卡。单击“添加侦听器”(或选择现有侦听器),并将“协议”指定为 HTTPS。

在“选择证书”下,选择在前面的步骤中命名的证书。 选择后,如果要将引用的 Key Vault 证书应用到侦听器,请选择“添加”(如果要创建)或“保存”(如果要编辑)。

调查和解决密钥保管库错误

注意

在更改 Key Vault 资源或撤销对其的访问权限时,请务必考虑对应用程序网关资源的任何影响。 如果应用程序网关无法访问关联的密钥保管库,或者在其中找不到证书对象,应用程序网关会自动将侦听器设置为禁用状态。

可以通过查看应用程序网关的资源运行状况来确定此用户驱动事件。 了解详细信息

Azure 应用程序网关不仅会每隔 4 小时对密钥保管库上的续订证书版本进行轮询。 还会记录任何错误,并与 Azure 顾问集成,以显示任何错误配置并提供修复建议。

  1. 登录到 Azure 门户
  2. 选择顾问
  3. 从左侧菜单中选择“卓越运营”类别。
  4. 如果网关遇到此问题,你会发现一个标题为“解决应用程序网关的 Azure Key Vault 问题”的建议。 确保从上面的下拉列表选项中选择正确的订阅。
  5. 选择它以查看错误详细信息、关联的密钥保管库资源和疑难解答指南,以解决你的确切问题。

通过 Azure 顾问或资源运行状况识别此类事件,可以快速解决 Key Vault 的任何配置问题。 强烈建议利用 Azure 顾问和资源运行状况警报,以在检测到问题时及时收到通知。

对于顾问警报,请使用以下所示的建议类型中的“解决应用程序网关的 Azure Key Vault 问题”:
显示顾问警报步骤的图表。

可按如下所示配置资源运行状况警报:
显示资源运行状况警报步骤的图表。

后续步骤

通过 Azure PowerShell 配置使用 Key Vault 证书的 TLS 终止