5

C-land OpenSSL を使用して X509 証明書のドメインを検証する必要があります。

私の理解では、ライブラリはこれを実行しないため、次のアルゴリズムを大まかに実装する必要があります。

  1. subjectAlternativeName 拡張機能の dnsName フィールドが存在する場合は、nameその値に設定します。
  2. nameそれ以外の場合は、サブジェクトの CN フィールドに設定します。
  3. 要求されたホスト名と比較nameし、各アスタリスクが [A-Za-z0-9_]+ に一致するようにしますが、「ドット」 (.) には一致しません。

これを行うには、たくさんのコードを実行する必要があるように思えますが、何も見つかりませんでした。

誰でもこの例を見つけることができますか? または、アルゴリズムの健全性をチェックしますか?

編集:これは私が思いついたものです: https://gist.github.com/2821083。OpenSSL がこれをコードの呼び出しに任せているのは、本当に奇妙に思えます。

4

2 に答える 2

4

あなたはかなり正確です - ただし、サブジェクトの代替名、生の IP アドレス、および FQDN には注意してください。盗みたいかも

BOOL SSL_X509_getIDs(apr_pool_t *p, X509 *x509, apr_array_header_t **ids)

およびhttp://svn.apache.org/viewvc/httpd/httpd/trunk/modules/ssl/ssl_util_ssl.cからの関連する友人と、すべてのオプションの ssl_engine_init.c (ちなみにサーバー側) の呼び出し先.

openssl コールバックを操作しているため、CTX でまだ指定していない場合は、日付と時刻とチェーンも考慮してください。

Dw。

于 2012-06-01T11:07:31.637 に答える
2

OpenSSL がこれをコードの呼び出しに任せるというのは、本当に奇妙に思えます。

はい、実際には非常に問題のある省略です。非常に多くのアプリケーションが手動でチェックを実行する必要があることに気付いていないためです。

OpenSSL 1.1.0 にはホスト名HEADの検証が含まれます (現在 (2013 年 9 月現在))。変更ログによると、-verify_nameオプションがありapps.c、スイッチに応答します-verify_hostname。ただしs_client、どちらのスイッチにも応答しないため、クライアントに対してホスト名チェックがどのように実装または呼び出されるかは不明です。


dnsName拡張子のフィールドが存在する場合はsubjectAlternativeName、name をその値に設定します。

複数のサブジェクト代替名 (SAN) が存在する可能性があるため、複数の場合に備えてください。

それ以外の場合は、サブジェクトの CN フィールドに name を設定します。

一致するかどうかも確認する必要があると思います。

name を要求されたホスト名と比較し、各アスタリスクが [A-Za-z0-9_]+ に一致しますが、「ドット」 (.) には一致しません。

そのはるかに痛い。また、gTLD または ccTLD と一致していないことを確認する必要があります。たとえば、gTLD に対して発行された証明書を照合する必要はありません*.com。その証明書はおそらく悪者によって発行されたものです ;)

ccTLD は、*.eu、*.us、または இலங்கை (nic.lk) のようなものです。それらは 5000 ほどあり、Mozilla はhttp://publicsuffix.org/でリストを提供しています。生のリストはhttps://mxr.mozilla.org/mozilla-central/source/netwerk/dns/effective_tld_names.dat?raw=1にあります。


これを行うには、たくさんのコードを実行する必要があるように思えますが、何も見つかりませんでした。

van Gulik の提案に加えて、Curl を試すこともできます。Curl にホスト名一致コードが含まれていることは確かです。


証明書が適切な形式であることを確認することもできます。Web のコンテキストで責任を負うグループは、CA/Browser フォーラムです。証明書を作成するための基本要件と拡張要件があります。

ベースライン ドキュメントでは、たとえば、コモン ネーム (CN) としてリストされている IP は、サブジェクト代替名 (SAN) にもリストされている必要があります。

拡張ドキュメントでは、予約済み IP (RFC 1918) は拡張検証 (EV) 証明書に存在できないことがわかります。EV 証明書にワイルドカードを含めることはできません。

于 2013-12-02T05:01:47.443 に答える