用于将证书安装到Active Directory存储库的Powershell脚本

时间:2014-02-20 00:42:44

标签: powershell ssl active-directory certificate

我正在尝试编写一个powershell脚本来将证书安装到活动目录证书库中,

以下是手动执行此操作的步骤,非常感谢任何帮助。

在Windows 2008R2域控制器上,

点击开始 - >运行

输入MMC

点击确定

点击文件 - >添加/删除管理单元

选择“证书” - >添加

选择“服务帐户”

单击“下一步”

选择“本地计算机”

单击“下一步”

选择“Active Directory域服务”

单击“完成”

单击确定

我希望脚本将证书安装到:

NTDS \个人

我会发布一张图片但显然没有足够的“声誉”,所以我只能提供文字说明。

基本上我尝试过的是,我使用下面的powershell函数将证书导入本地机器 - >个人商店,大多数证书都在这里,代码可以运行。

但我需要将证书安装到域控制器上的“NTDS \ Personal”存储中,但$ certRootStore只接受localmachine或CurrentUser,所以我卡住了:/

function Import-PfxCertificate 
{
    param
    (
        [String]$certPath,
        [String]$certRootStore = "localmachine",
        [String]$certStore = "My",
        $pfxPass = $null
    ) 
    $pfx = new-object System.Security.Cryptography.X509Certificates.X509Certificate2 

    if ($pfxPass -eq $null) 
    {
        $pfxPass = read-host "Password" -assecurestring
    } 

    $pfx.import($certPath,$pfxPass,"Exportable,PersistKeySet") 

    $store = new-object System.Security.Cryptography.X509Certificates.X509Store($certStore,$certRootStore) 
    $store.open("MaxAllowed") 
    $store.add($pfx) 
    $store.close() 
}

Import-PfxCertificate -certPath "d:\Certificate.pfx"

关心Alex

3 个答案:

答案 0 :(得分:1)

好吧,首先是坏消息。唯一的托管证书存储区是LocalMachineCurrentUser,正如我们在powershell中看到的那样。

现在,这不是坏消息。我们知道 ADDS服务器上的注册表中存在“物理”位置存储(物理是MS'字,而不是我的),HKLM \ Software \ Microsoft \ Cryptography \ Services \ NTDS \ SystemCertificates。

双重验证了这一点
  1. 使用mmc管理单元将证书导入商店时使用procmon

  2. this nugget

  3. 清除msdn

    #2中的链接显示服务的所有实体存储都存储在上述路径中,用NTDS代替。 真实的服务名称,而不是显示名称。

    然而,

    enter image description here

    因为坏消息。试图用powershell映射它作为根目录,-PSProvider Certificate将会令人失望,这是我尝试的第一件事。

    可以尝试的是使用X509Store构造函数,它将IntPtr带到SystemStore,as described here。是的,这会调用一些非托管代码,混合这两个代码是我很少做的事情,但是this和谷歌搜索 HCERTSTORE C#会让你到那里。

答案 1 :(得分:0)

结合使用以上内容和两个证书的注册表项来存储此文件。

唯一的另一件事是,当证书存储中有多个证书时,我不知道NTDS如何确定要使用哪个证书。

function Import-NTDSCertificate {
    [CmdletBinding()]
    param(
        [Parameter(Mandatory)]
        [string]$PFXFile,

        [Parameter(Mandatory)]
        [string]$PFXPassword,

        #Remove certificate from LocalMachine\Personal certificate store
        [switch]$Cleanup
        )
        begin{
            Write-Verbose -Message "Importing PFX file."
            $PFXObject = New-Object -TypeName System.Security.Cryptography.X509Certificates.X509Certificate2
            $PFXObject.Import($PFXFile,$PFXPassword,[System.Security.Cryptography.X509Certificates.X509KeyStorageFlags]::Exportable)

            $thumbprint = $PFXObject.Thumbprint
        }
        process{
            Write-Verbose -Message "Importing certificate into LocalMachine\Personal"
            $certificateStore = New-Object -TypeName System.Security.Cryptography.X509Certificates.X509Store('My','LocalMachine')
            $certificateStore.Open('MaxAllowed')
            $certificateStore.Add($PFXObject)
            $certificateStore.Close()

            Write-Verbose -Message "Copying certificate from LocalMachine\Personal to NTDS\Personal"
            $copyParameters = @{
                'Path' = "HKLM:\Software\Microsoft\SystemCertificates\MY\Certificates\$thumbprint"
                'Destination' = "HKLM:\SOFTWARE\Microsoft\Cryptography\Services\NTDS\SystemCertificates\My\Certificates\$thumbprint"
                'Recurse' = $true
            }
            Copy-Item @copyParameters
        }
        end{
            if ($Cleanup){
                Write-Verbose -Message "Removing certificate from LocalMachine\Personal"
                $removalParameters = @{
                    'Path' = "HKLM:\SOFTWARE\Microsoft\SystemCertificates\MY\Certificates\$thumbprint"
                    'Recurse' = $true
                }
                Remove-Item @removalParameters
            }
        }
}

答案 2 :(得分:0)

尽管该帖子已有多年历史,但它仍然很有帮助并且会出现在搜索中,因此,请解决以下问题:“当证书存储区中存在多个证书时,我不知道NTDS如何确定要使用哪个证书”,答案是,当安装了两个或多个符合要求条件的有效证书时,您将得到不可靠的结果,因此建议删除旧的/不需要的证书,而仅将最新/最好的证书留给服务器进行身份验证。