如何使用OpenSSL验证/阅读IIS7 SSL更新CSR


10

我有幸每周处理大约5个SSL CSR,然后将其传递给我们的CA进行检查,以检查其有效性。我在Ubuntu机器上使用OpenSSL来检查它们是否有效,测试诸如正确的OU名称,合理的CN,密钥大小> = 2048位等内容,因为我们的请求有时不正确。

前几天,我收到来自IIS7计算机的续订请求。我完全不知道如何使用OpenSSL来阅读此内容。这是有效的,因为我的CA已接受它...

“ file(1)”表示这是“ RFC1421安全证书签名请求文本”,这是我在这里大约50%的CSR(其余为“ PEM证书请求”)所说的内容。

$ head iis7rcsr
-----BEGIN NEW CERTIFICATE REQUEST-----
MIIQsQYJKoZIhvcNAQcCoIIQojCCEJ4CAQExCzAJBgUrDgMCGgUAMIIJegYJKoZI
hvcNAQcBoIIJawSCCWcwggljMIIIzAIBADCB2zELMAkGA1UEBhMCTloxDTALBgNV
BBEMBDkwNTQxDjAMBgNVBAgMBU90YWdvMRAwDgYDVQQHDAdEdW5lZGluMRwwGgYD
...
...

openssl req,它读取CSR(PKCS#10)无法理解它...

$ openssl req -in iis7rcsr -text
unable to load X509 request
5156:error:0D0680A8:asn1 encoding routines:ASN1_CHECK_TLEN:wrong tag:tasn_dec.c:1316:
5156:error:0D07803A:asn1 encoding routines:ASN1_ITEM_EX_D2I:nested asn1 error:tasn_dec.c:380:Type=X509_REQ_INFO
5156:error:0D08303A:asn1 encoding routines:ASN1_TEMPLATE_NOEXP_D2I:nested asn1 error:tasn_dec.c:748:Field=req_info, Type=X509_REQ
5156:error:0906700D:PEM routines:PEM_ASN1_read_bio:ASN1 lib:pem_oth.c:83:

来自MSDN博客上的Andreas Klein的这篇文章建议IIS7更新CSR是PKCS#7容器,具有基于当前证书的CSR和签名...但是我仍然看不到它。

$ openssl pkcs7 -in iis7rcsr -text
unable to load PKCS7 object
6581:error:0906D06C:PEM routines:PEM_read_bio:no start line:pem_lib.c:650:Expecting: PKCS7

我可以使用“ openssl base64”对文件进行解码,并且在生成的二进制文件中,我可以看到类似于CSR的字符串,以及一些CA引用,这些引用必须来自基于旧证书的签名。因此,容器(CSR,签名)的想法听起来很合理。

但是我仍然找不到找到其中的CSR的方法!我已经尝试了很多事情,在这里我不会列出详细信息,但是这里是我尝试过的最高点:pkcs12 pkcs7 PEM DER req x509 verify ...

不幸的是,我不能在此发布企业社会责任。谁能帮助我找出一种读取/验证此文件的方式?


该请求是否偶然包含寻找主题备用名称的属性?
Shane Madden

我对此表示怀疑-这是针对具有单个名称的内部服务器的。当然,我们返回的证书通常在SAN字段中带有“ www”。强行插入,但我们可以接受!
Jim Cheetham

Windows计算机上的certutil将读取此证书,并将其描述为PKCS7消息,其中包含PKCS10证书请求(包含来自旧CA的x509证书)和一个证书链,其中包含另一个x509证书。'certutil -split'分解了这些部分,Blob0_1.p10是我希望找到的CSR(DER格式)。因此,我越来越近了……是的,请求中有一个SAN字段,这可能是强制插入“ www”的结果。去年我们获得原始证书的时候……
Jim Cheetham

1
openssl asn1parse可以读取请求,然后从中提取正常的CSR。我尚无法自我解答(解决速度太快),所以我将使用解决方案更新问题,然后明天进行解决:-)
Jim Cheetham

很好,很好找到!
Shane Madden

Answers:


8

IIS7续订请求的结构实际上非常优雅。似乎从前提开始,因为这是续订当前证书的请求,因此需要证明该请求来自正确的主机-即,实际上正在使用当前证书的主机&拥有相关的私有证书。键。在Internet世界中,通过向CA作为原始用户进行身份验证,而不是创建签名的CSR,可以证明您被允许请求证书的续订。

