我集中管理域控制器,但站点管理员在本地管理自己的数字发送器。我可以通过向导轻松地将带有整个链的 X509 证书(不需要私钥)从 Windows Server 2008 R2 域控制器导出到 p7b 文件:
~~~~~~~~~~~~~~~~~
...5。证书导出向导打开。点击下一步。
在“导出文件格式”对话框中,执行以下操作:
一个。选择加密消息语法标准 – PKCS #7 证书 (.P7B)。
湾。如果可能,选中在证书路径中包含所有证书。
C。点击下一步。
在“要导出的文件”对话框中,单击“浏览”。
在“另存为”对话框中,执行以下操作:
一个。在“文件名”框中,键入 ciroots.p7b。
湾。在保存类型框中,选择 PKCS #7 证书 (*.p7b)。
C。单击保存。
在“要导出的文件”对话框中,单击“下一步”。
在完成证书导出向导页面上,单击完成。
~~~~~~~~~~~~~~~~~
它工作得很好。生成的文件可以很好地导入数字发送器进行身份验证。如果站点管理员尚未导入它们,则它使站点管理员可以访问链中的其他证书。它不需要包含私钥,因为没有它也可以正常工作。
麻烦的是,我需要手动执行此操作,实际上是数十次,每个业务站点一次,因为每个站点都有自己的域控制器,每个域控制器都有自己的证书。必须有一种方法可以自动执行此证书导出(PowerShell w/.NET、certutil.exe 等)。也许使用 System.Security.Cryptography.X509Certificates X509IncludeOption 和 WholeChain 的东西,但我无法让它工作:
$Cert = (dir Cert:\localmachine\my)[0]
# 带有 .p7b 文件扩展名的 PKCS7 证书导出。
$CertCollection = 新对象
System.Security.Cryptography.X509Certificates.X509Certificate2Collection
$证书 | %{[void]$CertCollection.Add($_)}
$Exported_pkcs7 = $CertCollection.Export('Pkcs7')
$out_FileName = $ENV:COMPUTERNAME + ".p7b"
$My_Export_Path = 'd:\CertFiles\' + $out_FileName
Set-Content -path $My_Export_Path -Value $Exported_pkcs7 -encoding Byte
使用此代码,我只获得证书,而不是其链中的其余证书。我不需要整个脚本,只需要复制导出 w/chain 的部分,我已经可以通过 GUI 手动完成。