してみるテストロゴ
Apache 2.4系でHTTP/2サーバを構築してみるテスト。

OpenSSL1.1.1について

OpenSSL1.1.1では、ついにTLSv1.3に対応します。

【2018-05-29追記】OpenSSL 1.1.1 pre7がリリースされましたので、更新しました。draft-28に対応しています。

【2018-06-21追記】OpenSSL 1.1.1 pre8がリリースされましたので、更新しました。

このページでは追加された主な機能を紹介します。

まだ、Apache httpd WebサーバはTLS1.3に対応していません。Apache httpd Webサーバと一緒に利用する場合はもう少しお待ちください。

Apache httpd Webサーバでも以下の設定でTLSv1.3が利用できます。

以下の通り、TLS1.3以外については、OpenSSL 1.1.1も利用できます。

インストール方法

OpenSSL1.0.2系との違いですが、ソースコンパイル時のデフォルトのインストール先が、/usr/local/ssl⇒/usr/localに変更になります。(これは、OpenSSL1.1.0と同じです。)

ライブラリのリンケージ順序が変わってしまうため、注意が必要です。

$ cd ~/src
$ curl -O https://www.openssl.org/source/openssl-1.1.1-pre8.tar.gz
$ gzip -dc openssl-1.1.1-pre8.tar.gz |tar xvf -
$ cd openssl-1.1.1-pre8
$ ./config
$ gmake
…(省略)…
$ sudo gmake install

Apache HTTPD Webサーバで使うには

詳細は、以下に書きましたので参考にしてください。

上記リンクを前提として、以下、X448/X25519への対応方法になります。

 

OpenSSL1.1.1では、ECDHEで使用する楕円曲線として、X25519の方が、prime256v1よりも優先されるようになっているようですが、Apache HTTP Webサーバは、まだX25519に対応していないため、手元の環境では起動に失敗してしまいます。

そのため、以下の方法で、ECDHEで使用する楕円曲線を明示的に指定することで、X25519を使用しないようにします。

また、Automaticの設定自体使えなくなっているようです。

いずれ、X25519も使えるようになるとは思いますが、もうすこし時間が必要になりそうです。

ECDHParametersを設定しなければ、X448とX25519がECDHEで使えるようです。

/usr/local/apache2/conf/extra/httpd-ssl.confの一部
…(省略)…
#SSLOpenSSLConfCmd ECDHParameters Automatic
SSLOpenSSLConfCmd Curves X448:X25519:secp384r1:prime256v1
…(省略)…

ちなみに、X448の接続は、以下のように確認できます。

/usr/local/bin/openssl s_client -tls1_3 -groups X448 -connect http2.try-and-test.net:443
CONNECTED(00000003)
depth=1 C = US, O = Let's Encrypt, CN = Let's Encrypt Authority X3
verify error:num=20:unable to get local issuer certificate
---
Certificate chain
 0 s:CN = http2.try-and-test.net
   i:C = US, O = Let's Encrypt, CN = Let's Encrypt Authority X3
 1 s:C = US, O = Let's Encrypt, CN = Let's Encrypt Authority X3
   i:O = Digital Signature Trust Co., CN = DST Root CA X3
---
Server certificate
-----BEGIN CERTIFICATE-----
(・・・省略・・・)
-----END CERTIFICATE-----
subject=CN = http2.try-and-test.net

issuer=C = US, O = Let's Encrypt, CN = Let's Encrypt Authority X3

---
No client certificate CA names sent
Peer signing digest: SHA256
Peer signature type: ECDSA
Server Temp Key: X448, 448 bits
---
SSL handshake has read 2937 bytes and written 342 bytes
Verification error: unable to get local issuer certificate
---
New, TLSv1.3, Cipher is TLS_AES_256_GCM_SHA384
Server public key is 256 bit
Secure Renegotiation IS NOT supported
Compression: NONE
Expansion: NONE
No ALPN negotiated
Early data was not sent
SSL-Session:
    Protocol  : TLSv1.3
    Cipher    : TLS_AES_256_GCM_SHA384
    Session-ID:
    Session-ID-ctx:
    Master-Key: (・・・省略・・・)
    PSK identity: None
    PSK identity hint: None
    SRP username: None
    Start Time: 1527205288
    Timeout   : 7200 (sec)
    Verify return code: 20 (unable to get local issuer certificate)
    Extended master secret: no
---
read:errno=0	

secp521r1(P-521)亡き後、X448は、実用上、当面の最強と思われる鍵交換なので、この対応はうれしいですね。

変更された主な機能

OpenSSL1.1.1の目玉はTLSv1.3対応です。細かく見ていきます。

追加された機能

OpenSSL1.1.1では、以下の機能が追加されました。

■TLSv1.3プロトコルの追加

■configdata.pmによるコンパイル設定データの表示に移行

たといば、GNU形式のmake variablesを見たい場合は、以下のようにコマンドを打ちます。

$ ./configdata.pm -m

