Tuesday, January 28, 2014

SSL/TLSライブラリの正しい使い方(もしくは、コモンネームの検証について)

スマホアプリの市場拡大に伴い、直接SSL/TLSライブラリを使用するプログラムを書く機会も増えてきている今日この頃かと思います。

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 comments:

  1. 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.

    ReplyDelete
  2. I am surprised and say you thanks for this out understanding consent and design, keep it up. that's so good.
    http://pkggq.com/
    http://worldlearn.asia/
    http://conquerthislife.com/
    http://liuchuanwen.com/
    http://szjmccnc.com/

    ReplyDelete

Note: Only a member of this blog may post a comment.