OpenSSL 4.0.0 が GitHub で公開されました。ひとことで言うと、「互換性をかなり気にしつつも、古い機能を整理して、新しい暗号機能をしっかり足した feature release」です。
OpenSSL は、Webサイトの HTTPS などで使われる暗号ライブラリの大定番。表に見える派手さは少ないですが、世の中の安全な通信を支える“縁の下の力持ち”です。だからこそ、この手のリリースは地味に見えて、実はかなり重要だと思います。
OpenSSL のリリースノートによると、4.0.0 は「significant new functionality」を追加する feature release です。
つまり、単なる不具合修正ではなく、機能面でも設計面でもかなり手を入れた版です。
ただし、こういう大きなリリースにはほぼ必ず付き物があります。そう、互換性の変更です。
今回も「潜在的に大きい、あるいは互換性に影響しうる変更」がたくさん入っています。これは現場の人からすると少し面倒ですが、長い目で見れば、古い荷物を降ろして前に進むための痛みでもあります。個人的には、この“整理整頓感”はかなり好感が持てます。
今回のリリースでは、いくつもの古い機能や古い書き方が削除されています。ここは影響が大きいので要注意です。
openssl rehash を使う古いプロトコルや仕組みを切るのは、セキュリティ製品としては自然な流れです。
特に SSLv3 は、2015年から非推奨で、1.1.0 以降はデフォルトで無効になっていました。今回ついに完全削除です。
正直、まだ残っていたのか、と感じる人もいるかもしれませんが、現実のソフトウェアは「すぐに切れない古い互換性」を抱え続けるものです。そこをようやく整理した、という見方ができると思います。
engine の削除も大きめです。engine は OpenSSL に機能追加するための古い仕組みですが、今後は別の方向に寄せていく、という意思表示でしょう。
古い拡張機構を守るより、全体をシンプルにする方針は、保守性の面でかなり筋がいいと思います。
OpenSSL は、ただ機能を足すだけでなく、API の形も少しずつ変わっています。今回の 4.0.0 では、その影響がはっきり見えます。
OPENSSL_cleanup() の扱いも変更ここで出てくる opaque という言葉は、ざっくり言うと「中身を外から直接いじれないようにした」という意味です。
昔は構造体の中身をアプリ側が直接触れることもありましたが、今はライブラリが内部構造を隠し、必要な関数経由で操作する方向が主流です。
これは一見すると不便ですが、長期的にはかなり合理的です。
なぜなら、内部構造を隠せば、OpenSSL の開発側は内部実装を変えやすくなるからです。アプリ側が中身にべったり依存していると、ライブラリの進化が止まってしまいます。
つまり、「壊れやすい自由」を減らして、「壊れにくい設計」を増やした」とも言えます。私はこの流れ、わりと好きです。
OpenSSL 4.0.0 では、証明書検証のチェックも強化されています。
X509_V_FLAG_X509_STRICT が設定されているときに有効ここでいう CRL は、証明書失効リスト(Certificate Revocation List)のことです。
簡単に言うと、「この証明書はもう信用しない」というブラックリストのようなものです。
AKID は証明書の識別に関わる情報で、検証の厳しさを上げることで、より正確に証明書の妥当性を判定できるようになります。
こうした変更は、表面的には派手ではありません。でも、セキュリティの世界ではかなり重要です。
「通ればいい」ではなく「より正しく厳密に通す」という方向へ進んでいるわけで、ここは実務的にかなり価値があると思います。
地味だけどありがたい変更もあります。
00: の扱いを変更BIO_snprintf() が libc の snprintf() を使うようになったlibcrypto が atexit() でグローバルデータを掃除しなくなったOPENSSL_cleanup() はグローバルデストラクタで実行されるか、デフォルトでは実行されないこのあたりは、利用者には見えにくいけれど、実装の整理としてはかなり重要です。
特に snprintf() の変更は、「自前の実装を持つより、標準ライブラリを使う」方向で、保守性の面でわかりやすい改善です。
atexit() や cleanup の扱い変更は、アプリケーションの終了処理に影響しうるので、組み込み方によっては注意が必要です。
こういう部分は「昔はなんとなく動いていた」コードほど、アップデート時に引っかかりやすいところだと思います。
削るだけではなく、新しい機能もしっかり入っています。ここが 4.0.0 の面白いところです。
sm2sig_sm3curveSM2curveSM2MLKEM768(post-quantum group)fipsinstall -defer_tests で遅延実行可能にECH は、ざっくり言うと「TLS 通信の最初のやり取りをより隠しやすくする仕組み」です。
これがなぜ重要かというと、従来の通信開始時には、アクセス先の情報の一部が見えやすかったからです。ECH はそこを改善する方向の技術で、プライバシー面でかなり注目されています。
もちろん、実際の普及はクライアント・サーバー・CDN など周辺の対応にも左右されます。
でも、OpenSSL に入ったのは大きな一歩です。こういう基盤ライブラリが対応すると、エコシステム全体が少しずつ動きやすくなります。
curveSM2MLKEM768 のような post-quantum 系の名前が入っているのも印象的です。
post-quantum は「将来の量子コンピュータでも壊れにくい暗号」を目指す分野です。まだ一般ユーザーには遠い話に見えるかもしれませんが、インフラの世界ではすでにかなり真剣に見られています。
個人的には、OpenSSL がこういう領域を着実に取り込んでいるのは、かなり頼もしいと思います。
「今すぐ必要」ではなくても、「あとで必ず必要になる」ものに先回りしている感じがあるからです。
派手ではないけれど、実務ではうれしい話もあります。
FIPS モジュールのインストール時に、self tests を あとで実行する ようにできるようになりました。
これは openssl fipsinstall の -defer_tests オプションで使えます。
FIPS は米国政府系の要件に関係する暗号基準で、導入現場では手続きや検証がやや重くなりがちです。
なので、テストを柔軟に扱えるのは運用上ありがたいはずです。
Windows では、static runtime と dynamic runtime のどちらでもリンクできるようになりました。
これはビルド環境の違いに合わせやすくする改善で、地味ですが現場には効きます。
こういう「ちゃんと困るところを見てくれている」アップデートは好印象です。
OpenSSL 4.0.0 は魅力的な新機能が多い一方で、互換性の影響もかなりあります。
特に注意したいのは次のあたりです。
c_rehash を使っていないかもし古い OpenSSL との互換性に強く依存しているプロジェクトなら、移行作業はそれなりに大変になるはずです。
ただ、そのぶんコードベースが整理され、今後の保守はしやすくなる可能性が高いです。
OpenSSL 4.0.0 は、単なるバージョンアップではなく、かなりはっきりした方針転換を感じるリリースです。
古い SSLv3 や engine のような仕組みを外しつつ、ECH、post-quantum、cSHAKE、FIPS 運用改善など、次世代向けの機能をしっかり入れています。
率直に言うと、こういうリリースは導入する側にはちょっと厄介です。互換性チェックが増えるからです。
でも、基盤ライブラリがいつまでも昔の互換性にしがみついていると、どこかで必ず限界が来ます。
その意味で OpenSSL 4.0.0 は、「痛みはあるけど、かなり健全なアップデート」だと思います。