Andre's patch でも SSL/TLS プロトコルを制御できるらしい

id:hiro-ueda:20080305:1204725082 の件、Claudio から

Look at the cipher section of the openssl docu.

SSL_CIPHER=SSLv3 should do the trick and disallow SSLv2.
e.g. echo SSLv3 > /var/qmail/boot/qmail-pop3d-ssl/env/SSL_CIPHER

というメールが流れました。すいません、勉強不足でした orz。

...ん? でも SSL_CIPHER って SSL/TLSプロトコルを制御するために使う環境変数なのか? パッチの該当箇所は

    /* set prefered ciphers */
    if (env_get("SSL_CIPHER"))
      if (SSL_CTX_set_cipher_list(ctx, env_get("SSL_CIPHER")) == 0)
        strerr_die2x(111,FATAL,"unable to set cipher list");

となっていて、ここで使用している SSL_CTX_set_cipher_list() は OpenSSL ドキュメントで

SSL_CTX_set_cipher_list() sets the list of available ciphers for ctx using the control string str. The format of the string is described in ciphers(1). The list of ciphers is inherited by all ssl objects created from ctx.

SSL_set_cipher_list() sets the list of ciphers only for ssl.

と説明されています。そして ciphers(1) では

It can represent a list of cipher suites containing a certain algorithm, or cipher suites of a certain type. For example SHA1 represents all ciphers suites using the digest algorithm SHA1 and SSLv3 represents all SSL v3 algorithms.

とありますので、確かに "SSLv3" を環境変数 SSL_CIPHER に設定することで SSLv3 の cipher suites しか使えなくなるため、SSLv2 は拒否できるようになります*1。が、これはcipher suites の指定の結果として SSLv2 が使用できないのであって、プロトコルとして SSLv2 を拒否しているわけではないわけで、なんだかトリッキーですね --;)。

*1:openssl ciphers SSLv3 と openssl ciphers TLSv1 の出力結果が一致するため、SSLv3 を指定すれば SSLv3/TLSv1 の両方が使用できるみたいですね。