使用自定义根 CA 生成 Azure 应用程序网关自签名证书

应用程序网关 v2 SKU 引入了允许与后端服务器建立 TLS 连接的受信任根证书。 此预配将删除 v1 SKU 中所需的身份验证证书(单个分支证书)的使用。 根证书是来自后端证书服务器的 Base-64 编码的 X.509(.CER) 格式根证书。 它标识颁发服务器证书的根证书颁发机构 (CA),服务器证书随后将用于 TLS/SSL 通信。

如果你网站的证书是由知名 CA(例如 GoDaddy 或 DigiCert)签名的,则默认情况下,应用程序网关将信任该证书。 在这种情况下,不需要显式上传根证书。 有关详细信息,请参阅应用程序网关的 TLS 终止和端到端 TLS 概述。 但是,如果你有一个开发/测试环境,但不想要购买由已验证的 CA 签名的证书,可以创建自己的自定义根 CA 和用该根 CA 签名的分支证书。

注意

自生成证书默认不受信任,并且可能难以维护。 另外,它们可能使用过时的哈希以及不够可靠的加密套件。 为了提高安全性,请购买由知名证书颁发机构签名的证书。

可以使用以下选项为后端 TLS 连接生成专用证书。

  1. 使用一键式专用证书生成器工具 该工具使用提供的域名(公用名)执行与本文中所述相同的步骤,以生成根证书和服务器证书。 使用生成的证书文件,可以立即将根证书 (.CER) 文件上传到网关的后端设置,并将相应的证书链 (.PFX) 上传到后端服务器。 下载的 ZIP 文件中还提供了 PFX 文件的密码。

  2. 使用 OpenSSL 命令根据需要自定义和生成证书。 如果要完全自行执行此操作,请继续按照本文中的说明进行操作。

本文介绍如何执行以下操作:

  • 创建自己的自定义证书颁发机构
  • 创建由自定义 CA 签名的自签名证书
  • 将自签名的根证书上传到应用程序网关,以便对后端服务器进行身份验证

先决条件

  • 在运行 Windows 或 Linux 的计算机上安装 OpenSSL

    本教程将使用 OpenSSL,不过,其他工具可能也可用于证书管理。 你可能会发现,许多 Linux 分发版(如 Ubuntu)中已捆绑 OpenSSL。

  • 一个 Web 服务器

    例如,用于测试证书的 Apache、IIS 或 NGINX。

  • 一个应用程序网关 v2 SKU

    如果没有现有的应用程序网关,请参阅快速入门:使用 Azure 应用程序网关定向 Web 流量 - Azure 门户

创建根 CA 证书

使用 OpenSSL 创建根 CA 证书。

创建根密钥

  1. 登录到安装了 OpenSSL 的计算机并运行以下命令。 这会创建加密密钥。

    openssl ecparam -out contoso.key -name prime256v1 -genkey
    

创建根证书并进行自签名

  1. 使用以下命令生成证书签名请求 (CSR)。

    openssl req -new -sha256 -key contoso.key -out contoso.csr
    
  2. 出现提示时,请键入根密钥的密码,以及自定义 CA 的组织信息,例如国家/地区、省/市/自治区、组织、组织单位和完全限定的域名(颁发者的域)。

    create root certificate

  3. 使用以下命令生成根证书。

    openssl x509 -req -sha256 -days 365 -in contoso.csr -signkey contoso.key -out contoso.crt
    

    上述命令将创建根证书。 稍后你将使用此证书来为服务器证书签名。

创建服务器证书

接下来,使用 OpenSSL 创建服务器证书。

创建证书的密钥

使用以下命令生成服务器证书的密钥。

openssl ecparam -out fabrikam.key -name prime256v1 -genkey

创建 CSR(证书签名请求)

CSR 是请求证书时向 CA 提供的公钥。 CA 将针对此特定请求颁发证书。

注意

服务器证书的 CN(公用名)必须与颁发者的域不同。 例如,在本例中,颁发者的 CN 是 www.contoso.com,服务器证书的 CN 是 www.fabrikam.com

  1. 使用以下命令生成 CSR:

    openssl req -new -sha256 -key fabrikam.key -out fabrikam.csr
    
  2. 出现提示时,请键入根密钥的密码,以及自定义 CA 的组织信息:国家/地区、省/市/自治区、组织、组织单位和完全限定的域名。 这是网站的域,它应该不同于颁发者。

    Server certificate

使用 CSR 和密钥生成证书,并使用 CA 的根密钥为该证书签名

  1. 使用以下命令以创建证书:

    openssl x509 -req -in fabrikam.csr -CA  contoso.crt -CAkey contoso.key -CAcreateserial -out fabrikam.crt -days 365 -sha256
    

验证新建的证书

  1. 使用以下命令列显 CRT 文件的输出,并验证其内容:

    openssl x509 -in fabrikam.crt -text -noout
    

    Certificate verification

  2. 验证目录中的文件,确保其中具有以下文件:

    • contoso.crt
    • contoso.key
    • fabrikam.crt
    • fabrikam.key

在 Web 服务器的 TLS 设置中配置证书

