我尝试自动生成证书签名请求的过程,然后在Windows Server 2012 R2服务器上从CA导入响应,以用作IIS中SSL绑定的证书。我能够生成CSR,然后我将其提供给安全团队,然后安全团队会向我提供一个响应,然后导入但是导致它无法导入。
此服务器位于工作组中。我以为我没有提到AD注册政策。
这是我的过程:
[Version] Signature = "$Windows NT$" [NewRequest] Subject = "C=US,S=California,L=City,O=Company,OU=IT,CN=hostname" Exportable = TRUE KeyLength = 2048 KeySpec = 1 KeyUsage = 0xa0 MachineKeySet = True ProviderName = "Microsoft RSA SChannel Cryptographic Provider" ProviderType = 12 Silent = True SMIME = False RequestType = PKCS10
然后通过执行以下操作将此INF文件转换为CSR .req文件:
certreq.exe -new "C:\inffile.inf" "C:\certreq.req"
REQ文件被发送到安全团队,他们给我一个.CER文件,当手动导入时,实际上会添加三个来自Digicert的证书。我期望的证书以及看起来像是一些中间CA.
这是通过MMC证书管理单元导入时的样子。
如果我通过MMC导入证书,它不会显示在服务器证书下的IIS管理器中,所以我看起来更深一些。我尝试通过这样的IIS管理器完成证书签名请求,证书出现了,我很高兴。
但是,我不能使用GUI,因为我使用的是脚本。
我确认请求是在带有私钥的证书注册请求中。
我确认CSR的公钥和我提供的p7b是相同的。
certutil -dump issuedcert.cer
certutil -dump certreq.req
问题:我从证书注册请求中导出了CSR并查看了公钥。它与issuedcert.cer中的不同。看起来这是问题,但为什么呢?
然后我尝试使用certreq.exe接受响应并且它不起作用。
certreq.exe -accept -machine "C:\issuedcert.cer"
几乎完成了,但没有。我不断收到此错误消息:
答案 0 :(得分:1)
此错误表示certreq无法在证书存储区的“证书注册请求”节点中找到相关的请求对象。
此外,我建议检查证书请求中的公钥是否与颁发的证书中的公钥匹配。您可以使用certutil -dump file.req
命令转储请求文件(将有公钥)和cerutil -dump cert.cer
转储已颁发的证书并比较公钥。对证书存储中的“证书注册请求”节点中的每个对象执行相同操作(主要关注本地计算机上下文),以查找具有匹配公钥的请求对象。
答案 1 :(得分:0)
这是我过去使用的功能:
function AddCertificate(
[string] $MachineName,
[string] $CertString, #String to search for in the Certificate Store to get the correct Thumbprint
[string] $SiteName, #Sitename to bind the certificate to.
[string] $certname, #File name of the certificate
[string] $certPass, #Password for the certificate
[string] $certPath) #path on the machine where this script runs that contains the certificate path needs to not have a Trailing \
{
$Protocol = "https"
$destinationFolder = "c$\temp\pfx-files"
$servers = $MachineName
$session = New-PsSession –ComputerName $servers
$servers | foreach-Object{if(!(Test-Path -path ("\\$_\"+$destinationFolder))) {New-Item ("\\$_\"+$destinationFolder) -Type Directory}}
$servers | foreach-Object{copy-item -force -Path c:\temp\pfx-files\*.* -Destination ("\\$_\"+$destinationFolder)}
$certPath ="c:\temp\pfx-files" +"\"+$certname
Invoke-command -Session $session -ScriptBlock {param($certPass,$certPath) certutil -p $certPass -importpfx ($certPath )}
$servers | foreach-object {Remove-Item -Path (("\\$_\"+$destinationFolder) +"\*.pfx")}
Invoke-Command -session $session {Import-Module WebAdministration}
$isBound = Invoke-Command -session $session {Get-WebBinding }
if (!(Select-String -Pattern "https" -InputObject $isbound -quiet))
{
Invoke-command -Session $session -ScriptBlock {param([string] $S, [string] $Protocol)( New-WebBinding -Name $S -Protocol $Protocol -Port 443 -IPAddress "*" -SslFlags 0)} -ArgumentList $SiteName, $Protocol
Invoke-Command -session $session -ScriptBlock { param([string]$Certstring) $CertShop=Get-ChildItem -Path Cert:\LocalMachine\My | where-Object {$_.subject -like $CertString } | Select-Object -ExpandProperty Thumbprint}
Invoke-Command -Session $session -ScriptBlock {get-item -Path "cert:\localmachine\my\$certShop" | new-item -path IIS:\SslBindings\0.0.0.0!443}
}
Exit-PSSession
}
答案 2 :(得分:0)
Adam,尝试将.cer重命名为.p7b并尝试certreq -accept file.p7b。
Certreq似乎在查找文件扩展名以确定文件类型。根据MS文档,它支持-accept的p7b文件。
答案 3 :(得分:0)
问题可能是您的Windows 2012系统中不信任DigiCert Root CA.尝试将其手动导入LocalMachine商店中的受信任的根颁发机构。
然后我会检查在使用MMC的LocalMachine商店中的证书注册请求中是否仍有请求。
如果有,那么它应该可以正常工作,只需将给定的证书导入LocalMachine / My store(在MMC中名称为Personal)
如果没有请求,则在LocalMachine / My store中导入证书。然后在cmd中运行certutil -store my
。它将遍历LocalMachine / My中的所有证书,显示有关它们的信息并尝试进行加密测试。我假设所有加密测试都会失败。重要的是获取证书的索引(证书以索引0开头)。找到证书的编号,然后使用命令
certutil -repairstore -csp "Microsoft RSA SChannel Cryptographic Provider" {index of the certificate}
这将尝试修复证书和私钥之间的连接。当您再次运行certutil -store my
时,您应该看到加密测试已通过。