为了证明发出续签请求的权利,IIS7创建了一个普通的CSR(PKCS#10对象),然后对其进行签名,并提供对其进行签名的密钥的证书。

  • IIS7更新CSR
    • PKCS#7数据
      • PKCS#10数据(普通CSR)
    • 普通服务器证书
    • 颁发CA数据
    • RSA签名(我假设)

openssl asn1parse -in iis7rcsr -i看文件的结构,并比较这对正常的客户服务代表。您应该在标有“:pkcs7-data”的对象的开头附近看到一个OCTET STRING,这是您提取以获取CSR所需要的。

$ openssl asn1parse -in iis7rcsr -i
0:d=0  hl=4 l=4273 cons: SEQUENCE          
4:d=1  hl=2 l=   9 prim:  OBJECT            :pkcs7-signedData
15:d=1  hl=4 l=4258 cons:  cont [ 0 ]        
19:d=2  hl=4 l=4254 cons:   SEQUENCE          
23:d=3  hl=2 l=   1 prim:    INTEGER           :01
26:d=3  hl=2 l=  11 cons:    SET               
28:d=4  hl=2 l=   9 cons:     SEQUENCE          
30:d=5  hl=2 l=   5 prim:      OBJECT            :sha1
37:d=5  hl=2 l=   0 prim:      NULL              
39:d=3  hl=4 l=2426 cons:    SEQUENCE          
43:d=4  hl=2 l=   9 prim:     OBJECT            :pkcs7-data
54:d=4  hl=4 l=2411 cons:     cont [ 0 ]        
58:d=5  hl=4 l=2407 prim:      OCTET STRING      [HEX DUMP]:3082096330820...

为了从此处获得实际的PKCS#10 CSR,在此示例中,我们需要该偏移号“ 58”。然后我们可以使用该偏移量提取该对象的二进制版本:

$ openssl asn1parse -in iis7rcsr -strparse 58 -out thecsr -noout

接下来,我们可以使用读取输出文件'thecsr' openssl req,记住要指定输入格式DER。

$ openssl req -in thecsr -inform DER -text -noout
Certificate Request:
Data:
    Version: 0 (0x0)
    Subject: (normal CSR Subject: line, censored)
    Subject Public Key Info:
        Public Key Algorithm: rsaEncryption
...

我可以将所有这些打包成一个没有临时文件的命令行(但是可悲的是读取原始证书2次),只要我可以使用Linux /proc/self/fd/来欺骗openssl(它将使用带有文件描述符的本机技巧来处理密码,但是输出不正常)。

$ openssl asn1parse -in iis7rcsr -strparse $(openssl asn1parse -in iis7rcsr | grep -A2 ':pkcs7-data'|tail -1|cut -d: -f1) -out /dev/stdout -noout | openssl req -inform DER -noout -text

Certificate Request:
Data:
    Version: 0 (0x0)
    Subject: (Subject: line censored again)
    Subject Public Key Info:
        Public Key Algorithm: rsaEncryption
        RSA Public Key: (1024 bit)
            Modulus (1024 bit):
...

这个长长的命令行直接相当于openssl req -in non-iis7rcsr -noout -text我通常使用的简单方法:-)



2

感谢Jim提供的非常有用的出色信息,我在尝试续订w2008 / IIS7服务器证书时遇到了同样的问题。

我只想添加一件事。您可以使用以下命令直接提取P10格式的CSR: certutil -split iis7rcsr (iis7rcsr是通过IIS管理器获取的.csr)。然后将csr解压缩到名为blob0_1.p10 It's的二进制格式(DER)的文件中,您可能必须使用以下命令在base64中对其进行编码: certutil -encode blob0_1.p10 finalcsr.csr

不过,还有最后一个问题。然后,我发现,使用openssl转储.csr内容时,续订过程会自动强制使用1024位密钥(即使在服务器上为服务器证书创建的原始私钥的长度为2048位)。看来您无法通过IIS7的更新过程来强制使用2048位密钥。

唯一好的选择似乎是创建一个新的密钥/证书,而不使用更新过程。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.