在 Web 服务器中,使用 fabrikam.crt 和 fabrikam.key 文件配置 TLS。 如果 Web 服务器无法接收这两个文件,你可以使用 OpenSSL 命令将其合并成单个 .pem 或 .pfx 文件。

IIS

有关如何导入证书并将其上传为 IIS 上的服务器证书的说明,请参阅如何:在 Windows Server 2003 中的 Web 服务器上安装导入的证书

有关 TLS 绑定说明,请参阅如何在 IIS 7 上设置 SSL

Apache

以下配置是在 Apache 中 为 SSL 配置的虚拟主机 示例:

<VirtualHost www.fabrikam:443>
      DocumentRoot /var/www/fabrikam
      ServerName www.fabrikam.com
      SSLEngine on
      SSLCertificateFile /home/user/fabrikam.crt
      SSLCertificateKeyFile /home/user/fabrikam.key
</VirtualHost>

NGINX

以下配置是 NGINX 服务器块与 TLS 配置的示例:

NGINX with TLS

访问服务器以验证配置

  1. 将根证书添加到计算机的受信任根存储中。 访问网站时,请确保浏览器中显示整个证书链。

    Trusted root certificates

    注意

    假设 DNS 已配置为将 Web 服务器名称(在本示例中为 www.fabrikam.com)指向 Web 服务器的 IP 地址。 否则,可以编辑主文件来解析名称。

  2. 浏览到你的网站,然后单击浏览器地址框中的锁定图标来验证站点和证书信息。

使用 OpenSSL 验证配置

或者,可以使用 OpenSSL 来验证证书。

openssl s_client -connect localhost:443 -servername www.fabrikam.com -showcerts

OpenSSL certificate verification

将根证书上传到应用程序网关的 HTTP 设置

若要在应用程序网关中上传证书,必须将 .crt 证书导出为 Base-64 编码的 .cer 格式。 由于 .crt 已包含 Base-64 编码格式的公钥,因此,只需将文件扩展名从 .crt 重命名为 .cer 即可。

Azure 门户

若要从门户上传受信任的根证书,请选择“后端设置”,然后选择“后端协议”中的“HTTPS”。

Screenshot of adding a certificate using the portal.

Azure PowerShell

或者,可以使用 Azure CLI 或 Azure PowerShell 上传根证书。 以下代码是一个 Azure PowerShell 示例。

注意

下面的示例将受信任的根证书添加到应用程序网关,创建新的 HTTP 设置并添加新的规则(假设后端池和侦听器已存在)。

## Add the trusted root certificate to the Application Gateway

$gw=Get-AzApplicationGateway -Name appgwv2 -ResourceGroupName rgOne

Add-AzApplicationGatewayTrustedRootCertificate `
   -ApplicationGateway $gw `
   -Name CustomCARoot `
   -CertificateFile "C:\Users\surmb\Downloads\contoso.cer"

$trustedroot = Get-AzApplicationGatewayTrustedRootCertificate `
   -Name CustomCARoot `
   -ApplicationGateway $gw

## Get the listener, backend pool and probe

$listener = Get-AzApplicationGatewayHttpListener `
   -Name basichttps `
   -ApplicationGateway $gw

$bepool = Get-AzApplicationGatewayBackendAddressPool `
  -Name testbackendpool `
  -ApplicationGateway $gw

Add-AzApplicationGatewayProbeConfig `
  -ApplicationGateway $gw `
  -Name testprobe `
  -Protocol Https `
  -HostName "www.fabrikam.com" `
  -Path "/" `
  -Interval 15 `
  -Timeout 20 `
  -UnhealthyThreshold 3

$probe = Get-AzApplicationGatewayProbeConfig `
  -Name testprobe `
  -ApplicationGateway $gw

## Add the configuration to the HTTP Setting and don't forget to set the "hostname" field
## to the domain name of the server certificate as this will be set as the SNI header and
## will be used to verify the backend server's certificate. Note that TLS handshake will
## fail otherwise and might lead to backend servers being deemed as Unhealthy by the probes

Add-AzApplicationGatewayBackendHttpSettings `
  -ApplicationGateway $gw `
  -Name testbackend `
  -Port 443 `
  -Protocol Https `
  -Probe $probe `
  -TrustedRootCertificate $trustedroot `
  -CookieBasedAffinity Disabled `
  -RequestTimeout 20 `
  -HostName www.fabrikam.com

## Get the configuration and update the Application Gateway

$backendhttp = Get-AzApplicationGatewayBackendHttpSettings `
  -Name testbackend `
  -ApplicationGateway $gw

Add-AzApplicationGatewayRequestRoutingRule `
  -ApplicationGateway $gw `
  -Name testrule `
  -RuleType Basic `
  -BackendHttpSettings $backendhttp `
  -HttpListener $listener `
  -BackendAddressPool $bepool

Set-AzApplicationGateway -ApplicationGateway $gw

验证应用程序网关后端运行状况

  1. 单击应用程序网关的“后端运行状况”视图,检查探测是否正常。
  2. 应会看到,HTTPS 探测的状态为“正常”。

HTTPS probe

后续步骤

若要了解有关应用程序网关上的 SSL\TLS 的详细信息,请参阅应用程序网关的 TLS 终止和端到端 TLS 概述