1. PKI 通用要求
- 完全断开部署必须用 private/internal CA(官方原文:"For fully disconnected deployments: Use a private or internal certificate authority (CA)")
- Disconnected Operations 必须使用 Enterprise CA(Private/Internal CA),不支持自签名证书。
- ❌ 不要用 public CA------air-gapped 下访问 CRL/OCSP 需要联网(官方原文:"Deployments fail if certificates come from a public CA, because internet connectivity is required to access the CRL and Online Certificate Status Protocol (OCSP) services")
- 根 CA 必须被 Azure Local 节点信任(Windows Trusted Root Certification Authorities)。
- 所有证书必须 共享同一条信任链 ,至少 2 年有效期(官方原文:"All certificates should share the same trust chain and have at least a two-year expiration from the day of deployment")
- 所有根证书以 Base64 编码的 X.509 (CER) 格式导出
- Intermediate CA 允许存在,但所有 Endpoint 必须来自同一 PKI Chain
- 断开操作总需要 23 个 ingress 端点证书(官方原文:"Disconnected operations require 23 external certificates for the endpoints it exposes")
- 加上 2 个 management 端点证书
- 每张证书都有具体 Subject/SAN 要求(见下表)
- 所有 Azure Local 节点及 Disconnected Operations 基础设施均必须能够访问 CRL Distribution Point(CDP)(见 §7 详解)
2. Ingress 端点证书清单(23 个,全部必填)
| # | 服务 | 证书 SAN |
|---|---|---|
| 1 | Azure Blob storage | *.blob.<fqdn> |
| 2 | Azure Container Registry | *.edgeacr.<fqdn> |
| 3 | Azure queue storage | *.queue.<fqdn> |
| 4 | Azure Service Bus | *.servicebus.<fqdn> |
| 5 | Azure Table storage | *.table.<fqdn> |
| 6 | Azure Key Vault | *.vault.<fqdn> |
| 7 | Admin management | adminmanagement.<fqdn> |
| 8 | Arc for Server Agent data service | agentserviceapi.<fqdn> |
| 9 | Arc monitor agent | amcs.monitoring.<fqdn> |
| 10 | Arc config data plane (Arc-enabled Kubernetes) | arckubernetesconfig.<fqdn> |
| 11 | Azure Resource Manager | armmanagement.<fqdn> / management.<fqdn> |
| 12 | Public portal catalog apis | catalogapi.<fqdn> |
| 13 | Azure Data Policy | data.policy.<fqdn> |
| 14 | Arc resource bridge data plane | dp.appliances.<fqdn> |
| 15 | Licensing | dp.aszrp.<fqdn> |
| 16 | Front end appliances | frontend.appliances.<fqdn> |
| 17 | Graph | graph.<fqdn> |
| 18 | Arc guest notification service | guestnotificationservice.<fqdn> |
| 19 | Arc for server | his.<fqdn> |
| 20 | Public portal hosting | hosting.<fqdn> |
| 21 | Secure token service | login.<fqdn> |
| 22 | Arc metrics | metricsingestiongateway.monitoring.<fqdn> |
| 23 | Public portal | portal.<fqdn> |
替换
<fqdn>= 你的断开操作 FQDN(例autonomous.cloud.private)
3. Management 端点证书(2 个)
| 证书 | Subject / SAN 要求 |
|---|---|
| Server | Subject 必须 等于 Management IP(如 Subject = 192.168.50.100);可用 FQDN 作为 SAN,前提是 DNS 能解析到该 IP |
| Client | Subject 任意(仅用于标识),例:Subject = ManagementEndpointClientAuth |
放在同一目录:ManagementEndpointsCerts/
4. 生成证书(官方原文脚本)
4.1 Ingress 证书(23 张)
前置条件:在域加入的机器上,用 Domain Admin 账户运行。
$applianceConfigBasePath = "C:\AzureLocalDisconnectedOperations\"
$fqdn = "autonomous.cloud.private"
$IngressEndpointsCertsFolder = 'C:\Certs\IngressEndpointsCerts'
$certPassword = Read-Host 'Password for output certificate file .pfx' -AsSecureString
## 自动化场景:$certPassword = (ConvertTo-SecureString "REPLACEME" -AsPlainText -Force)
$caName = "mycaserver.contoso.com\Contoso-RootCA" # 替换为你的 CA
Import-Module "$applianceConfigBasePath\OperationsModule\Azure.Local.DisconnectedOperations.psd1" -Force
New-ApplianceExternalCertificatesFromCA `
-ExternalFQDN $fqdn `
-OutputFolder $IngressEndpointsCertsFolder `
-CAConfig $caName `
-CertificatePassword $certPassword
该 cmdlet 会:生成 23 个 CSR → 提交 CA → 导出
.pfx(带密码保护)
4.2 Management 证书(2 张)
$applianceConfigBasePath = "C:\AzureLocalDisconnectedOperations\"
$fqdn = "autonomous.cloud.private"
$managementEndpointIp = '192.168.100.25'
$managementEndpointCertsFolder = 'C:\Certs\ManagementEndpointsCerts'
$certPassword = Read-Host 'Password for output certificate file .pfx' -AsSecureString
$caName = "mycaserver.contoso.com\Contoso-RootCA"
Import-Module "$applianceConfigBasePath\OperationsModule\Azure.Local.DisconnectedOperations.psd1" -Force
New-ApplianceManagementCertificatesFromCA `
-ManagementEndpoint $managementEndpointIp `
-OutputFolder $managementEndpointCertsFolder `
-CAConfig $caName `
-CertificatePassword $certpassword
4.3 私钥可导出要求(硬性要求)
⚠️ 重要 :官方 cmdlet 最终输出
.pfx,因此 Endpoint 证书的私钥必须可导出(Exportable)。如果 CA 模板默认不允许私钥导出,部署将无法继续(部署阶段需要读取私钥签名 CSR / 重签 / 重新挂载)。
-
生成前:CA 模板的 Allow private key to be exported 必须勾选
-
生成后:可立即用 PowerShell 验证私钥是否可导出:
pfx = Get-PfxCertificate -FilePath "C:\Certs\IngressEndpointsCerts\*.blob.
.pfx" pfx.HasPrivateKey # 必须为 True
$pfx.PrivateKey.KeyExchangeAlgorithm # 应有有效算法
5. PFX 密码的使用
$certPassword 在两个阶段都要用:
| 阶段 | 用途 |
|---|---|
| 生成阶段 | New-ApplianceExternalCertificatesFromCA / New-ApplianceManagementCertificatesFromCA 的 -CertificatePassword |
| 部署阶段 | Install-Appliance 调用时传入相同密码,解锁 .pfx 用于部署 |
⚠️ 重要 :部署阶段仍需输入相同密码------密码丢失或漂移会导致部署阶段认证失败。建议将密码集中保管在企业密码保险箱,并在部署 runbook 中固定引用。
6. 导出 Root CA
⚠️ 重要格式要求 :Root CA 证书导出格式必须符合以下规范。
6.1 推荐格式
- ✅ CERTIFICATE (.CER) --- Base64 encoded X.509(首选)
- 也接受
.crt/.pem------ 三者都是 Base64 X.509
6.2 不要使用以下格式
- ❌ DER(二进制编码,不被部署工具识别)
- ❌ PFX(含私钥,部署阶段不需要也不应提供 Root CA 私钥)
6.3 导出命令(PowerShell)
$applianceRootcert = "C:\AzureLocalDisconnectedOperations\applianceRoot.cer"
# 使用 Export-Certificate 输出 Base64 编码的 X.509 (.cer)
Get-ChildItem Cert:\LocalMachine\Root |
Where-Object { $_.Subject -match "YourRootCA" } |
Select-Object -First 1 |
Export-Certificate -Type CERT -FilePath $applianceRootcert
这一份单独保存------后续部署时,每台 Azure Local 节点都要导入。
7. CRL Distribution Point(CDP)可达性(硬性要求)
7.1 访问对象(不是仅 Cluster)
⚠️ 官方硬要求 :所有以下 Disconnected Operations 基础设施组件都必须能够访问 CDP:
- Appliance VM
- Kubernetes(Arc-enabled Kubernetes / AKS Arc)
- Control Plane
- Azure Local 节点
因此"cluster 内所有节点必须能访问"范围过窄 ------Appliance VM / Control Plane / K8s 都不在 cluster 内 ,但同样需要访问 CDP。
7.2 部署前验证 CRL 可达
官方 known-issues 多次强调 Bootstrap fails if CRL is empty or misconfigured------部署前必须主动验证:
# 单节点验证 CRL 可达性(任选一张已签发的证书)
$certPath = "C:\Certs\IngressEndpointsCerts\portal.<fqdn>.pfx"
certutil -urlfetch -verify $certPath
# 期望:"CDP ..." 显示 Verified
如果验证失败,不要进入部署阶段------失败链路包括:
| 现象 | 根因 |
|---|---|
CDP not reachable |
DNS / 路由 / 防火墙阻断 |
CDP empty |
CA 模板未启用 CRL 发布 |
CDP timeout |
防火墙规则 / 带宽 / 证书链不完整 |
7.3 网络层检查
- DNS 能解析 CDP host
- TCP 80(HTTP CRL)或 443(HTTPS CRL)能从所有节点到达 CDP
- 如启用 HTTPS CRL,证书链完整、信任 Root CA
8. 时间同步要求(硬性要求)
⚠️ 重要 :证书验证依赖准确的 UTC 时间。Known Issues 中多次出现因时钟漂移导致的证书验证失败案例。
部署前必须确保:
- 所有 Azure Local 节点
- 管理终端(PowerShell / Portal 操作机)
- CA 服务器
- Appliance VM
之间时间同步。
8.1 指向同一时间源
完全 air-gapped 模式下:
# 每节点
w32tm /config /manualpeerlist:"<internal-time-server>" /syncfromflags:manual /reliable:yes /update
net stop w32time
net start w32time
w32tm /resync /rediscover
w32tm /query /peers
8.2 部署前再校验
# 多节点时间偏差检查
$nodes = @("azlocal-1","azlocal-2","azlocal-3")
foreach ($n in $nodes) {
Invoke-Command -ComputerName $n -ScriptBlock { (Get-Date).ToUniversalTime() }
}
# 任意两节点偏差 > 5 分钟 → 排除后再部署
9. 部署前 PKI Checklist
9.1 必做项
- 已识别/创建企业 CA 或内部 CA
- CA 证书满足 Microsoft Trusted Root Program
- CA 模板已启用私钥导出(Allow private key to be exported)
- 所有节点、Appliance VM、Control Plane、K8s 均能访问 CDP (用
certutil -urlfetch -verify验证) - 所有节点、CA、Appliance VM 时钟同步(偏差 ≤ 5 分钟)
- 已生成 23 张 ingress 证书 ,全部在
IngressEndpointsCerts/ - 已生成 2 张 management 证书 ,全部在
ManagementEndpointsCerts/ - 证书 Subject/SAN 严格按 §2 §3 表格填写
- 证书有效期 ≥ 2 年
- 根 CA 证书已 Base64 X.509 (.cer) 导出(不是 DER、不是 PFX)
- 知道 CA 的
CAConfig字符串(certutil -config - -ping获取)
9.2 部署阶段必带
- 23+2 张 .pfx
- .pfx 解锁密码(与生成时一致)
- Root CA .cer