質問

最近、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 で書かれているので、ブラウザで直接遊ぶことができます。

あなたの正確な質問に関して言えば、私ならこう言います。

  1. 提供されているパーサーを使用するか、別のパーサーを見つけるか、独自のパーサーを作成します
  2. 信頼できる DN の OID を見つけます (仕様を確認するか、提供されている ASN.1 デコーダー ページを使用して証明書をデコードするだけです)。
  3. 上記 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 バイトです。もちろん、これをスクリプト化するのはそれほど簡単ではありません...

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top