我有幸每周处理5个SSL CSR,在将它们传递给我们的CA之前检查其有效性。 我在Ubuntu机器上使用OpenSSL来检查它们是否有效,testing诸如正确的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 Kleinbuild议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的string,一些CA引用必须来自基于旧证书的签名。 所以容器(CSR,签名)的想法听起来似乎合理。
但是我仍然无法find阅读里面的CSR的方法! 我已经尝试了很多东西,我不会在这里列出细节,但这里是我试过的变化的高点:pkcs12 pkcs7 PEM DER req x509validation…
不幸的是,我不能在这里发布CSR。 任何人都可以帮助我找出一种阅读/validation这个文件的方法吗?
这个IIS7更新请求的结构其实挺雅致的。 似乎从这个前提开始,因为这是更新当前证书的请求,它需要certificate请求来自正确的主机 – 即实际使用当前证书的主机,并且拥有关联的私有键。 在互联网世界中,您certificate您可以通过向您的CA以原始用户身份进行身份validation来请求续订证书,而不是创build签名的CSR。
为了certificate发布续订请求的权利,IIS7创build一个正常的CSR(PKCS#10对象),然后对其进行签名,并提供签名的密钥的证书。
使用openssl asn1parse -in iis7rcsr -i查看文件的结构,并将其与正常的CSR进行比较。 您应该在开头附近看到一个“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...
为了得到实际的PKCS#10 CSR,我们需要这个例子中的偏移号“58”。 然后,我们可以使用该偏移来提取该对象的二进制版本: –
$ openssl asn1parse -in iis7rcsr -strparse 58 -out thecsr -noout
接下来,我们可以用openssl req读取输出文件“thecsr”,记住指定input格式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 ...
只要我能用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 🙂
感谢Jim对这个非常有帮助的优秀信息,我尝试更新w2008 / IIS7服务器证书时遇到了完全相同的问题。
我只会添加一件事。 您可以使用以下命令直接提取P10格式的CSR: certutil -split iis7rcsr (iis7rcsr是您通过IISpipe理器获取的.csr)。 然后将csr解压缩到名为blob0_1.p10的文件中。它是二进制格式(DER),您可能必须使用以下命令将其编码为base64: certutil -encode blob0_1.p10 finalcsr.csr
尽pipe如此,还有一个最后的问题。 然后我发现,使用openssl转储.csr内容,即更新过程自动强制使用1024位密钥(即使在服务器上为服务器证书创build的原始私钥为2048位长度)。 看来你不能强制使用IIS7的更新过程使用2048位密钥。
唯一不错的select似乎是创build一个新的密钥/证书,而不是使用更新过程。