2

我最近遇到了 Windows 2003 的一个问题(显然它也存在于其他版本中),如果 SSL/TLS 服务器正在请求客户端证书身份验证并且它具有超过 16KB 的受信任证书 DN、Internet Explorer(或任何其他应用程序)使用 schannel.dll)无法完成 SSL 握手。(简而言之,根据 RFC 2246 sec. 6.2.1,服务器将消息分成 2^14 字节的块,但 Schannel 并未被编写为支持这一点。我已从 Microsoft 支持部门确认这是一个Schannel 中的缺陷,他们正在考虑在未来的版本中修复它。)

所以我试图找到一种方法来轻松解析我的受信任证书(我使用 Apache 作为我的服务器,所以它们都是 PEM 格式)以获得 DN 的总 ASN.1 格式长度(这就是它们在握手期间通过电线发送),从而查看我是否太接近极限。不过,我还没有找到一种方法来做到这一点:OpenSSL asn1parse 函数很接近,但它似乎没有提供一种方法来获取仅针对发行者名称的 ASN.1 序列,这就是我需要。

有什么建议么?

4

2 回答 2

3

由于 ASN.1 是自描述的,因此编写 ASN.1 解析器相当容易。您可能知道,ASN.1 数据包含一个值树,其中每个值类型由一个全局分配的 OID(对象 ID)标识。您可以在以下位置找到带有源代码的免费 ASN.1 解码器:http://www.geocities.co.jp/SiliconValley-SanJose/3377/asn1JS.html。它是用 javascript 编写的,因此您可以直接在浏览器中使用它。

至于你的确切问题 - 我会:

  1. 使用提供的解析器,找到另一个解析器或编写我自己的解析器
  2. 查找受信任 DN 的 OID(检查规范或使用提供的 ASN.1 解码器页面简单地解码证书)
  3. 结合以上两者来提取证书中受信任 DN 的大小。
于 2008-09-17T19:30:18.700 回答
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

Issuer DN 从偏移量 31 开始,标头长度为 2,值长度为 64,总长度为 66 个字节。当然,这不是那么容易编写脚本...

于 2008-10-09T20:38:45.360 回答