在Azure Application Gateway中导入Let's Encrypt根证书报错如何解决
问题:Azure应用网关上传Let's Encrypt证书报错“证书数据无效”
我正在配置VNet内的Api Management通过应用网关(WAF)对外提供访问能力,目前卡在根证书上传到应用网关的步骤,系统提示“证书数据无效”,看起来Azure Application Gateway对Let's Encrypt证书存在兼容性问题。
我使用的证书对应域名如下:
- mydomain.com.br
- api.mydomain.com.br
- developer.mydomain.com.br
- managemnet.mydomain.com.br
所有证书均通过acmesh生成,生成命令如下:
./acme.sh --issue -d mydomain.com.br --dns dns_gd --server letsencrypt ./acme.sh --issue -d api.mydomain.com.br --dns dns_gd --server letsencrypt ./acme.sh --issue -d developer.mydomain.com.br ---dns dns_gd --server letsencrypt ./acme.sh --issue -d management.mydomain.com.br --dns dns_gd --server letsencrypt
目前Vnet、子网、安全组和Api Management资源均已创建成功,仅在创建应用网关时出现问题,创建命令如下:
$appgwName = "apim-app-gw" $appgw = New-AzApplicationGateway -Name $appgwName -ResourceGroupName $resGroupName -Location $location ` -BackendAddressPools $apimGatewayBackendPool,$apimPortalBackendPool,$apimManagementBackendPool ` -BackendHttpSettingsCollection $apimPoolGatewaySetting, $apimPoolPortalSetting, $apimPoolManagementSetting ` -FrontendIpConfigurations $fipconfig01 -GatewayIpConfigurations $gipconfig -FrontendPorts $fp01 ` -HttpListeners $gatewayListener,$portalListener,$managementListener ` -RequestRoutingRules $gatewayRule,$portalRule,$managementRule ` -Sku $sku -WebApplicationFirewallConfig $config -SslCertificates $certGateway,$certPortal,$certManagement ` -TrustedRootCertificate $trustedRootCert -Probes $apimGatewayProbe,$apimPortalProbe,$apimManagementProbe
问题出在最后一行指定.cer文件路径的环节,我尝试过上传mydomain.com.br.cer、fullchain.cer均失败,也尝试用openssl生成Base64格式文件还是报错,转换命令如下:
sudo openssl x509 -inform PEM -in /etc/letsencrypt/live/mydomain.com/fullchain.pem -outform DER -out trustedrootDER.cer openssl x509 -inform der -in trustedrootDER.cer -out trustedroot.cer
我甚至额外创建了Windows虚拟机,参照官方方案操作仍然没有解决问题。
架构示意图如下:
恳请各位提供可行的解决方向,谢谢!
解决方案
按照以下步骤操作即可解决问题:
- 导出正确的根证书
你之前上传的站点叶子证书、包含中间证书的fullchain都不符合应用网关的要求,应用网关需要的是签发证书的根CA公钥,对应Let's Encrypt证书就是ISRG Root X1根证书,执行以下命令导出:
openssl s_client -connect mydomain.com.br:443 -showcerts | awk '/-----BEGIN CERTIFICATE-----/,/-----END CERTIFICATE-----/{if(NR>=3) print}' > isrg-root-x1.pem openssl x509 -inform PEM -in isrg-root-x1.pem -outform DER -out isrg-root-x1.cer
- 修正证书对象创建逻辑
不能直接把本地证书路径传给创建应用网关命令的-TrustedRootCertificate参数,需要先提前创建证书对象:
$trustedRootCert = New-AzApplicationGatewayTrustedRootCertificate ` -Name "ISRGRootX1" ` -CertificateFile "本地isrg-root-x1.cer的完整路径"
- v2 SKU可选优化
如果你的应用网关用的是v2 SKU,不需要手动上传根证书,只需要在后端HTTP设置和健康探针里开启「从后端地址取主机名」选项,只要APIM绑定的Let's Encrypt证书是公网信任的,应用网关会自动完成信任校验。 - 检查APIM侧证书配置
确认APIM自定义域名绑定的是完整的fullchain证书,不要只绑定单张叶子证书,避免TLS握手时应用网关无法拿到完整证书链导致验证失败。
内容的提问来源于stack exchange,提问作者Bruno Moreira
相关产品推荐
相关产品推荐

