# Azure App Service 配置 SSL：免费托管证书与 SNI 绑定

> 为 Azure App Service 自定义域名配置 HTTPS：创建免费托管证书或上传 PFX，添加 SNI SSL 绑定，开启仅 HTTPS 和 TLS 1.2，附世纪互联运营的 Azure 中国区差异。

Source: https://ssl.sh/zh/guides/azure-app-service-ssl/
Last updated: 2026-11-10

Azure App Service 配置 SSL 分三步：创建免费托管证书（或上传自己的 PFX），把证书以 SNI SSL 绑定到自定义域名，再开启“仅 HTTPS”并把最低 TLS 版本设为 1.2。托管证书免费，到期自动续期。

示例域名是 `www.example.com`（可选 `example.com`），以截至 2026 年 11 月的 Azure App Service（多租户）为准，门户和 Azure CLI 都能操作。用世纪互联运营的 Azure（俗称 Azure 中国区）的，先看下一节。

## 全球版和世纪互联运营的 Azure 有什么不同

配置 SSL 的位置和命令基本一样，但中国区是另一套独立环境，备案和证书来源都要单独考虑。

- **独立运营**：由世纪互联运营的 Azure 是位于中国境内、物理隔离的独立云实例，由世纪互联旗下的上海蓝云网络科技有限公司独立运营和销售。账户、订阅和门户都和全球版分开，门户地址是 `portal.azure.cn`。
- **CLI 要切换云环境**：Azure CLI 默认连接全球版，操作中国区前先执行 `az cloud set --name AzureChinaCloud`，然后重新 `az login`。下文的 `az webapp` 命令本身不用改。
- **默认域名不同**：中国区应用的默认域名是 `<应用名>.chinacloudsites.cn`，不是 `azurewebsites.net`，下文配置 CNAME 时要相应替换。
- **必须备案并绑定自定义域名**：按 Azure 中国的备案说明，所有在中国大陆运行、涉及域名解析的网站都要做 ICP 备案；在中国区创建 Web 应用后，要立即绑定已完成备案的自定义域名并通过它访问，从互联网访问默认域名会被封堵。所以中国区的 HTTPS 一定是配在自定义域名上的。
- **免费托管证书没有文档**：docs.azure.cn 上的证书文档只列出 Key Vault 导入、上传私有证书和上传公共证书，没有全球版的“创建免费托管证书”章节。同为世纪互联运营的 Azure Front Door 文档则明确写着只支持自带证书。中国区建议直接走第一步里的“上传 PFX”或 Key Vault 路线，证书可以来自国内云厂商、商业 CA 或 Let's Encrypt。

## 前提条件

自定义域名必须已经添加到应用上。

