OpenSSL

OpenSSL（オープン・エスエスエル）は、SSLプロトコル・TLSプロトコルの、オープンソースで開発・提供されるソフトウェアである。中心となっているライブラリ（C言語で書かれている）は基本的な暗号化関数と様々なユーティリティ関数を実装している。様々なコンピュータ言語でOpenSSLライブラリを利用できるようにするラッパーもある。OpenSSLはEric A. YoungとTim HudsonによるSSLeay（1998年12月に開発者がRSA Securityに異動したため開発は終了されている）を基にしている。 OpenSSLが利用可能なプラットフォームは、ほぼ全てのUnix系（SolarisやLinux、macOS、BSDを含む）、OpenVMS、そしてWindowsである。IBMによってSystem i (iSeries/AS400) に移植されたバージョンもある。 使用ライブラリ( libssl, libcrypto )を ver. 1.0 から 1.1 に変更する場合には、使用元のプログラムを少なからず変更する必要がある。本変更に関するノウハウや解説がにおいてまとめられている。 OpenSSLは以下の暗号化アルゴリズムをサポートする。 プロトコル SSL 3.0、TLS (1.0、1.1、1.2、1.3)、DTLS (1.0、1.2) 共通鍵暗号方式 AES、Blowfish、Camellia、ChaCha20、Poly1305、SEED、CAST-128、DES、IDEA、RC2、RC4、RC5、トリプルDES、GOST 28147-89（英語版）、SM4（英語版） ハッシュ関数方式 MD5、MD4、MD2、SHA-1、SHA-2、SHA-3、RIPEMD-160、MDC-2（英語版）、GOST R 34.11-94（英語版）、BLAKE2、Whirlpool、SM3（英語版） 公開鍵暗号方式 RSA、DSA、ディフィー・ヘルマン鍵共有、楕円曲線暗号、X25519、Ed25519、X448、Ed448、GOST R 34.10-2001、SM2 OpenSSLは、NIST（アメリカ国立標準技術研究所）のCryptographic Module Validation Program（英語版）によるコンピュータセキュリティ標準であるFIPS 140-2において承認された初めてのオープンソースプログラムである。ただしOpenSSL自体が検証されたのではなく、OpenSSL FIPS Object Moduleという標準対応用のソースコードを組み込んだものが検証されている。このモジュールはOpenSSL 1.0.1/1.0.2で使用可能。 最初の承認は2006年1月に行われた。同年7月には「承認されたモジュールによる外部のプログラムとの相互作用に関し疑問が提示された」ため、いったんは撤回されたものの、翌2007年に再び承認が行われた。 OpenSSL v3.0.0未満はOpenSSL LicenseとSSLeay Licenseの両方のライセンス下で公開されている。OpenSSL v3.0.0以降ではApache License Version 2.0のみとなる。OpenSSL LicenseはApache License, Version 1.0であり、SSLeay Licenseは宣伝条項付きの四条項BSDライセンスである。一般にデュアルライセンスではユーザーは2つのライセンスのうち片方を選択できるが、OpenSSLの説明書きによると、両方のライセンスが適用されることを意味している。 OpenSSL v3.0.0未満のOpenSSL Licenseは、Apache License Version 2.0ではなくApache License Version 1.0である(前述の通りOpenSSL v3.0.0以降ではApache License Version 2.0のみ)ため、「この製品はOpenSSLツールキットを利用するためにOpenSSLプロジェクトによって開発されたソフトウェアを含む。(This product includes software developed by the OpenSSL Project for use in the OpenSSL Toolkit)」という一文を再頒布の際に含めなければならないという規定が含まれ、GNU General Public License (GPL) と非互換である。ただしThe OpenSSL Projectの見解では、多くのLinuxやBSDディストリビューションにおいて、OpenSSLはオペレーティングシステムの一部をなしているためGPLの制限は適用されないとしている。中には、"OpenSSL exception"を追加してシステムで動かせるようにしているプロジェクトもある。GNU Wgetとclimm（英語版）プロジェクトがそのような例である。 ValgrindをOpenSSLに対しても適用可能とするために、Debianディストリビューションに含まれるOpenSSLにパッチを適用したが、この際に誤って擬似乱数生成器が正しく動作しなくなり、生成される暗号鍵が予測可能なものとなってしまった。 このバグは2006年9月17日にリリースされたDebian (OpenSSL 0.9.8c-1) から含まれており、バグが判明してDebianから発表されたのは2008年5月13日であった。Debian系以外のシステムを含め、問題となったDebian上で生成した鍵を使用している場合は、脆弱性のないOpenSSLで鍵を再生成する必要がある。 このバグは、Debian 4.0 (etch) ではOpenSSLの0.9.8c-4etch3以降で、Debian 5.0 (lenny) では0.9.8g-9で修正されている。 2014年4月7日に、OpenSSLの1.0.2-betaや1.0.1系列で、TLSのheartbeat拡張について、メモリの扱いにバグがあると発表された 。このバグを利用することで、ハートビート1回ごとに64キロバイトのメモリを読み取ることが可能となる。この問題のCVE番号はCVE-2014-0160である。 この脆弱性は2011年12月31日から存在し、OpenSSL 1.0.1がリリースされた2012年3月14日以降、脆弱性のあるOpenSSLが広く使われている。サーバ側のメモリを読むことで、機密情報にアクセスが可能となり、場合によっては秘密鍵を盗まれて暗号化が無力となり、中間者攻撃を仕掛けることが可能となる。 ユーザーに関する非公開の情報、たとえばセッションクッキーやパスワードも漏れうるため、他者になりすますことも可能となってしまう。脆弱性が判明した段階で、認証局から証明を受けたHTTPSサーバのうち、ざっと17%から半分程度が影響するものと見られている。 基本的な対策はハートビートを使用しない（-DOPENSSL_NO_HEARTBEATS オプションを付けて再コンパイルする）か、脆弱性を修正したバージョン（1.0.1g以降）への更新となる。 2014年6月6日に、過去10年以上に渡るすべてのOpenSSLのバージョンについて、ChangeCipherSpecメッセージの処理の不正な順序による挿入によって攻撃者の意図する弱い暗号へ強制変更させた通信として開始されるという攻撃方法が発見され、CCS Injection脆弱性 (CCS Injection Vulnerability, CVE-2014-0224) として公開された。 この脆弱性は過去のOpenSSLのほとんどのバージョンに存在し、通信開始手順の途中で不正な信号を送ると、該当する通信で使われる一時的な暗号鍵が、第三者でも予想できてしまうというものである。 また、脆弱性発見の経緯が、発見者により公開されている。 Decrypting RSA with Obsolete and Weakened eNcryptionと名付けられた攻撃手法の略称。 脆弱性の概要は、SSLv2を使用可能にしていると攻撃者は、同じ秘密鍵を共有するSSLv2が有効なサーバにプローブを送信することで、新しいプロトコルであるTLSを使ったクライアントとサーバ間の接続を復号することができる。 想定される影響は、遠隔の攻撃者に、SSLv2 をサポートしているサーバの暗号通信を解読されるおそれがある。SSLv2 をサポートしており、TLS 通信で SSLv2 と同一の証明書を使用している場合、TLS の暗号通信であっても、同様の影響を受けるおそれがある。 この攻撃に対処したパッチは、1.0.1sまたは1.0.2.gである。 SSLv2自体は、2011年から非推奨となっている。 OpenBSDプロジェクトでは、前述のハートブリード問題をうけて、OpenSSL 1.0.1gをベースとしてフォークしたLibreSSLを2014年4月に立ち上げた。これは、OpenBSDで利用されているOpenSSLライブラリを置き換えることを目的としており、OpenSSLのコードの見直しを行いよりセキュアな実装とすることを目指している。 既に、OpenBSDにおいて不要なコードや、古いシステムのサポートのためのコードの削除を行い、90000行以上のソースコードの削減を行っている。 2014年7月11日に、LibreSSL 2.0.0がリリースされた。 Googleも、OpenSSLをフォークしたBoringSSLの立ち上げを2014年6月に発表した。Googleでは、OpenSSL、LibreSSL双方の開発者と協力していくとしている。 boringssl - Git at Google