PEM ファイルから ASN.1 発行者文字列を取得しますか?
質問
最近、Windows 2003 に関する問題に遭遇しました (他のバージョンにも存在するようです)。SSL/TLS サーバーがクライアント証明書認証を要求しており、信頼できる証明書 DN が 16 KB を超えている場合、Internet Explorer (またはその他のアプリ) schannel.dll を使用する) は、SSL ハンドシェイクを完了できません。(一言で言えば、RFC 2246 秒に従って、サーバーはメッセージを 2^14 バイトのチャンクに分割します。6.2.1 ですが、Schannel はそれをサポートするように書かれていませんでした。Microsoft サポートから、これは Schannel の欠陥であり、将来のリリースで修正することを検討しているという確認を得ました。)
そこで、信頼できる証明書 (サーバーとして Apache を使用しているため、すべて PEM 形式です) を簡単に解析して、DN の ASN.1 形式の合計長を取得する方法を見つけようとしています (これが方法です)それらはハンドシェイク中に回線経由で送信されます)、それによって制限に近づきすぎているかどうかを確認します。ただし、これを行う方法はまだ見つかりません。OpenSSL の asn1parse 関数はそれに近いものですが、私が必要としている、発行者名だけの ASN.1 シーケンスを取得する方法を提供していないようです。
助言がありますか?
解決
ASN.1 は自己記述型であるため、ASN.1 パーサーを作成するのは非常に簡単です。おそらくご存知のとおり、ASN.1 データには値のツリーが含まれており、各値のタイプはグローバルに割り当てられた OID (オブジェクト ID) によって識別されます。ソース コード付きの無料の ASN.1 デコーダーは次の場所にあります。 http://www.geocities.co.jp/SiliconValley-SanJose/3377/asn1JS.html. 。JavaScript で書かれているので、ブラウザで直接遊ぶことができます。
あなたの正確な質問に関して言えば、私ならこう言います。
- 提供されているパーサーを使用するか、別のパーサーを見つけるか、独自のパーサーを作成します
- 信頼できる DN の OID を見つけます (仕様を確認するか、提供されている ASN.1 デコーダー ページを使用して証明書をデコードするだけです)。
- 上記 2 つを組み合わせて、証明書内の信頼できる DN のサイズを抽出します。
他のヒント
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 バイトです。もちろん、これをスクリプト化するのはそれほど簡単ではありません...