2008-09-16 56 views
2

我最近遇到了Windows 2003的問題(顯然它也存在於其他版本中),如果SSL/TLS服務器請求客戶端證書身份驗證,並且它擁有超過16KB的可信證書DN,Internet Explorer(或任何其他使用schannel.dll的應用程序)無法完成SSL握手。 (簡而言之,服務器按照RFC 2246 sec。6.2.1的規定將郵件分成2^14個字節的塊,但Schannel不是爲了支持這一點而編寫的。我已經得到了Microsoft支持人員的確認,這是一個Schannel存在漏洞,並且他們正在考慮在未來版本中修復它。)從PEM文件獲取ASN.1頒發者字符串?

所以我試圖找到一種方法來輕鬆解析通過我的可信證書(我使用Apache作爲我的服務器,所以它們都是以PEM格式),以獲得DN的總ASN.1格式長度(這是在握手期間通過電線發送的方式),從而看看我是否越來越接近極限。不過,我還沒有找到辦法做到這一點:OpenSSL asn1parse函數接近,但它似乎沒有提供一種方法來獲取ASN.1序列僅用於發行者名稱,這就是我需要。

有什麼建議嗎?

+0

這不是一個編程問題,所以它可能會被拒絕 - 可能無法得到答案。 – JasonMichael 2008-09-16 13:54:03

回答

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的大小。
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和具有兩個報頭長度和64的長度值,爲66個字節的總長度。當然,這並不容易編寫腳本......