受域保护的 pfx 需要啥密码?

Posted

技术标签:

【中文标题】受域保护的 pfx 需要啥密码?【英文标题】:What password does domain-protected pfx require?受域保护的 pfx 需要什么密码? 【发布时间】:2019-01-01 01:31:34 【问题描述】:

我尝试通过 powershell 创建一个自签名代码签名证书,然后通过 Visual Studio 2017 将 .NET 程序集作为 pfx 进行签名。 pfx 使用 -ProtectTo 参数导出为受域保护的证书。代码如下:

$pfxLocation = [System.IO.Path]::Combine([System.Environment]::GetFolderPath("Desktop"),"Certificates\")
New-Item -ItemType Directory -Path $pfxLocation -Force
$certificate = New-SelfSignedCertificate `
               -CertStoreLocation "Cert:\LocalMachine" `
               -FriendlyName "This is a code-signing certificate" `
               -Subject "CN=Me" `
               -Type CodeSigningCert `
               -NotBefore ([System.DateTime]::Today) `
               -NotAfter ([System.DateTime]::Today.AddMonths(6).AddDays(1)) `
               -KeyExportPolicy Exportable
Move-Item -Destination "Cert:\LocalMachine\Root" -Path $certificate.PSPath
$newCertificateLocation = "Cert:\LocalMachine\Root\" + $certificate.Thumbprint
Get-ChildItem $newCertificateLocation | Export-PfxCertificate -FilePath ([System.IO.Path]::Combine($pfxLocation,"certificate.pfx")) -ProtectTo "Domain\Domain group 1", "Domain\Domain group 2"

但是,Visual Studio 仍然需要一个不存在的密码。

来自使用 -ProtectTo 参数指定的域组之一的域用户的密码被拒绝:

那么它要求什么密码,为什么它需要任何密码?因为它是受域保护的,所以它不应该有,这正是我的目标。

更新

基本上,这个想法是使用输出 pfx 进行代码签名与自动构建代理,没有密码是必须的。

【问题讨论】:

此功能必须满足几个要求:1) 必须从 Windows 8 或更高版本或 Windows Server 2012 或更高版本的域成员导出数字证书。 2) 证书客户端必须加入具有可用 Windows Server 2012 域控制器的域。 3)数字证书必须以PKCS#12(PFX)文件格式导出 这里有更多关于这个功能的细节:social.technet.microsoft.com/wiki/contents/articles/… 另外,根据我正在阅读的内容:实际上在导出的 PFX 文件上创建了一个密码,即使该文件被保护到 AD DS 帐户也是如此。这允许 Windows 8 和 Windows Server 2012 之前的客户端计算机访问该文件。 @user1367200 感谢您的关注。您在第一条评论中提到的所有要求都已满足。至于第二条评论,嗯,这很丰富,因为没有办法真正知道这个密码,是吗?基本上,这个想法是通过自动构建使用此证书进行代码签名,几乎没有人工交互,这有点违背了整个目的。 "-ProtectTo 为用户名或组名指定字符串数组,无需任何密码即可访问 PFX 文件的私钥。这需要 Windows Server® 2012 域控制器。密码或此必须指定参数,否则将显示错误。”似乎它不应该要求已识别用户和组的密码。 【参考方案1】:

此导出 PFX 无需密码。通过 GUI 导入时,可以使用空密码。

$cert = @(Get-ChildItem -Path 'Cert:\CurrentUser\My\07BAE0886EECC2019F0AE6CC68FE5C3EA98308F8')[0]
$certBytes = $cert.Export([System.Security.Cryptography.X509Certificates.X509ContentType]::Pfx)
[System.IO.File]::WriteAllBytes('S:\cert.pfx', $certBytes)

【讨论】:

这为我节省了很多时间。 "Export-PfxCertificate" 根据需要屏蔽密码/组。【参考方案2】:

这对你有用吗?

& certutil -v -privatekey certificate.pfx | ? $_ -match "^PFX protected password: ""(?<password>.*)""$" | %  $matches.password 

【讨论】:

以上是关于受域保护的 pfx 需要啥密码?的主要内容,如果未能解决你的问题,请参考以下文章

pfx是啥文件

pfx文件是不是包含根证书

pfx是啥格式的文件啊

如何安全地存储 .pfx 密码以在 MSBuild 中使用?

如何为Amazon ELB SSL使用* .pfx证书

使用 PFX 进行强命名