Azure Local离线模式PKI规划(系列篇之五)

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

详见 deploy-prepare.md §10

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
相关推荐
春日见10 小时前
E2E自驾JD理解
人工智能·深度学习·算法·microsoft·transformer
编码者卢布1 天前
【Azure Storage Account】跨存储账号复制 Blob 会产生大量网络流量费用吗?
microsoft·flask·azure
Data-Miner17 天前
大语言模型+智能体AI,122页PPT详解落地应用培训!
人工智能·microsoft·语言模型
c++之路17 天前
备忘录模式(Memento Pattern)
c++·microsoft
Solis程序员17 天前
MCP (Model Context Protocol):AI应用连接外部世界的标准协议
人工智能·microsoft·agent·skill·mcp
诺未科技_NovaTech17 天前
上海诺未携手惠灵顿中国,基于微软 Azure 打造 AI 教育生态标杆
人工智能·microsoft·azure·ai教育
hnult17 天前
在线笔试平台如何选型?考试云九重防作弊 + 六大 AI 能力 智能招聘笔试解决方案
人工智能·笔记·microsoft·信息可视化·课程设计
步步为营DotNet17 天前
Blazor 与 Microsoft.Extensions.AI 在客户端性能优化中的协同应用
人工智能·microsoft·性能优化
hai31524754318 天前
九章编程法 · 猜数字游戏 (GW-BASIC 重构版) *
人工智能·microsoft·游戏引擎·游戏程序