OpenSSLでSSL_OP_NO_COMPRESSIONの指定は必要か?
OpenSSLでのサーバー証明書の検証の記事への補足です。
2012年にSSL/TLSプロトコルへの攻撃手法としてCRIME攻撃というものが見つかり、その対策として「SSL/TLSの圧縮機能は使うな」ということになりました。
そこで、OpenSSLにおいても圧縮機能を使わないように指示するSSL_OP_NO_COMPRESSIONが追加されました(*1)。
SSL_CTX_set_options(ctx, SSL_OP_NO_COMPRESSION);
とか
SSL_set_options(ssl, SSL_OP_NO_COMPRESSION);
のようにして指定できます。
OpenSSLでのサーバー証明書の検証 のTLS接続するサンプルソースではSSL_OP_NO_COMPRESSIONを指定していませんでしたが、今回はここで、接続時おいてSSL_OP_NO_COMPRESSIONを指定する必要があるのかを整理しておきます。
なお、圧縮の有無はクライアントとサーバー間のネゴシエーションで決まるので、クライアントが圧縮可としていてもサーバー側が圧縮をoffにしていれば圧縮は行われないので問題ないのですが、今回はあくまでクライアント側が正しい動作をするかだけを考慮します。
Version 1.1.0以降
OpenSSL 1.1.0以降では SSL_CTX にデフォルトで SSL_OP_NO_COMPRESSION が設定されるようになっています。
openssl-1.1.1m ssl/ssl_lib.cのSSL_CTX_new()より
ret->options |= SSL_OP_NO_COMPRESSION | SSL_OP_ENABLE_MIDDLEBOX_COMPAT;
このため、明示的に SSL_OP_NO_COMPRESSION を指定しなくても圧縮が行われることはありません。
なお、RedHat8や現時点で最新のFedora35では1.1.1系が使われています。
Version 1.0.0〜1.0.2
これらのバージョンではSSL_OP_NO_COMPRESSIONのデフォルト設定がないため、明示的に指定しない限りは圧縮に対応しているものとしてClientHelloが送信されます(図1)。

ただし、RedHat7/CentOS7/Amazon Linux2で使われている1.0.2ではCRIME攻撃対策としてZLIBを読み込まないように修正されているため、SSL_OP_NO_COMPRESSION を明示的に指定しなくても圧縮されることはありません。
openssl-1.0.2k-24.el7_9.x86_64のchangelogより
* Tue Feb 19 2013 Tomas Mraz1.0.1e-2 - disable ZLIB loading by default (due to CRIME attack)
openssl-1.0.2k-19.el7.src.rpm の openssl-1.0.2a-env-zlib.patch より抜粋
diff -up openssl-1.0.2a/ssl/ssl_ciph.c.env-zlib openssl-1.0.2a/ssl/ssl_ciph.c --- openssl-1.0.2a/ssl/ssl_ciph.c.env-zlib 2015-04-09 18:17:20.510637620 +0 200 +++ openssl-1.0.2a/ssl/ssl_ciph.c 2015-04-09 18:17:20.264631937 +0200 ... 略 ... @@ -450,7 +452,8 @@ static void load_builtin_compressions(vo MemCheck_off(); ssl_comp_methods = sk_SSL_COMP_new(sk_comp_cmp); - if (ssl_comp_methods != NULL) { + if (ssl_comp_methods != NULL + && secure_getenv("OPENSSL_DEFAULT_ZLIB") != NULL) { comp = (SSL_COMP *)OPENSSL_malloc(sizeof(SSL_COMP)); if (comp != NULL) { comp->method = COMP_zlib();
上記のように OPENSSL_DEFAULT_ZLIB 環境変数が指定されていなければ、DEFLATE Compression Methodが設定されないように変更されています。
OPENSSL_DEFAULT_ZLIB=1 のように環境変数が指定されていると、DEFLATEが動作します。このようなケースでは SSL_OP_NO_COMPRESSION の指定が必要になります。
OpenSSL 1.0.0〜1.0.2は既にサポートは切れており、ディストリビューションで標準インストールされて更新されているもの以外は使うべきではありません。RedHat7/CentOS7/Amazon Linux2にインストールされている1.0.2なら、上記のとおりCRIME攻撃の対策が入っているため、SSL_OP_NO_COMPRESSION の指定がなくても問題ありません。
Version 0.9.x
0.9.xでは SSL_OP_NO_COMPRESSION オプションは存在しないため、非圧縮を指定する方法はないと思われます。さすがに古すぎて、このバージョンを使っていることはないと思いますが。
まとめ
まとめると
現在サポート中のOpenSSL 1.1.1、3.0なら SSL_OP_NO_COMPRESSION の指定は不要
RedHat7/CentOS7/Amazon Linux2はOpenSSL 1.0.2だが、CRIME攻撃対策は入っているため SSL_OP_NO_COMPRESSION の指定は不要
その他、古いバージョンがインストールされているディストリビューションについては、それぞれのディストリビューションによる
となり、現在のセキュリティアップデートが提供されている一般的な環境ではSSL_OP_NO_COMPRESSION の指定は不要と言っていいのではないかと思います。
[関連記事]
(*1) 1.0.0以降。0.9.8系では存在しません。
投稿日:2022/01/31 14:28