2015-11-04 62 views
1

我集中管理域控制器,但是站点管理员在本地管理他们自己的数字发送器。我可以很容易地从Windows Server 2008 R2域控制器通过向导导出X509证书(不需要私钥),用整条产业链的P7B文件:无需外部工具,自动导出x509证书w /链从Server 2008 R2到p7b文件?

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

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

  • 在导出文件格式对话框,执行下列操作:

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

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

    c。点击下一步。

  • 在要导出的文件对话框中,单击浏览。

  • 在另存为对话框中,执行以下操作:

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

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

    c。点击保存。

  • 在要导出的文件对话框中,单击下一步。

  • 在完成证书导出向导页面上,单击完成。

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

    它的伟大工程。生成的文件可以很好地导入数字发送器进行验证。如果网站管理员尚未导入它们,它可以让网站管理员访问链中的其他证书。它不需要包含私钥,因为没有它就可以正常工作。

    麻烦的是,我需要为每个企业站点手动完成数十次,因为每个站点都有自己的域控制器,每个都有自己的证书。必须有一种方法可以自动执行此证书导出(PowerShell w/.NET,certutil.exe等)。也许一些使用System.Security.Cryptography.X509Certificates X509IncludeOption与WholeChain,但我不能得到它的工作:

    $证书=(DIR证书:\ LOCALMACHINE \我的)[0]

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

    $ CertCollection =新物体

    System.Security.Cryptography.X509Certificates.X509Certificate2Collection

    $证书| %{[void] $ CertCollection.Add($ _)}

    $ Exported_pkcs7 = $ CertCollection。导出( 'PKCS7')

    $ out_FileName = $ ENV:计算机+ “的.p7b”

    $ My_Export_Path = 'd:\ CertFiles \' + $ out_FileName

    集内容-path $ My_Export_Path -Value $ Exported_pkcs7 -encoding字节

    使用此代码,我只获取证书,而不是其链中的证书。我不需要整个脚本,只需要复制导出w /链的部分,我已经可以通过GUI手动完成了。

    回答

    2

    需要构建证书链获取证书链,并将它们添加到收藏:

    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 
    } 
    
    +0

    的同事,想出了非常相似的一些工作,正因为如此,在这个优先下降,但这是在我的待办事项列表中,以完全按照您的方式进行尝试,看看我的同事的方法是否有任何差异。谢谢CryptoGuy。 – JCSunday