powershell - 无需外部工具,自动将带链的 x509 证书从 Server 2008 R2 导出到 p7b 文件?

标签 powershell x509 pkcs#7 certutil

我集中管理域 Controller ,但站点管理员在本地管理他们自己的数字发送器。我可以通过向导轻松地将包含整个链的 X509 证书(不需要私钥)从 Windows Server 2008 R2 域 Controller 导出到 p7b 文件:

~~~~~~~~~~~~~~~~~~

...5.证书导出向导打开。点击下一步。

  • 在“导出文件格式”对话框中,执行以下操作:

    一种。选择加密消息语法标准 – PKCS #7 证书 (.P7B)。

    湾如果可能,请选中在证书路径中包含所有证书。

    C。点击下一步。
  • 在要导出的文件对话框中,单击浏览。
  • 在另存为对话框中,执行以下操作:

    一种。在文件名框中,键入 ciroots.p7b。

    湾在保存类型框中,选择 PKCS #7 证书 (*.p7b)。

    C。单击保存。
  • 在要导出的文件对话框中,单击下一步。
  • 在“完成证书导出向导”页面上,单击“完成”。

  • ~~~~~~~~~~~~~~~~~~

    它工作得很好。生成的文件可以很好地导入到数字发送器中进行身份验证。它使站点管理员可以访问链中的其他证书(如果他们尚未导入)。它不需要包含私钥,因为没有它它也能正常工作。

    问题是,我需要手动执行此操作,实际上是数十次,每个业务站点一次,因为每个站点都有自己的域 Controller ,每个域 Controller 都有自己的证书。必须有一种方法可以自动执行此证书导出(PowerShell w/.NET、certutil.exe 等)。也许使用 System.Security.Cryptography.X509Certificates X509IncludeOption 和 WholeChain 的东西,但我无法让它工作:

    $Cert = (dir Cert:\localmachine\my)[0]

    # PKCS7 证书导出文件扩展名为 .p7b。

    $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 手动完成。

    最佳答案

    您需要构建证书链以获取链证书并将它们添加到集合中:

    function Export-Certificate {
    [CmdletBinding()]
        param(
            [Parameter(Mandatory = $true)]
            [Security.Cryptography.X509Certificates.X509Certificate2]$Certificate,
            [Parameter(Mandatory = $true)]
            [IO.FileInfo]$OutputFile,
            [switch]$IncludeAllCerts
        )
        $certs = New-Object Security.Cryptography.X509Certificates.X509Certificate2Collection
        if ($IncludeAllCerts) {
            $chain = New-Object Security.Cryptography.X509Certificates.X509Chain
            $chain.ChainPolicy.RevocationMode = "NoCheck"
            [void]$chain.Build($Certificate)
            $chain.ChainElements | ForEach-Object {[void]$certs.Add($_.Certificate)}
            $chain.Reset()
        } else {
            [void]$certs.Add($Certificate)
        }
        Set-Content -Path $OutputFile.FullName -Value $certs.Export("pkcs7") -Encoding Byte
    }
    

    关于powershell - 无需外部工具,自动将带链的 x509 证书从 Server 2008 R2 导出到 p7b 文件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33512409/

    相关文章:

    c++ - MS OPM(输出保护管理器)初始化 X509 链

    java - 将 Bouncy CasSTLe 证书转换为 Java

    powershell - Try-catch 问题 powershell

    Powershell 7 导入模块不会跨 session 持续存在

    go - crypto/tls软件包中的自定义VerifyPeerCertificate

    c++ - 如何使用 openssl 或任何其他带有智能卡签名的库创建 PKCS7 signedData 结构?

    ruby-on-rails - 在Ruby/Rails中,如何解密由PKCS7加密和签名的字符串

    c# - EnvelopedCms 解密不适用于 Azure Key Vault

    html - powershell ConvertTo-Html 添加类

    c# - Powershell或C#:使用CSV数据将文件从一个位置复制到另一位置