Makevars:

    AR              = ar
    ARFLAGS         = r
    CC              = cc
    CFLAGS          = -Wall -O3 -pthread -Qunused-arguments
    CPPDEFINES      = DSO_DLFCN HAVE_DLFCN_H NDEBUG OPENSSL_NO_STATIC_ENGINE OPENSSL_PIC OPENSSL_CPUID_OBJ OPENSSL_IA32_SSE2 OPENSSL_BN_ASM_MONT OPENSSL_BN_ASM_MONT5 OPENSSL_BN_ASM_GF2m SHA1_ASM SHA256_ASM SHA512_ASM RC4_ASM MD5_ASM AES_ASM VPAES_ASM BSAES_ASM GHASH_ASM ECP_NISTZ256_ASM PADLOCK_ASM POLY1305_ASM
    CPPFLAGS        = -D_THREAD_SAFE -D_REENTRANT -DL_ENDIAN
    CPPINCLUDES     =
    CXXFLAGS        =
    HASHBANGPERL    = /usr/bin/env perl
    LDFLAGS         =
    LDLIBS          = -pthread
    RANLIB          = $(CROSS_COMPILE)ranlib
    RC              = windres

NOTE: These variables only represent the configuration view.  The build file
template may have processed these variables further, please have a look at the
build file for more exact data:
    Makefile

■GNU形式のmake variablesを使用

■STOREモジュール追加

■OSSL とOPENSSLの名前空間を宣言

複数素数RSA(RFC8017)に対応

■中国国家標準SM3(GB/T 32905-2016)に準拠

■中国国家標準SM4(GB/T 32907-2016)に準拠

AIRA共通鍵暗号の追加

■最大フラグメント長のTLS拡張ネゴシエーションをサポート

■SHA3を追加

■TLSv1.3におけるDSA証明書対応の終了

■openssl passwdコマンドにおけるSHA256/SHA512対応【2018年2月28日追記】

-5オプションでSHA256,-6オプションで、SHA512に対応したUnix Crypt形式(パスワードファイル形式)のダイジェストを出力してくれます。

以下、多くのLinuxなどのOSのパスワードファイルで使用されているSHA512形式のダイジェストを出力する方法です。

出力されたダイジェストが$6$から始まっていることから、SHA512のダイジェストですね。

$ /usr/local/bin/openssl passwd -6
Password:
Verifying - Password:
$6$k3X1e7VUE7OOAJgS$ZLxEl8d2v.XA20d4NZt7LCnLppbH5JcS2mNrtsLZHafs/AulvYp4AUk3vSvbYp1m28LEGCIe.wuMw7CqGbqHS.

■OSSL_STOREを拡張して、ロードされたオブジェクトのセットを検索して絞り込む機能の追加。【2018年2月28日追記】

 

暗号スイート関連

暗号スイート関連では、TLSv1.3向けに以下の追加が行われています。

■TLSv1.3形式の暗号スイートの追加

TLSv1.3では、暗号スイートの形式に大きな変更があります。

共通鍵暗号(AES/CHACHA120)と、そのメッセージ認証形式(GCM-SHA384等)を指定する形になります。

サーバ証明書の確認や、鍵交換の方式は暗号スイートに含まれません。

読み込んだサーバ証明書のアルゴリズムがそのまま使用されます。

DSA(DSS)は使えなくなるので、RSAか、ECDSAのいずれかになります。

鍵交換にはECDHEかDHEが使用されます。

# /usr/local/bin/openssl ciphers -v | grep TLS13
TLS13-AES-256-GCM-SHA384 TLSv1.3 Kx=any      Au=any  Enc=AESGCM(256) Mac=AEAD
TLS13-CHACHA20-POLY1305-SHA256 TLSv1.3 Kx=any      Au=any  Enc=CHACHA20/POLY1305(256) Mac=AEAD
TLS13-AES-128-GCM-SHA256 TLSv1.3 Kx=any      Au=any  Enc=AESGCM(128) Mac=AEAD

なお、OpenSSLのWebサイトには、TLS13-AES-128-CCM-8-SHA256とTLS13-AES-128-CCM-SHA256にも対応するとあったのですが、手元の環境でのビルドでは、こちらはまだ含まれていないようでした。

ちなみに、TLS13-AES-128-CCM-8-SHA256とTLS13-AES-128-CCM-SHA256は、「量子コンピュータ」対策の一環となります。

RSAやECDSAなどの公開鍵暗号方式は、量子コンピュータによって、従来よりも少ない演算によって解読できてしまうことは知られていますが、実は、共通鍵暗号にとっても、量子コンピュータは脅威です。

なかでも、量子コンピュータと「サイモンのアルゴリズム」によって、比較的少ない演算で、GCM-SHA等の一部メッセージ認証方式を偽造できる可能性があることが指摘されています。

このサイモンのアルゴリズムに対して耐性をもったメッセージ認証方式として、CCM(Counter with CBC-MAC)方式が知られています。

CCMの詳細は省きますが、CTRとCBC-MACを組み合わせたものです。

このCCM方式を含むTLSv1.3の暗号スイートはまだ使えないようですが、ベンチマークだけ取れたので、以下でご紹介します。

