この記事には独自研究 が含まれているおそれがあります。 問題箇所を検証 し出典を追加 して、記事の改善にご協力ください。議論はノート を参照してください。(2023年5月 )
Transport Layer Security (TLS) プロトコルは、ネットワーク間の通信を保護する機能を提供する。このTLS実装の比較 (ティーエルエスじっそうのひかく)では、最も知られるライブラリ を比較する。
すべての比較カテゴリで、概要セクションにリストされている各実装の安定バージョンを使用する。この比較はTLSプロトコルに直接関連する機能に限定するものとする。
概要
プロトコルのサポート
TLSプロトコルにはいくつかのバージョンが存在する。SSL 2.0は重大な弱点を持ち廃止予定となっている。SSL 3.0(1996年)とTLS 1.0(1999年)は、2001年にSerge Vaudenayによって説明されたCBCパディングの2つの弱点を継承している。TLS 1.1(2006)は、CBCブロック暗号にランダムな初期化ベクトル(IV)を使用するよう切り替えることで問題の1つが解決されたのみで、このバージョンでは安全なpad-mac-encryptではなく問題のあるmac-pad-encryptの使用がRFC7366で追加されてしまった。TLS 1.1のランダムIVにほぼ相当するSSL 3.0とTLS 1.0の回避策は、2011年後半の多くの実装で広く採用されていた。セキュリティの観点からは、TLS 1.0、1.1、1.2のいずれも基本プロトコルで同等の強度を持ち、NIST SP800-57によると、少なくとも2030年までの128ビットセキュリティに適している。2014年には、SSL 3.0のPOODLEの脆弱性が発見される。これはCBCの既知の脆弱性を利用し、ブラウザ内で安全ではないTLSバージョンのフォールバック・ネゴシエーションを行うものである。
TLS 1.2(2008)は基本プロトコルの最新版であり、デジタル署名に使用されるハッシュを識別する手段を導入した。SSL 3.0の保守的な選択(rsa、sha1 + md5)よりも将来のデジタル署名(rsa、sha256 / sha384 / sha512)に対してより強力なハッシュ関数を使用できるようにする一方で、TLS 1.2プロトコルの変更は(rsa、sha1)、(rsa、md5)までをも提供し、デフォルトのデジタル署名を不注意かつ大幅に弱くした。
データグラムトランスポートレイヤセキュリティ(DTLS)1.0は、パケット損失とパケットの並べ替えを許容する必要があるパケット型トランスポートレイヤ向けにのTLS 1.1を変更したものである。TLS 1.2に基づく改訂版であるDTLS 1.2が2012年1月に公開された。
SSL 2.0とSSL 3.0には既知の脆弱性が存在する。予測可能なIV(簡単な回避策が存在する)を除いて、現在知られているすべての脆弱性はTLS 1.0 / 1.1 / 1.2のすべてのバージョンに影響がでる。
アメリカ国家安全保障局 (NSA) Suite B 暗号
NSA Suite B暗号化(RFC 6460 )に必要なコンポーネント:
CNSSP-15では、「機密(Secret)」レベルに分類される情報を保護するには256ビットの楕円曲線(FIPS
186-2で指定)、SHA-256、および128ビットのAES、「最高機密(Top Secret)」の情報を保護するには384ビットの楕円曲線 (FIPS 186-2で指定)、SHA-384、および256ビット鍵付きAESが必要としている。
認定
実装
FIPS 140-1 , FIPS 140-2 [ 20]
組み込みFIPSソリューション
GnuTLS [ 21]
Red Hat Enterprise Linux GnuTLS Cryptographic Module (#2780)
OpenSSL [ 22]
OpenSSL FIPS Object Module: 1.0 (#624), 1.1.1 (#733), 1.1.2 (#918), 1.2, 1.2.1, 1.2.2, 1.2.3 or 1.2.4 (#1051) 2.0, 2.0.1, 2.0.2, 2.0.3, 2.0.4, 2.0.5, 2.0.6, 2.0.7 or 2.0.8 (#1747)
wolfSSL [ 23]
wolfCrypt FIPS Module: 4.0 (#3389) See details on NIST certificate for validated Operating Environments wolfCrypt FIPS Module: 3.6.0 (#2425) See details on NIST certificate for validated Operating Environments
Yes
実装
FIPS 140-1 , FIPS 140-2
組み込みFIPSソリューション
鍵交換アルゴリズム(証明書のみ)
このセクションでは、さまざまな実装で使用可能な証明書検証機能を示す。
鍵交換アルゴリズム(代替鍵交換)
証明書の検証方法
暗号化アルゴリズム
Notes
^ a b このアルゴリズムは草案で提案されている段階で、RFCのTLS暗号スイートとしてはまだ定義されていない。
^ a b 認証のみ、暗号化なし
廃止されたアルゴリズム
Notes
^ a b c d IDEAとDESはTLS 1.2から排除[ 49]
^ a b c d e f 特定の強力な暗号化アルゴリズムを含む暗号化ソフトウェアの輸出に関する米国の規制を遵守するために、40ビット強度の暗号スイートが短縮された鍵長で動作するように設計されている。これらの弱いスイートはTLS 1.1以降では禁止
^ a b RC4攻撃によりSSL/TLSで使用されるRC4は安全でないとされる。RC4の使用はRFC 7465 で禁止されている
^ a b RC4攻撃によりSSL/TLSで使用されるRC4は安全でないとされる。RC4の使用はRFC 7465 で禁止されている
サポートされている楕円曲線
このセクションでは、各実装でサポートされている楕円曲線をリストする。
実装
sect163k1NIST K-163 (1)[ 24]
sect163r1 (2)[ 24]
sect163r2NIST B-163 (3)[ 24]
sect193r1 (4)[ 24]
sect193r2 (5)[ 24]
sect233k1NIST K-233 (6)[ 24]
sect233r1NIST B-233 (7)[ 24]
sect239k1 (8)[ 24]
sect283k1NIST K-283 (9)[ 24]
sect283r1NIST B-283 (10)[ 24]
sect409k1NIST K-409 (11)[ 24]
sect409r1NIST B-409 (12)[ 24]
sect571k1NIST K-571 (13)[ 24]
sect571r1NIST B-571 (14)[ 24]
GnuTLS
No
No
No
No
No
No
No
No
No
No
No
No
No
No
OpenSSL
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
wolfSSL
No
No
No
No
No
No
No
No
No
No
No
No
No
No
実装
sect163k1NIST K-163 (1)[ 24]
sect163r1 (2)[ 24]
sect163r2NIST B-163 (3)[ 24]
sect193r1 (4)[ 24]
sect193r2 (5)[ 24]
sect233k1NIST K-233 (6)[ 24]
sect233r1NIST B-233 (7)[ 24]
sect239k1 (8)[ 24]
sect283k1NIST K-283 (9)[ 24]
sect283r1NIST B-283 (10)[ 24]
sect409k1NIST K-409 (11)[ 24]
sect409r1NIST B-409 (12)[ 24]
sect571k1NIST K-571 (13)[ 24]
sect571r1NIST B-571 (14)[ 24]
実装
secp160k1 (15)[ 24]
secp160r1 (16)[ 24]
secp160r2 (17)[ 24]
secp192k1 (18)[ 24]
secp192r1 prime192v1NIST P-192 (19)[ 24]
secp224k1 (20)[ 24]
secp224r1NIST P-244 (21)[ 24]
secp256k1 (22)[ 24]
secp256r1 prime256v1NIST P-256 (23)[ 24]
secp384r1NIST P-384 (24)[ 24]
secp521r1NIST P-521 (25)[ 24]
arbitrary prime curves (0xFF01)[ 24] [ 52]
arbitrary char2 curves (0xFF02)[ 24] [ 52]
GnuTLS
No
No
No
No
Yes
No
Yes
No
Yes
Yes
Yes
No
No
OpenSSL
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
No
No
wolfSSL
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
No
No
実装
secp160k1 (15)[ 24]
secp160r1 (16)[ 24]
secp160r2 (17)[ 24]
secp192k1 (18)[ 24]
secp192r1 prime192v1NIST P-192 (19)[ 24]
secp224k1 (20)[ 24]
secp224r1NIST P-244 (21)[ 24]
secp256k1 (22)[ 24]
secp256r1 prime256v1NIST P-256 (23)[ 24]
secp384r1NIST P-384 (24)[ 24]
secp521r1NIST P-521 (25)[ 24]
arbitrary prime curves (0xFF01)[ 24] [ 52]
arbitrary char2 curves (0xFF02)[ 24] [ 52]
実装
brainpoolP256r1 (26)[ 53]
brainpoolP384r1 (27)[ 53]
brainpoolP512r1 (28)[ 53]
X25519 [ 54]
Curve448Ed448-Goldilocks [ 55]
M221 Curve2213[ 56]
E222[ 56]
Curve1174[ 56]
E382[ 56]
M383[ 56]
Curve383187[ 56]
Curve41417 Curve3617[ 56]
M511 Curve511187[ 56]
E521[ 56]
GnuTLS
No
No
No
Yes[ 57]
No
No
No
No
No
No
No
No
No
No
OpenSSL
Yes[ 17]
Yes[ 17]
Yes[ 17]
Yes[ 58] [ 59]
Yes[ 60] [ 61]
No
No
No
No
No
No
No
No
No
wolfSSL
Yes
Yes
Yes
Yes[ 62]
No
No
No
No
No
No
No
No
No
No
実装
brainpoolP256r1 (26)
brainpoolP384r1 (27)
brainpoolP512r1 (28)
Curve25519
Curve448Ed448-Goldilocks
M221 Curve2213
E222
Curve1174
E382
M383
Curve383187
Curve41417 Curve3617
M511 Curve511187
E521[ 56]
データの完全性
圧縮
CRIME攻撃 はTLS圧縮を利用するため、慎重な実装ではTLSレベルでの圧縮は使用していない。また、HTTP圧縮は無関係でこの攻撃の影響は受けないが、関連するBREACH攻撃 によって悪用される点に注意が必要である。
拡張機能
各実装がサポートする拡張機能をリストする。安全な再ネゴシエーション拡張(Secure Renegotiation
extension)はHTTPSクライアントセキュリティにとって重要な意味を持つ。クライアントがTLS再ネゴシエーション(TLS renegotiation)を実装しているかどうかにかかわらず、この拡張を実装していないTLSクライアントは攻撃に対して脆弱である。
アシスト暗号
このセクションでは、暗号化を最適化するCPU命令セットの利点を生かした実装、ハードウェア暗号やデータ分離のためのシステム固有のデバイス利用について示す。
システム固有のバックエンド
使用可能なオペレーティングシステム固有のバックエンド、または別の実装によって提供されるバックエンドを利用する実装の機能を示す。
暗号モジュール/トークンのサポート
実装
TPM support
Hardware token support
Objects identified via
GnuTLS
Yes
PKCS11
RFC7512 PKCS #11 URLs[ 87]
OpenSSL
Yes
PKCS11 (サードパーティモジュール経由)[ 88]
RFC7512 PKCS #11 URLs[ 87]
wolfSSL
No
No
実装
TPM support
Hardware token support
Objects identified via
コードの依存関係
実装
依存
オプションの 依存
GnuTLS
libc nettle gmp
zlib (compression) p11-kit (PKCS #11) trousers (TPM)
OpenSSL
libc
zlib (compression)
wolfSSL
None
libc, zlib (compression)
実装
依存
オプションの 依存
開発環境
実装
Namespace
ビルドツール
API マニュアル
バックエンド暗号
Template:OpenSSL互換レイヤ
GnuTLS
gnutls_*
Autoconf, automake, libtool
マニュアルとAPIリファレンス(HTML, PDF)
外部, libnettle
Yes (limited)
OpenSSL
SSL_*
SHA1_*
MD5_*
EVP_*
...
Makefile
Man pages
含まれる (monolithic)
N/A
wolfSSL
CyaSSL_*
SSL_*
Autoconf, automake, libtool, MSVC project workspaces, XCode projects, CodeWarrior projects, MPLAB X projects, Keil, IAR, Clang, GCC
マニュアルとAPIリファレンス(HTML, PDF)
含まれる (monolithic)
Yes (約10%のAPI)
実装
Namespace
ビルドツール
API マニュアル
バックエンド暗号
OpenSSL互換レイヤ
移植性に関する懸念
実装
プラットフォーム要件
ネットワーク要件
スレッドの安全性
ランダムシード
クロスコンパイル
No OS (ベアメタル)
サポートOS
GnuTLS
C89
POSIX send()とrecv(). API to supply your own replacement.
スレッドセーフ、POSIXかWindowsでない場合、カスタムmutexでフック
プラットフォームによる
Yes
No
POSIXプラットフォーム、Windows、GNU/Linux, Win32/64, OS X, Solaris, OpenWRT, FreeBSD, NetBSD, OpenBSDなどの一般的にテストされたプラットフォーム
OpenSSL
C89[ 脚注 1]
?
mutexのコールバックが必要
ネイティブAPI経由
Yes
No
Unix, DOS (with djgpp), Windows, OpenVMS, MacOS, NetWare, eCos
wolfSSL
C89
POSIX send()とrecv(). API to supply your own replacement.
スレッドセーフ、PThreadsかWinThreadsがなければmutexでフック。オフに設定可
wolfCryptでランダムシード
Yes
Yes
Win32/64, Linux, OS X, Solaris, ThreadX, VxWorks, FreeBSD, NetBSD, OpenBSD, embedded Linux, Yocto Project, OpenEmbedded, WinCE, Haiku, OpenWRT, iPhone (iOS), Android, Nintendo Wii and Gamecube through DevKitPro, QNX, MontaVista, NonStop, TRON/ITRON/µITRON, Micrium µC/OS-III, FreeRTOS, SafeRTOS, NXP/Freescale MQX, Nucleus, TinyOS, HP/UX, AIX, ARC MQX, Keil RTX, TI-RTOS, uTasker, embOS, INtime, Mbed, uT-Kernel, RIOT, CMSIS-RTOS, FROSTED, Green Hills INTEGRITY, TOPPERS, PetaLinux, Apache mynewt
実装
プラットフォーム要件
ネットワーク要件
スレッドの安全性
ランダムシード
クロスコンパイル
No OS (ベアメタル)
サポートOS
関連
SCTP — DTLS サポートあり
DCCP — DTLS サポートあり
SRTP — DTLS サポートあり(DTLS-SRTP)、SRTCP
参照
^ “gnutls 3.8.9 ” (2025年2月8日). 2025年3月4日閲覧。
^ “OpenSSL: Releases openssl/openssl ”. 2025年4月23日閲覧。
^ “wolfSSL ChangeLog ”. 2025年2月7日閲覧。
^ a b “draft-hickman-netscape-ssl-00 ”. tools.ietf.org . 2015年1月25日閲覧。
^ a b RFC 6101
^ a b RFC 2246
^ a b RFC 4346
^ a b c d e f g h i j k l RFC 5246
^ a b draft-ietf-tls-tls13-11 - The Transport Layer Security (TLS) Protocol Version 1.3
^ a b “tlswg/tls13-spec branches ”. tlswg.github.io . 2018年1月20日閲覧。
^ a b RFC 4347
^ a b RFC 6347
^ a b c d e f “[gnutls-devel GnuTLS 3.4.0 released]” (2015年4月8日). 2015年4月16日閲覧。
^ “[gnutls-help gnutls 3.6.4]” (2018年9月24日). 2020年3月12日閲覧。
^ a b c d e f g h i j k l Inc., OpenSSL Foundation,. “/news/openssl-1.1.0-notes.html ”. www.openssl.org . 2018年1月20日閲覧。
^ a b “Major changes between OpenSSL 1.0.0h and OpenSSL 1.0.1 [14 Mar 2012 ]” (2012年3月14日). 2014年12月5日時点のオリジナル よりアーカイブ。2015年1月20日閲覧。
^ a b c d e f “Major changes between OpenSSL 1.0.1l and OpenSSL 1.0.2 [22 Jan 2015 ]”. 2014年9月4日時点のオリジナル よりアーカイブ。2015年1月22日閲覧。
^ “[wolfssl wolfSSL 3.6.6 Released]” (2015年8月20日). 2015年8月24日閲覧。
^ “[wolfssl wolfSSL TLS 1.3 support updated to draft 23]” (2018年3月12日). 2018年3月12日閲覧。
^ “Search - Cryptographic Module Validation Program - CSRC ”. csrc.nist.gov . 2018年1月20日閲覧。
^ "While, as a free software project, we are not actively pursuing this kind of certification, GnuTLS has been FIPS-140-2 certified in several systems by third parties." GnuTLS 3.5.6 B.5 Certification
^ “OpenSSL and FIPS 140-2 ”. 2014年11月15日閲覧。
^ “wolfCrypt FIPS 140-2 Information - wolfSSL Embedded SSL/TLS Library ”. 2015年1月24日閲覧。
^ a b c d e f g h i j k l m n o p q r s t u v w x y z aa ab ac ad ae af ag ah ai aj ak al am an ao ap aq ar as at au av aw ax ay az ba bb bc bd be bf bg bh bi bj bk bl RFC 4492
^ a b c d e f draft-chudov-cryptopro-cptls-04 - GOST 28147-89 Cipher Suites for Transport Layer Security (TLS)
^ a b c d openssl/engines/ccgost/README.gost [リンク切れ ]
^ a b c d e f RFC 5054
^ a b c d e f RFC 4279
^ a b RFC 5489
^ a b RFC 2712
^ “Changes between 0.9.6h and 0.9.7 [31 Dec 2002 ]”. 2016年1月29日閲覧。
^ a b “Changes between 0.9.8n and 1.0.0 [29 Mar 2010 ]”. 2016年1月29日閲覧。
^ “wolfSSL (Formerly CyaSSL) Release 3.9.0 (03/18/2016) ” (2016年3月18日). 2016年4月5日閲覧。
^ a b RFC 5280
^ a b c RFC 3280
^ a b RFC 2560
^ a b RFC 6698 , RFC 7218
^ a b RFC 5288 , RFC 5289
^ a b RFC 6655 , RFC 7251
^ a b RFC 6367
^ a b RFC 5932 , RFC 6367
^ a b c d RFC 6209
^ a b RFC 4162
^ a b “Sweet32: Birthday attacks on 64-bit block ciphers in TLS and OpenVPN ”. sweet32.info . 2016年8月24日閲覧。
^ a b RFC 7905
^ “gnutls 3.6.0 ” (2017年9月21日). 2018年1月7日閲覧。
^ “gnutls 3.4.12 ” (2016年5月20日). 2016年5月29日閲覧。
^ “openssl/CHANGES at OpenSSL_1_0_1-stable · openssl/openssl ”. 2015年1月20日閲覧。
^ RFC 5469
^ a b https://sweet32.info
^ a b “wolfSSL (Formerly CyaSSL) Release 3.7.0 (10/26/2015) ” (2015年10月26日). 2015年11月19日閲覧。
^ a b c d Negotiation of arbitrary curves has been shown to be insecure for certain curve sizes Mavrogiannopoulos, Nikos and Vercautern, Frederik and Velichkov, Vesselin and Preneel, Bart (2012). A cross-protocol attack on the TLS protocol. Proceedings of the 2012 ACM conference on Computer and communications security . pp. 62–72. ISBN 978-1-4503-1651-4 . https://www.cosic.esat.kuleuven.be/publications/article-2216.pdf
^ a b c RFC 7027
^ “Elliptic Curve Cryptography (ECC) Cipher Suites for Transport Layer Security (TLS) Versions 1.2 and Earlier ”. tools.ietf.org . 2016年12月9日閲覧。
^ “Curve25519 and Curve448 for Transport Layer Security (TLS) ”. tools.ietf.org . 2015年7月15日閲覧。
^ a b c d e f g h i j “Additional Elliptic Curves for Transport Layer Security (TLS) Key Agreement ”. tools.ietf.org . 2015年1月23日閲覧。
^ “"An overview of the new features in GnuTLS 3.5.0" ” (2016年5月2日). 2016年12月9日閲覧。
^ “OpenSSL 1.1.0x Release Notes ” (2016年8月25日). 2018年5月18日閲覧。
^ “OpenSSL GitHub Issue #487 Tracker ” (2015年12月2日). 2018年5月18日閲覧。
^ “OpenSSL 1.1.1x Release Notes ” (2018年5月1日). 2018年5月18日閲覧。
^ “OpenSSL GitHub Issue #5049 Tracker ” (2018年1月9日). 2018年5月18日閲覧。
^ “wolfSSL (Formerly CyaSSL) Release 3.4.6 (03/30/2015) ” (2015年3月30日). 2015年11月19日閲覧。
^ RFC 3749
^ RFC 5746
^ a b c d RFC 6066
^ RFC 7301
^ RFC 6091
^ RFC 4680
^ RFC 5077
^ RFC 5705
^ RFC 7366
^ RFC 7507
^ RFC 7627
^ RFC 7685
^ a b RFC 7250
^ “gnutls 3.2.0 ”. 2015年1月26日閲覧。
^ https://lists.gnupg.org/pipermail/gnutls-devel/2017-February/008309.html
^ “gnutls 3.4.4 ”. 2015年8月25日閲覧。
^ “%DUMBFW priority keyword ”. 2017年4月30日閲覧。
^ http://www.openssl.org/news/secadv_20141015.txt
^ “OpenSSL 1.1.0 Release Notes ”. 2017年11月29日閲覧。
^ “Major changes between OpenSSL 1.0.1f and OpenSSL 1.0.1g [7 Apr 2014 ]” (2014年4月7日). 2015年1月20日時点のオリジナル よりアーカイブ。2015年2月10日閲覧。
^ https://lists.gnupg.org/pipermail/gnutls-devel/2016-October/008194.html
^ https://habrahabr.ru/post/134725/ , http://forum.rutoken.ru/topic/1639/ , https://dev.rutoken.ru/pages/viewpage.action?pageId=18055184 (ロシア語)
^ “git.openssl.org Git - openssl.git/commitdiff ”. git.openssl.org . 2015年1月24日閲覧。
^ “wolfSSL Asynchronous Intel QuickAssist Support - wolfSSL ” (2017年1月18日). 2018年1月20日閲覧。
^ a b RFC 7512
^ “libp11: PKCS#11 wrapper library ” (2018年1月19日). 2018年1月20日閲覧。
脚注
^ 完全にC89の枠内で記述されているわけではない。C99以降の文法、たとえばブロックの先頭以外で変数を宣言するなどの文法は用いず、古いコンパイラにも配慮した形式となってはいるが、C99で新規導入されたヘッダファイルであるstdint.hとそれが定義するビット長を明示する整数型(int8_t, int16_t, int32_tなど)を用いるため、C89にしか準拠していない開発環境ではstdint.h相当のものをユーザが準備する必要がある。また、OpenSSL 3.0以降はC言語規格で標準化されていない#pragma once
を多くのヘッダファイルが含むため、これをサポートしていない古いコンパイラ(GCCでは3.4未満)では処理できないソースとなっている。