我最近遇到了Windows 2003的一个问题(显然它也存在于其他版本中),如果SSL / TLS服务器请求客户端证书身份验证并且它具有超过16KB的可信证书DN,Internet Explorer(或任何其他使用schannel.dll的应用程序都无法完成SSL握手。 (简而言之,服务器将消息分成2 ^ 14个字节的块,根据RFC 2246秒.6.2.1,但是Schannel并不是为了支持它而编写的。我得到了Microsoft支持的确认,这是一个Schannel中存在缺陷,他们正在考虑在将来的版本中修复它。)
所以我试图找到一种方法来轻松解析我的可信证书(我使用Apache作为我的服务器,所以它们都是PEM格式)来获得DN的总ASN.1格式长度(这是他们在握手期间通过电线发送的方式),从而看看我是否接近极限。我还没有找到办法做到这一点:OpenSSL asn1parse函数接近,但它似乎没有提供一种方法来获取ASN.1序列只是发行者名称,这是什么我需要。
有什么建议吗?
答案 0 :(得分:3)
由于ASN.1是自描述的,因此编写ASN.1解析器相当容易。您可能知道,ASN.1数据包含值树,其中每个值类型由全局分配的OID(对象ID)标识。您可以在 http://www.geocities.co.jp/SiliconValley-SanJose/3377/asn1JS.html找到包含源代码的免费ASN.1解码器。它;用javascript编写,因此您可以直接在浏览器中使用它。
关于你的确切问题 - 我会:
答案 1 :(得分:0)
openssl asn1parse会这样做,但你需要做一些手动解析来确定发行者序列的开始位置。根据RFC 5280,它是TBSCertificate序列中的第4项(如果是v1证书,可能是第3项),紧跟签名算法。在以下示例中:
0:d=0 hl=4 l= 621 cons: SEQUENCE
4:d=1 hl=4 l= 470 cons: SEQUENCE
8:d=2 hl=2 l= 3 cons: cont [ 0 ]
10:d=3 hl=2 l= 1 prim: INTEGER :02
13:d=2 hl=2 l= 1 prim: INTEGER :02
16:d=2 hl=2 l= 13 cons: SEQUENCE
18:d=3 hl=2 l= 9 prim: OBJECT :sha1WithRSAEncryption
29:d=3 hl=2 l= 0 prim: NULL
31:d=2 hl=2 l= 64 cons: SEQUENCE
33:d=3 hl=2 l= 11 cons: SET
35:d=4 hl=2 l= 9 cons: SEQUENCE
37:d=5 hl=2 l= 3 prim: OBJECT :countryName
42:d=5 hl=2 l= 2 prim: PRINTABLESTRING :US
46:d=3 hl=2 l= 26 cons: SET
48:d=4 hl=2 l= 24 cons: SEQUENCE
50:d=5 hl=2 l= 3 prim: OBJECT :organizationName
55:d=5 hl=2 l= 17 prim: PRINTABLESTRING :Test Certificates
74:d=3 hl=2 l= 21 cons: SET
76:d=4 hl=2 l= 19 cons: SEQUENCE
78:d=5 hl=2 l= 3 prim: OBJECT :commonName
83:d=5 hl=2 l= 12 prim: PRINTABLESTRING :Trust Anchor
97:d=2 hl=2 l= 30 cons: SEQUENCE
99:d=3 hl=2 l= 13 prim: UTCTIME :010419145720Z
114:d=3 hl=2 l= 13 prim: UTCTIME :110419145720Z
129:d=2 hl=2 l= 59 cons: SEQUENCE
发行方DN从偏移31开始,标题长度为2,值长度为64,总长度为66字节。当然,脚本不是那么容易......