- App Service 应用在 Basic、Standard、Premium 或 Isolated 定价层。
- 已在 **Custom domains**（自定义域）里添加域名：`www.example.com` 用 CNAME 直接指向 `<应用名>.azurewebsites.net`（中国区是 `chinacloudsites.cn`），或者 `example.com` 用 A 记录指向应用的 IP（另加 TXT 验证记录）。
- 根域名不要设置访问限制。
- 如果有 CAA 记录，要允许 DigiCert，可以用 [CAA 检查](https://ssl.sh/zh/tools/caa-checker/) 确认。
- 想用命令行的话，装好 Azure CLI 并 `az login`。

## 第一步：创建免费托管证书

托管证书在门户或 CLI 里都能创建。门户里打开应用 → **Settings → Certificates → Managed certificates → Add certificate**，选择自定义域名，点 Validate，再点 Add（菜单名按英文界面写，中文界面是对应的译名）。也可以用 CLI：

```bash
az webapp config ssl create --resource-group my-rg --name my-app --hostname www.example.com
```

要用自己的证书（中国区建议这样做），改走 **Bring your own certificates (.pfx) → Add certificate**，上传带密码、包含完整证书链的 PFX，导出参数见常见问题。也可以把证书放进 Key Vault 再导入，续期后 App Service 会自动同步。中国区的 Key Vault 地址以 `.vault.azure.cn` 结尾，写自动化脚本时不要照搬全球版的地址。证书来源不限，阿里云、腾讯云签发的证书和 Let's Encrypt 证书都可以先转成 PFX 再上传。

## 第二步：把证书绑定到域名

证书创建后要绑定到域名才会生效。在 **Custom domains** 里为 `www.example.com` 选择 Add binding，选中证书，类型选 SNI SSL。用 CLI 时先按域名查出证书指纹：

```bash
THUMB=$(az webapp config ssl list --resource-group my-rg \
  --query "[?subjectName=='www.example.com'].thumbprint | [0]" -o tsv)
az webapp config ssl bind --resource-group my-rg --name my-app \
  --certificate-thumbprint "$THUMB" --ssl-type SNI
```

没有绑定时，访问域名会看到 `*.azurewebsites.net` 的证书。

## 第三步：强制 HTTPS 并设置最低 TLS 版本

开启“仅 HTTPS”后，App Service 把 HTTP 请求跳转到 HTTPS；最低 TLS 版本设为 1.2 后，更老的协议无法连接：

```bash
az webapp update --resource-group my-rg --name my-app --https-only true
az webapp config set --resource-group my-rg --name my-app --min-tls-version 1.2
```

门户里对应 **Settings → Configuration → General settings** 里的 HTTPS Only（仅 HTTPS）和 Minimum inbound TLS version（最低入站 TLS 版本）。

## 验证

绑定生效后，域名返回自己的证书而不是 `*.azurewebsites.net` 的证书，HTTP 请求跳转到 HTTPS。用 [SSL 证书检查](https://ssl.sh/zh/tools/ssl-checker/) 检查域名，或在终端运行：

```bash
curl ssl.sh/www.example.com
curl -sI http://www.example.com | grep -iE '^(HTTP|location)'
```

在 Azure 里列出证书和到期时间：

```bash
az webapp config ssl list --resource-group my-rg --query "[].{name:subjectName,expires:expirationDate,thumb:thumbprint}" -o table
```

## 自动续期

托管证书会自动续期，App Service 也会自动更新绑定，前提是条件没变：CNAME 仍然直接指向应用，根域名 A 记录仍然指向它，没有 IP 限制挡住验证，CAA 仍然允许 DigiCert。从 Key Vault 导入的证书（包括 App Service 证书）续期后会在 24 小时内同步到应用。上传的 PFX 永远不会自动续期：要上传新证书，用 **Update binding** 换上，再删除旧证书。

2026 年 3 月 15 日起公网证书最长 200 天，2027 年 3 月 15 日起 100 天，手动上传 PFX 的频率会越来越高。全球版优先用托管证书或 Key Vault；中国区用 Key Vault 加自动化脚本，把续期后的证书导入 Key Vault，让 App Service 自己同步。无论哪种，都建议把域名加到 [ssl.sh 监控](https://ssl.sh/zh/monitor/)（开发中）。

## 常见问题排查

- **创建托管证书时验证失败**：CNAME 经过了中间域名（比如 CDN），或者根域名 A 记录指向了别处，改好 DNS 再试。
- **CAA 报错**：允许 DigiCert，见 [CAA 记录阻止签发](https://ssl.sh/zh/errors/caa-record-prevents-issuance/)。
- **浏览器显示的是 *.azurewebsites.net 的证书**：没有添加绑定，见 [NET::ERR_CERT_COMMON_NAME_INVALID](https://ssl.sh/zh/errors/net-err-cert-common-name-invalid/)。
- **PFX 上传被拒**：用 OpenSSL 3 默认参数导出或缺少证书链，按常见问题重新导出，或用 [SSL 格式转换](https://ssl.sh/zh/tools/ssl-converter/) 转换。
- **中国区应用无法通过默认域名访问**：这是备案要求下的正常现象，绑定已备案的自定义域名后再访问。
- **调高最低 TLS 版本后老客户端连不上**：见 [ERR_SSL_VERSION_OR_CIPHER_MISMATCH](https://ssl.sh/zh/errors/err-ssl-version-or-cipher-mismatch/)。
