Jim*_*ham 10 ssl certificate iis-7 openssl
我有特权每周处理约 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
...
...
Run Code Online (Sandbox Code Playgroud)
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:
Run Code Online (Sandbox Code Playgroud)
Andreas Klein 在 MSDN 博客上的这篇文章表明 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
Run Code Online (Sandbox Code Playgroud)
我可以使用“openssl base64”来解码文件,在生成的二进制文件中,我可以看到看起来像 CSR 的字符串,以及一些必须来自基于旧证书的签名的 CA 引用。所以容器(CSR,签名)的想法听起来似乎有道理。
但是我仍然找不到阅读其中的 CSR 的方法!我尝试了很多东西,我不会在这里列出细节,但这里是我尝试过的最重要的变化点:pkcs12 pkcs7 PEM DER req x509 verify ...
不幸的是,我不能在这里发布 CSR 本身。谁能帮我找出阅读/验证此文件的方法?
这个 IIS7 更新请求的结构实际上是相当优雅的。似乎是从前提开始的,因为这是更新当前证书的请求,所以需要证明该请求来自正确的主机——即实际使用当前证书的主机 & ? 拥有关联的私钥。在 Internet 世界中,您可以通过以原始用户身份向 CA 进行身份验证来证明您可以请求证书续订,而不是创建签名的 CSR。
为了证明发出续订请求的权利,IIS7 会创建一个普通的 CSR(PKCS#10 对象),然后对其进行签名,并提供对其进行签名的密钥的证书。
用openssl asn1parse -in iis7rcsr -i看文件的结构,并比较这对正常的客户服务代表。您应该在开头附近看到一个 OCTET STRING,在标记为“:pkcs7-data”的对象中,这是您需要提取以获得 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...
Run Code Online (Sandbox Code Playgroud)
为了从这里获得实际的 PKCS#10 CSR,我们需要偏移量,在本例中为“58”。然后我们可以使用该偏移量来提取该对象的二进制版本:-
$ openssl asn1parse -in iis7rcsr -strparse 58 -out thecsr -noout
Run Code Online (Sandbox Code Playgroud)
接下来,我们可以使用 读取输出文件“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
...
Run Code Online (Sandbox Code Playgroud)
我可以将所有这些都打包到一个没有临时文件的命令行中(但遗憾的是对原始证书进行了 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):
...
Run Code Online (Sandbox Code Playgroud)
这个长命令行直接相当于openssl req -in non-iis7rcsr -noout -text我通常使用的简单:-)
| 归档时间: |
|
| 查看次数: |
6312 次 |
| 最近记录: |