SSL/TLSライブラリを使う際には、接続確立時にサーバの認証を正しく行う必要があります。具体的には、クライアントプログラムで以下の2種類の検証を行うことになります。
- SSL/TLSライブラリがサーバの証明書の検証に成功したこと
- サーバの証明書に含まれるコモンネーム注1が接続しようとしたサーバと同一であること
前者については、OpenSSLの場合は
SSL_CTX_set_verify
の引数にSSL_VERIFY_PEER
を指定するなどして、ライブラリ側で処理を行わせることが可能です(証明書の検証に失敗した場合はSSL_connectがエラーを返します)。一方、後者についてはSSL/TLSライブラリによって差があり、検証機能を有効にするために特別な呼出が必要だったり、あるいは検証機能を提供していないライブラリもあるため注意が必要です(これは、SSL/TLSが任意のストリームで安全な通信手段を確立するためのものであるのに対し、コモンネームの検証はTCP/IP+DNS上でSSL/TLSを使用する場合に必要となる作業である、という要件のズレによるものです)。
たとえば、OpenSSLはコモンネームの検証機能を提供していないので、アプリケーションプログラマが独自に同機能を実装する必要があります。具体的な方法はいくつかあるのですが、最も単純な形で以下のようになるかと思います注2。
// returns non-zero value if the verification succeeds static int verify_common_name_of_ssl(SSL* ssl, const char* hostname) { X509* peer; X509_NAME* subject_name; char peer_name[256]; peer = X509_get_peer_certificate(ssl); if (peer == NULL) return 0; // fail subject_name = X509_get_subject_name(X509_get_peer_certificate(ssl); if (subject_name == NULL) return 0; // fail if (X509_NAME_get_text_by_NID(subject_name, NID_commonName, peer_name, sizeof(peer_name)) == -1) return 0; // fail return strcasecmp(peer_name, hostname) == 0; }
Android SDKを使っている場合は、公式ドキュメントに注意喚起と対応方法の説明があるので、そちらを参考にすれば良いかと思います(参照: Warnings About Using SSLSocket Directly - Security with HTTPS and SSL | Android Developers)。
iOSでSecure Transportを使っている場合は、
SSLSetPeerDomainName
を呼び出して、ライブラリに検証を依頼することが推奨されています(参照: Secure Transport Reference)。詳しくは、お使いのSSL/TLSライブラリのドキュメントを参照することをお勧めします注3。
また、SSL/TLSを使用するアプリケーションのコードレビューや検証にあたっては、コモンネームの確認を行っているかを検証項目に含めることが望ましいと言えるでしょう。
注1: コモンネームとは、証明書に含まれる「www.google.com」等のホスト名のことです(参照: コモンネームとは何ですか - knowledge.verisign.co.jp)
注2: ワイルドカード証明書への対応など、任意の証明書に対応する実装をするとなると泥沼が待っているかと思います(参照: WildcardCertificates - CAcert Wiki)
注3: より高レベルな、ホスト名解決とTCP上でのSSL/TLS接続機能を一体として提供している類のライブラリにおいては、コモンネームの確認機能が組み込まれている場合が多いかと思います
注2: ワイルドカード証明書への対応など、任意の証明書に対応する実装をするとなると泥沼が待っているかと思います(参照: WildcardCertificates - CAcert Wiki)
注3: より高レベルな、ホスト名解決とTCP上でのSSL/TLS接続機能を一体として提供している類のライブラリにおいては、コモンネームの確認機能が組み込まれている場合が多いかと思います
Rehaut block Rolex engraves its name and the hublot replica consecutive bulk of the watch at six clock below the crystal, on the dial. Lots of replica Rolexes acquire this too now, but if you appraise them carefully you will see it is just printed on the swiss replica watches rehaut and is not an absolute engraving. They may aswell be missing the that consistently alpha the Rolex serials. New clasps for some curve The Daytonas and replica Rolex DateJusts affection a abbreviate brooch compared to the replica watches earlier models. You can absolutely see an acute archetype of this on the Turn-o-graph. Lots of replicas use the old continued clasp, but it is not simple to notice. What you should do is assert on seeing shots of the accomplished watch from abounding angles afore affairs. Band end-links block The archetypal bulk can now be apparent as an block on the end-links of abounding new Rolexes. It aswell tells the archetypal of fake rolex watches the band and has two little Rolex crowns. Unfortunately, this has flawlessly been replicated on a lot of new Rolex replicas.
ReplyDeleteI am surprised and say you thanks for this out understanding consent and design, keep it up. that's so good.
ReplyDeletehttp://pkggq.com/
http://worldlearn.asia/
http://conquerthislife.com/
http://liuchuanwen.com/
http://szjmccnc.com/