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.1 | 000000001998-12-23-00001998年12月23日 | N/A | - OpenSSLプロジェクトとしての最初のバージョン | 0.9.1c (000000001998-12-23-00001998年12月23日) |
| サポート終了:0.9.2 | 000000001999-03-22-00001999年3月22日 | N/A | - 0.9.1cの後継バージョン | 0.9.2b (000000001999-04-06-00001999年4月6日) |
| サポート終了:0.9.3 | 000000001999-05-25-00001999年5月25日 | N/A | - 0.9.2bの後継バージョン | 0.9.3a (000000001999-05-27-00001999年5月27日) |
| サポート終了:0.9.4 | 000000001999-08-09-00001999年8月9日 | N/A | - 0.9.3aの後継バージョン | 0.9.4 (000000001999-08-09-00001999年8月9日) |
| サポート終了:0.9.5 | 000000002000-02-28-00002000年2月28日 | N/A | - 0.9.4の後継バージョン | 0.9.5a (000000002000-04-01-00002000年4月1日) |
| サポート終了:0.9.6 | 000000002000-09-24-00002000年9月24日 | N/A | - 0.9.5aの後継バージョン | 0.9.6m (000000002004-03-17-00002004年3月17日) |
| サポート終了:0.9.7 | 000000002002-12-31-00002002年12月31日 | N/A | - 0.9.6mの後継バージョン | 0.9.7m (000000002007-02-23-00002007年2月23日) |
| サポート終了:0.9.8 | 000000002005-07-05-00002005年7月5日 | 000000002015-12-31-00002015年12月31日 | - 0.9.7mの後継バージョン | 0.9.8zh (000000002015-12-03-00002015年12月3日) |
| サポート終了:1.0.0 | 000000002010-03-29-00002010年3月29日 | 000000002015-12-31-00002015年12月31日 | - 0.9.8nの後継バージョン | 1.0.0t (000000002015-12-03-00002015年12月3日) |
| サポート終了:1.0.1 | 000000002012-03-14-00002012年3月14日 | 000000002016-12-31-00002016年12月31日 | - 1.0.0の後継バージョン - RFC 6520 TLS/DTLS ハートビート拡張のサポート - SCTPのサポート - RFC 5705 - RFC 5764 - Next Protocol Negotiation (NPN) - 証明書、署名要求及び証明書失効リストでのPSS署名 - CMSでのパスワードベースの受信者情報のサポート - TLS 1.1及びTLS 1.2のサポート - 未検証の2.0 FIPSモジュールのための予備的FIPS機能 - Secure Remote Password protocol (SRP) のサポート | 1.0.1u (000000002016-09-22-00002016年9月22日) |
| サポート終了:1.0.2 | 000000002015-01-22-00002015年1月22日 | 000000002019-12-31-00002019年12月31日 | - 1.0.1の後継バージョン - 長期サポート版 (Long Term Support) - TLS 1.2及びDTLS 1.2向けのスイートBのサポート - DTLS 1.2のサポート - TLSでの楕円曲線暗号の自動的選択 - TLSがサポートする署名アルゴリズム及び楕円曲線暗号のためのAPI - SSL\_CONF設定のAPI - TLS Brainpoolのサポート - ALPNのサポート - CMSのためのRSA-PSS、RSA-OAEP、楕円曲線ディフィー・ヘルマン鍵共有 (ECDH) 及びX9.42ディフィー・ヘルマン鍵共有のサポート | 1.0.2u (000000002019-12-20-00002019年12月20日) |
| サポート終了:1.1.0 | 000000002016-08-25-00002016年8月25日 | 000000002019-09-11-00002019年9月11日 | - 1.0.2hの後継バージョン - BLAKE2 (RFC 7693) のサポート - ChaCha20-Poly1305 (RFC 7539) のサポート - X25519 (RFC 7748) のサポート - DANE及びCertificate Transparencyのサポート - CCM暗号利用モードのサポート - Extended Master Secretのサポート - SSL 2.0のサポートの削除 - ケルベロス認証のサポートの削除 - libsslのデフォルト暗号スイートからのRC4及びトリプルDESの削除 - DSS、SEED、IDEA、Camellia及びAES-CCMをデフォルトの暗号リストから削除 - 40ビット及び56ビット暗号のサポートをlibsslから削除 | 1.1.0l (000000002019-09-10-00002019年9月10日) |
| サポート終了:1.1.1 | 000000002018-09-11-00002018年9月11日 | 000000002023-09-11-00002023年9月11日 | - 長期サポート版 (Long Term Support) - TLS 1.3のサポート - SHA-3のサポート - X448及びEd448 (RFC 7748) のサポート - SipHashのサポート - ARIAのサポート - multi-prime RSA (RFC 8017) のサポート - SM2、SM3及びSM4のサポート - ハートビート拡張のサポートの削除 - QNXのサポートの削除 | 1.1.1w (000000002023-09-11-00002023年9月11日) |
| サポート中:3.0 | 000000002021-09-07-00002021年9月7日 | 000000002026-09-07-00002026年9月7日 | - 長期サポート版 (Long Term Support) - ライセンスをApache License 2.0に変更 | 3.0.16 (000000002025-02-11-00002025年2月11日) |
| サポート中:3.1 | 000000002023-03-14-00002023年3月14日 | 000000002025-03-14-00002025年3月14日 |  | 3.1.8 (000000002025-02-11-00002025年2月11日) |
| サポート中:3.2 | 000000002023-11-23-00002023年11月23日 | 000000002025-11-23-00002025年11月23日 |  | 3.2.4 (000000002025-02-11-00002025年2月11日) |
| サポート中:3.3 | 000000002024-04-09-00002024年4月9日 | 000000002026-04-09-00002026年4月9日 |  | 3.3.3 (000000002025-02-11-00002025年2月11日) |
| 現行バージョン:3.4 | 000000002024-10-22-00002024年10月22日 | 000000002026-10-22-00002026年10月22日 |  | 3.4.1(000000002025-02-11-00002025年2月11日) |
| 凡例  サポート終了  サポート中  現行バージョン  最新プレビュー版  将来のリリース | | | | |

