导入证书

时间:2015-10-14 15:10:32

标签: iis ssl ssl-certificate

我尝试自动生成证书签名请求的过程,然后在Windows Server 2012 R2服务器上从CA导入响应,以用作IIS中SSL绑定的证书。我能够生成CSR,然后我将其提供给安全团队,然后安全团队会向我提供一个响应,然后导入但是导致它无法导入。

此服务器位于工作组中。我以为我没有提到AD注册政策。

这是我的过程:

  1. 在相关服务器上使用certreq.exe生成CSR。生成的INF文件如下所示:
  2. [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证书管理单元导入时的样子。

    enter image description here

    如果我通过MMC导入证书,它不会显示在服务器证书下的IIS管理器中,所以我看起来更深一些。我尝试通过这样的IIS管理器完成证书签名请求,证书出现了,我很高兴。

    enter image description here

    但是,我不能使用GUI,因为我使用的是脚本。

    我确认请求是在带有私钥的证书注册请求中。

    enter image description here

    我确认CSR的公钥和我提供的p7b是相同的。

    certutil -dump issuedcert.cer
    certutil -dump certreq.req
    

    问题:我从证书注册请求中导出了CSR并查看了公钥。它与issuedcert.cer中的不同。看起来这是问题,但为什么呢?

    然后我尝试使用certreq.exe接受响应并且它不起作用。

    certreq.exe -accept -machine "C:\issuedcert.cer"
    

    几乎完成了,但没有。我不断收到此错误消息:

    enter image description here

4 个答案:

答案 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时,您应该看到加密测试已通过。