OpenSSL

OpenSSL（オープン・エスエスエル）は、TLSプロトコル・SSLプロトコルの、オープンソースで開発・提供されるソフトウェアである。中心となっているライブラリ（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) に移植されたバージョンもある。

 バージョン履歴 
バージョンリリース日サポート期限概要最新版0.9.1c ()0.9.2b ()0.9.3a ()0.9.4 ()0.9.5a ()0.9.6m ()0.9.7m ()0.9.8zh ()1.0.0t ()1.0.1u ()1.0.2u ()1.1.0l ()1.1.1w ()3.0.18 ()3.1.8 ()3.2.6 ()3.3.5 ()3.4.3()3.5.4()TBD3.6.0()
使用ライブラリ( 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、、
 ハッシュ関数方式
 MD5、MD4、MD2、SHA-1、SHA-2、SHA-3、RIPEMD-160、、、BLAKE2、Whirlpool、
 公開鍵暗号方式
 RSA、DSA、ディフィー・ヘルマン鍵共有、楕円曲線暗号、X25519、Ed25519、X448、Ed448、GOST R 34.10-2001、SM2

 FIPS 140-2の承認 
OpenSSLは、NIST（アメリカ国立標準技術研究所）のによるコンピュータセキュリティ標準であるFIPS 140-2において承認された初めてのオープンソースプログラムである。ただしOpenSSL自体が検証されたのではなく、OpenSSL FIPS Object Moduleという標準対応用のソースコードを組み込んだものが検証されている。このモジュールはOpenSSL 1.0.1/1.0.2で使用可能。

最初の承認は2006年1月に行われた。同年7月には「承認されたモジュールによる外部のプログラムとの相互作用に関し疑問が提示された」NIST recertifies open source encryption moduleため、いったんは撤回されたものの、翌2007年に再び承認が行われた。

 ライセンス 
OpenSSL v3.0.0未満はOpenSSL LicenseとSSLeay Licenseの両方のライセンス下で公開されているOpenSSL: Source, 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 Toolkithttp://www.openssl.org)」という一文を再頒布の際に含めなければならないという規定が含まれ、GNU General Public License (GPL) と非互換であるLicenses - Free Software Foundation。ただしThe OpenSSL Projectの見解では、多くのLinuxやBSDディストリビューションにおいて、OpenSSLはオペレーティングシステムの一部をなしているためGPLの制限は適用されないとしているOpenSSL: Frequently Asked Questions。中には、"OpenSSL exception"を追加してシステムで動かせるようにしているプロジェクトもある。GNU Wgetとプロジェクトがそのような例であるWGET 1.10.2 for Windows (win32)climm - Download!。

 バグによる脆弱性 
 Debianの弱い鍵 
ValgrindをOpenSSLに対しても適用可能とするために、Debianディストリビューションに含まれるOpenSSLにパッチを適用したが、この際に誤って擬似乱数生成器が正しく動作しなくなり、生成される暗号鍵が予測可能なものとなってしまったDebianのOpenSSLに脆弱性、「弱い鍵」が破られる恐れ @IT、2008年5月20日（2014年4月12日閲覧）。。

このバグは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で修正されている。

 Heartbleed 

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以降）への更新となる。

 CCS Injection Vulnerability 
2014年6月6日に、過去10年以上に渡るすべてのOpenSSLのバージョンについて、ChangeCipherSpecメッセージの処理の不正な順序による挿入によって攻撃者の意図する弱い暗号へ強制変更させた通信として開始されるという攻撃方法が発見され、CCS Injection脆弱性 (CCS Injection Vulnerability, CVE-2014-0224) として公開された。

この脆弱性は過去のOpenSSLのほとんどのバージョンに存在し、通信開始手順の途中で不正な信号を送ると、該当する通信で使われる一時的な暗号鍵が、第三者でも予想できてしまうというものである。

また、脆弱性発見の経緯が、発見者により公開されているCCS Injection脆弱性(CVE-2014-0224)発見の経緯についての紹介 - CCS Injection。

 DROWN攻撃 
Decrypting RSA with Obsolete and Weakened eNcryptionと名付けられた攻撃手法の略称https://drownattack.com/drown-attack-paper.pdf DROWN: Breaking TLS using SSLv2。

脆弱性の概要は、SSLv2を使用可能にしていると攻撃者は、同じ秘密鍵を共有するSSLv2が有効なサーバにプローブを送信することで、新しいプロトコルであるTLSを使ったクライアントとサーバ間の接続を復号することができるhttps://japan.cnet.com/article/35078777/ HTTPSサイトの3割に影響する「DROWN」脆弱性見つかる--OpenSSLはパッチ公開。
想定される影響は、遠隔の攻撃者に、SSLv2 をサポートしているサーバの暗号通信を解読されるおそれがある。SSLv2 をサポートしており、TLS 通信で SSLv2 と同一の証明書を使用している場合、TLS の暗号通信であっても、同様の影響を受けるおそれがある。
この攻撃に対処したパッチは、1.0.1sまたは1.0.2.ghttps://www.openssl.org/news/vulnerabilities.html#2016-0800 CVE-2016-0800 (OpenSSL advisory) [High severity] 1st March 2016である。
SSLv2自体は、2011年から非推奨https://datatracker.ietf.org/doc/html/rfc6176となっている。

 フォーク 
 LibreSSL 

OpenBSDプロジェクトでは、前述のハートブリード問題をうけて、OpenSSL 1.0.1gをベースとしてフォークしたLibreSSLを2014年4月に立ち上げた。これは、OpenBSDで利用されているOpenSSLライブラリを置き換えることを目的としており、OpenSSLのコードの見直しを行いよりセキュアな実装とすることを目指している。

既に、OpenBSDにおいて不要なコードや、古いシステムのサポートのためのコードの削除を行い、90000行以上のソースコードの削減を行っている。

2014年7月11日に、LibreSSL 2.0.0がリリースされた。

 BoringSSL 
Googleも、OpenSSLをフォークしたBoringSSLの立ち上げを2014年6月に発表した。Googleでは、OpenSSL、LibreSSL双方の開発者と協力していくとしている。
 boringssl - Git at Google

 脚注 

 関連項目 

Transport Layer Security
TLS実装の比較

 外部リンク 

 The OpenSSL License and the GPL、Mark McLoughlinによる。
 Win32 OpenSSL 

Category:Transport Layer Security
Category:オープンソースソフトウェア
Category:コンピュータ・ネットワーク・セキュリティ
Category:セキュア通信
Category:電子商取引
Category:1998年のソフトウェア
Category:Cでプログラムされた自由ソフトウェア