使用ライブラリ( libssl, libcrypto )を ver. 1.0 から 1.1 に変更する場合には、使用元のプログラムを少なからず変更する必要がある。本変更に関するノウハウや解説がにおいてまとめられている。

## 暗号化アルゴリズム

OpenSSLは以下の暗号化アルゴリズムをサポートする。

## FIPS 140-2の承認

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プロジェクトがそのような例である。

## バグによる脆弱性

### Debianの弱い鍵

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で修正されている。

### 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のほとんどのバージョンに存在し、通信開始手順の途中で不正な信号を送ると、該当する通信で使われる一時的な暗号鍵が、第三者でも予想できてしまうというものである。

また、脆弱性発見の経緯が、発見者により公開されている。

### DROWN攻撃

Decrypting RSA with Obsolete and Weakened eNcryptionと名付けられた攻撃手法の略称。

脆弱性の概要は、SSLv2を使用可能にしていると攻撃者は、同じ秘密鍵を共有するSSLv2が有効なサーバにプローブを送信することで、新しいプロトコルであるTLSを使ったクライアントとサーバ間の接続を復号することができる。
想定される影響は、遠隔の攻撃者に、SSLv2 をサポートしているサーバの暗号通信を解読されるおそれがある。SSLv2 をサポートしており、TLS 通信で SSLv2 と同一の証明書を使用している場合、TLS の暗号通信であっても、同様の影響を受けるおそれがある。
この攻撃に対処したパッチは、1.0.1sまたは1.0.2.gである。
SSLv2自体は、2011年から非推奨となっている。

## フォーク

### 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