AES-128-CCMのベンチマーク

さっそくベンチマークを取ってみました。

最初にAES-128-CCM方式、続いて、現在主流のAES-128-GCM方式の共通鍵暗号のベンチマークです。

これを比較てしてみたいと思います。

$ /usr/local/bin/openssl speed -evp  aes-128-ccm
Doing aes-128-ccm for 3s on 16 size blocks: 13442376 aes-128-ccm's in 2.98s
Doing aes-128-ccm for 3s on 64 size blocks: 8880710 aes-128-ccm's in 2.58s
Doing aes-128-ccm for 3s on 256 size blocks: 4902024 aes-128-ccm's in 2.98s
Doing aes-128-ccm for 3s on 1024 size blocks: 1581120 aes-128-ccm's in 2.97s
Doing aes-128-ccm for 3s on 8192 size blocks: 208523 aes-128-ccm's in 2.91s
Doing aes-128-ccm for 3s on 16384 size blocks: 109788 aes-128-ccm's in 2.97s
OpenSSL 1.1.1-pre1 (alpha) 13 Feb 2018
built on: Tue Feb 13 23:40:46 2018 UTC
options:bn(64,64) rc4(16x,int) des(int) aes(partial) idea(int) blowfish(ptr)
compiler: cc -Wall -O3 -pthread -Qunused-arguments -DDSO_DLFCN -DHAVE_DLFCN_H -DNDEBUG -DOPENSSL_NO_STATIC_ENGINE -DOPENSSL_PIC -DOPENSSL_CPUID_OBJ -DOPENSSL_IA32_SSE2 -DOPENSSL_BN_ASM_MONT -DOPENSSL_BN_ASM_MONT5 -DOPENSSL_BN_ASM_GF2m -DSHA1_ASM -DSHA256_ASM -DSHA512_ASM -DRC4_ASM -DMD5_ASM -DAES_ASM -DVPAES_ASM -DBSAES_ASM -DGHASH_ASM -DECP_NISTZ256_ASM -DPADLOCK_ASM -DPOLY1305_ASM -D_THREAD_SAFE -D_REENTRANT -DL_ENDIAN
The 'numbers' are in 1000s of bytes per second processed.
type 16 bytes 64 bytes 256 bytes 1024 bytes 8192 bytes 16384 bytes
aes-128-ccm 72257.18k 220456.90k 420496.13k 545369.90k 587774.77k 605900.33k $ /usr/local/bin/openssl speed -evp aes-128-gcm Doing aes-128-gcm for 3s on 16 size blocks: 51061654 aes-128-gcm's in 2.96s
Doing aes-128-gcm for 3s on 64 size blocks: 35240473 aes-128-gcm's in 2.92s
Doing aes-128-gcm for 3s on 256 size blocks: 20157823 aes-128-gcm's in 2.98s
Doing aes-128-gcm for 3s on 1024 size blocks: 6395758 aes-128-gcm's in 2.98s
Doing aes-128-gcm for 3s on 8192 size blocks: 928141 aes-128-gcm's in 2.94s
Doing aes-128-gcm for 3s on 16384 size blocks: 483556 aes-128-gcm's in 2.98s
OpenSSL 1.1.1-pre1 (alpha) 13 Feb 2018
built on: Tue Feb 13 23:40:46 2018 UTC
options:bn(64,64) rc4(16x,int) des(int) aes(partial) idea(int) blowfish(ptr)
compiler: cc -Wall -O3 -pthread -Qunused-arguments -DDSO_DLFCN -DHAVE_DLFCN_H -DNDEBUG -DOPENSSL_NO_STATIC_ENGINE -DOPENSSL_PIC -DOPENSSL_CPUID_OBJ -DOPENSSL_IA32_SSE2 -DOPENSSL_BN_ASM_MONT -DOPENSSL_BN_ASM_MONT5 -DOPENSSL_BN_ASM_GF2m -DSHA1_ASM -DSHA256_ASM -DSHA512_ASM -DRC4_ASM -DMD5_ASM -DAES_ASM -DVPAES_ASM -DBSAES_ASM -DGHASH_ASM -DECP_NISTZ256_ASM -DPADLOCK_ASM -DPOLY1305_ASM -D_THREAD_SAFE -D_REENTRANT -DL_ENDIAN
The 'numbers' are in 1000s of bytes per second processed.
type 16 bytes 64 bytes 256 bytes 1024 bytes 8192 bytes 16384 bytes
aes-128-gcm 275921.55k 771898.27k 1729140.17k 2200275.05k 2588368.02k 2654687.00k

上記の通り、1024バイトのブロック処理の場合、CCM方式のパフォーマンスは、GCM方式の1/4となっています。

やはりGCM方式より重そうです。

とはいえ、背に腹はかえられないのがセキュリティ。悩みはつきません。

NEXT >> OpenSSL1.1.0について

©Copyrights 2015-2018, non-standard programmer

このサイトは、あくまでも私の個人的体験を、綴ったものです。 軽く参考程度にご利用ください。