はじめに
現在様々な分野で使用されている暗号について、その暗号方式問題なく使用できるものかどうかを知りたい。
そのような時に、CRYPTREC
の暗号リストを知った。
これを利用することで、暗号方式が推奨されているものかを確認することができる。
CRYPTRECとは
https://www.cryptrec.go.jp/about.htmlCRYPTREC暗号リスト (電子政府推奨暗号リスト)
https://www.cryptrec.go.jp/list.html
今回は、Webサーバ(Apache) にてHTTPS
通信の暗号化時の暗号スイートをCRYPTREC暗号リストに準拠できるように設定してみる。
環境
Apache 2.4.58
Tomcat 9.0.85
openssl 1.0.2k-fips
Docker Desktop 4.28.0 (139021)
Docker version 25.0.3
準備
例によって、Docker
での検証を行う。
今回は、Apache+TomcatをAJPで連携している構成でHTTP/2プロトコルを使えるようにするで使用したリポジトリをいじって設定を行う。
設定にあたり確認する資料
TLS暗号設定ガイドライン 安全なウェブサイトのために(暗号設定対策編)
https://www.ipa.go.jp/security/crypto/guideline/ssl_crypt_config.htmlTLS 暗号設定 暗号スイートの設定例
https://www.ipa.go.jp/security/crypto/guideline/gmcbt80000005ufv-att/tls_cipher_suite_config_20200707.pdfSSL Configuration Generator
https://ssl-config.mozilla.org/
暗号スイートとは?
暗号スイートとは、TLSで使用する暗号アルゴリズムのセットである。
HTTPS通信において、TCPの3wayハンドシェイク(SYN-SYN+ACK-ACK)後に行われる、TLSハンドシェイクの際に暗号スイートが決定される。
ここでクライアントとサーバ側で暗号方式を決めて、その方式に従って通信の内容を暗号化するというもの。
TLS | SSLハンドシェイクの プロセスは?
https://www.cloudflare.com/ja-jp/learning/ssl/what-happens-in-a-tls-handshake/Cipher suite (暗号スイート)
https://developer.mozilla.org/ja/docs/Glossary/Cipher_suite暗号化スイートを調べてみた
https://qiita.com/miyuki_samitani/items/f3c1572f426176bce3dd
Apacheで使用できる暗号スイートは?
バージョン調査
今回使用するDockerのコンテナを立ち上げ、下記コマンドで調査を行った。
bash-4.2# cat /etc/os-release
NAME="Amazon Linux"
VERSION="2"
ID="amzn"
ID_LIKE="centos rhel fedora"
VERSION_ID="2"
PRETTY_NAME="Amazon Linux 2"
ANSI_COLOR="0;33"
CPE_NAME="cpe:2.3:o:amazon:amazon_linux:2"
HOME_URL="https://amazonlinux.com/"
SUPPORT_END="2025-06-30"
OpenSSLバージョン確認
bash-4.2# openssl version
OpenSSL 1.0.2k-fips 26 Jan 2017
※古いので、TLS1.3には対応していない。
Apacheバージョン確認
bash-4.2# httpd -v
Server version: Apache/2.4.58 ()
Server built: Oct 26 2023 20:09:34
OpenSSLで使用できる暗号スイートの確認
bash-4.2# openssl ciphers -v
ECDHE-RSA-AES256-GCM-SHA384 TLSv1.2 Kx=ECDH Au=RSA Enc=AESGCM(256) Mac=AEAD
ECDHE-ECDSA-AES256-GCM-SHA384 TLSv1.2 Kx=ECDH Au=ECDSA Enc=AESGCM(256) Mac=AEAD
ECDHE-RSA-AES256-SHA384 TLSv1.2 Kx=ECDH Au=RSA Enc=AES(256) Mac=SHA384
ECDHE-ECDSA-AES256-SHA384 TLSv1.2 Kx=ECDH Au=ECDSA Enc=AES(256) Mac=SHA384
ECDHE-RSA-AES256-SHA SSLv3 Kx=ECDH Au=RSA Enc=AES(256) Mac=SHA1
ECDHE-ECDSA-AES256-SHA SSLv3 Kx=ECDH Au=ECDSA Enc=AES(256) Mac=SHA1
DH-DSS-AES256-GCM-SHA384 TLSv1.2 Kx=DH/DSS Au=DH Enc=AESGCM(256) Mac=AEAD
DHE-DSS-AES256-GCM-SHA384 TLSv1.2 Kx=DH Au=DSS Enc=AESGCM(256) Mac=AEAD
DH-RSA-AES256-GCM-SHA384 TLSv1.2 Kx=DH/RSA Au=DH Enc=AESGCM(256) Mac=AEAD
DHE-RSA-AES256-GCM-SHA384 TLSv1.2 Kx=DH Au=RSA Enc=AESGCM(256) Mac=AEAD
DHE-RSA-AES256-SHA256 TLSv1.2 Kx=DH Au=RSA Enc=AES(256) Mac=SHA256
DHE-DSS-AES256-SHA256 TLSv1.2 Kx=DH Au=DSS Enc=AES(256) Mac=SHA256
DH-RSA-AES256-SHA256 TLSv1.2 Kx=DH/RSA Au=DH Enc=AES(256) Mac=SHA256
DH-DSS-AES256-SHA256 TLSv1.2 Kx=DH/DSS Au=DH Enc=AES(256) Mac=SHA256
DHE-RSA-AES256-SHA SSLv3 Kx=DH Au=RSA Enc=AES(256) Mac=SHA1
DHE-DSS-AES256-SHA SSLv3 Kx=DH Au=DSS Enc=AES(256) Mac=SHA1
DH-RSA-AES256-SHA SSLv3 Kx=DH/RSA Au=DH Enc=AES(256) Mac=SHA1
DH-DSS-AES256-SHA SSLv3 Kx=DH/DSS Au=DH Enc=AES(256) Mac=SHA1
DHE-RSA-CAMELLIA256-SHA SSLv3 Kx=DH Au=RSA Enc=Camellia(256) Mac=SHA1
DHE-DSS-CAMELLIA256-SHA SSLv3 Kx=DH Au=DSS Enc=Camellia(256) Mac=SHA1
DH-RSA-CAMELLIA256-SHA SSLv3 Kx=DH/RSA Au=DH Enc=Camellia(256) Mac=SHA1
DH-DSS-CAMELLIA256-SHA SSLv3 Kx=DH/DSS Au=DH Enc=Camellia(256) Mac=SHA1
ECDH-RSA-AES256-GCM-SHA384 TLSv1.2 Kx=ECDH/RSA Au=ECDH Enc=AESGCM(256) Mac=AEAD
ECDH-ECDSA-AES256-GCM-SHA384 TLSv1.2 Kx=ECDH/ECDSA Au=ECDH Enc=AESGCM(256) Mac=AEAD
ECDH-RSA-AES256-SHA384 TLSv1.2 Kx=ECDH/RSA Au=ECDH Enc=AES(256) Mac=SHA384
ECDH-ECDSA-AES256-SHA384 TLSv1.2 Kx=ECDH/ECDSA Au=ECDH Enc=AES(256) Mac=SHA384
ECDH-RSA-AES256-SHA SSLv3 Kx=ECDH/RSA Au=ECDH Enc=AES(256) Mac=SHA1
ECDH-ECDSA-AES256-SHA SSLv3 Kx=ECDH/ECDSA Au=ECDH Enc=AES(256) Mac=SHA1
AES256-GCM-SHA384 TLSv1.2 Kx=RSA Au=RSA Enc=AESGCM(256) Mac=AEAD
AES256-SHA256 TLSv1.2 Kx=RSA Au=RSA Enc=AES(256) Mac=SHA256
AES256-SHA SSLv3 Kx=RSA Au=RSA Enc=AES(256) Mac=SHA1
CAMELLIA256-SHA SSLv3 Kx=RSA Au=RSA Enc=Camellia(256) Mac=SHA1
PSK-AES256-CBC-SHA SSLv3 Kx=PSK Au=PSK Enc=AES(256) Mac=SHA1
ECDHE-RSA-AES128-GCM-SHA256 TLSv1.2 Kx=ECDH Au=RSA Enc=AESGCM(128) Mac=AEAD
ECDHE-ECDSA-AES128-GCM-SHA256 TLSv1.2 Kx=ECDH Au=ECDSA Enc=AESGCM(128) Mac=AEAD
ECDHE-RSA-AES128-SHA256 TLSv1.2 Kx=ECDH Au=RSA Enc=AES(128) Mac=SHA256
ECDHE-ECDSA-AES128-SHA256 TLSv1.2 Kx=ECDH Au=ECDSA Enc=AES(128) Mac=SHA256
ECDHE-RSA-AES128-SHA SSLv3 Kx=ECDH Au=RSA Enc=AES(128) Mac=SHA1
ECDHE-ECDSA-AES128-SHA SSLv3 Kx=ECDH Au=ECDSA Enc=AES(128) Mac=SHA1
DH-DSS-AES128-GCM-SHA256 TLSv1.2 Kx=DH/DSS Au=DH Enc=AESGCM(128) Mac=AEAD
DHE-DSS-AES128-GCM-SHA256 TLSv1.2 Kx=DH Au=DSS Enc=AESGCM(128) Mac=AEAD
DH-RSA-AES128-GCM-SHA256 TLSv1.2 Kx=DH/RSA Au=DH Enc=AESGCM(128) Mac=AEAD
DHE-RSA-AES128-GCM-SHA256 TLSv1.2 Kx=DH Au=RSA Enc=AESGCM(128) Mac=AEAD
DHE-RSA-AES128-SHA256 TLSv1.2 Kx=DH Au=RSA Enc=AES(128) Mac=SHA256
DHE-DSS-AES128-SHA256 TLSv1.2 Kx=DH Au=DSS Enc=AES(128) Mac=SHA256
DH-RSA-AES128-SHA256 TLSv1.2 Kx=DH/RSA Au=DH Enc=AES(128) Mac=SHA256
DH-DSS-AES128-SHA256 TLSv1.2 Kx=DH/DSS Au=DH Enc=AES(128) Mac=SHA256
DHE-RSA-AES128-SHA SSLv3 Kx=DH Au=RSA Enc=AES(128) Mac=SHA1
DHE-DSS-AES128-SHA SSLv3 Kx=DH Au=DSS Enc=AES(128) Mac=SHA1
DH-RSA-AES128-SHA SSLv3 Kx=DH/RSA Au=DH Enc=AES(128) Mac=SHA1
DH-DSS-AES128-SHA SSLv3 Kx=DH/DSS Au=DH Enc=AES(128) Mac=SHA1
DHE-RSA-SEED-SHA SSLv3 Kx=DH Au=RSA Enc=SEED(128) Mac=SHA1
DHE-DSS-SEED-SHA SSLv3 Kx=DH Au=DSS Enc=SEED(128) Mac=SHA1
DH-RSA-SEED-SHA SSLv3 Kx=DH/RSA Au=DH Enc=SEED(128) Mac=SHA1
DH-DSS-SEED-SHA SSLv3 Kx=DH/DSS Au=DH Enc=SEED(128) Mac=SHA1
DHE-RSA-CAMELLIA128-SHA SSLv3 Kx=DH Au=RSA Enc=Camellia(128) Mac=SHA1
DHE-DSS-CAMELLIA128-SHA SSLv3 Kx=DH Au=DSS Enc=Camellia(128) Mac=SHA1
DH-RSA-CAMELLIA128-SHA SSLv3 Kx=DH/RSA Au=DH Enc=Camellia(128) Mac=SHA1
DH-DSS-CAMELLIA128-SHA SSLv3 Kx=DH/DSS Au=DH Enc=Camellia(128) Mac=SHA1
ECDH-RSA-AES128-GCM-SHA256 TLSv1.2 Kx=ECDH/RSA Au=ECDH Enc=AESGCM(128) Mac=AEAD
ECDH-ECDSA-AES128-GCM-SHA256 TLSv1.2 Kx=ECDH/ECDSA Au=ECDH Enc=AESGCM(128) Mac=AEAD
ECDH-RSA-AES128-SHA256 TLSv1.2 Kx=ECDH/RSA Au=ECDH Enc=AES(128) Mac=SHA256
ECDH-ECDSA-AES128-SHA256 TLSv1.2 Kx=ECDH/ECDSA Au=ECDH Enc=AES(128) Mac=SHA256
ECDH-RSA-AES128-SHA SSLv3 Kx=ECDH/RSA Au=ECDH Enc=AES(128) Mac=SHA1
ECDH-ECDSA-AES128-SHA SSLv3 Kx=ECDH/ECDSA Au=ECDH Enc=AES(128) Mac=SHA1
AES128-GCM-SHA256 TLSv1.2 Kx=RSA Au=RSA Enc=AESGCM(128) Mac=AEAD
AES128-SHA256 TLSv1.2 Kx=RSA Au=RSA Enc=AES(128) Mac=SHA256
AES128-SHA SSLv3 Kx=RSA Au=RSA Enc=AES(128) Mac=SHA1
SEED-SHA SSLv3 Kx=RSA Au=RSA Enc=SEED(128) Mac=SHA1
CAMELLIA128-SHA SSLv3 Kx=RSA Au=RSA Enc=Camellia(128) Mac=SHA1
PSK-AES128-CBC-SHA SSLv3 Kx=PSK Au=PSK Enc=AES(128) Mac=SHA1
ECDHE-RSA-DES-CBC3-SHA SSLv3 Kx=ECDH Au=RSA Enc=3DES(168) Mac=SHA1
ECDHE-ECDSA-DES-CBC3-SHA SSLv3 Kx=ECDH Au=ECDSA Enc=3DES(168) Mac=SHA1
EDH-RSA-DES-CBC3-SHA SSLv3 Kx=DH Au=RSA Enc=3DES(168) Mac=SHA1
EDH-DSS-DES-CBC3-SHA SSLv3 Kx=DH Au=DSS Enc=3DES(168) Mac=SHA1
DH-RSA-DES-CBC3-SHA SSLv3 Kx=DH/RSA Au=DH Enc=3DES(168) Mac=SHA1
DH-DSS-DES-CBC3-SHA SSLv3 Kx=DH/DSS Au=DH Enc=3DES(168) Mac=SHA1
ECDH-RSA-DES-CBC3-SHA SSLv3 Kx=ECDH/RSA Au=ECDH Enc=3DES(168) Mac=SHA1
ECDH-ECDSA-DES-CBC3-SHA SSLv3 Kx=ECDH/ECDSA Au=ECDH Enc=3DES(168) Mac=SHA1
DES-CBC3-SHA SSLv3 Kx=RSA Au=RSA Enc=3DES(168) Mac=SHA1
IDEA-CBC-SHA SSLv3 Kx=RSA Au=RSA Enc=IDEA(128) Mac=SHA1
PSK-3DES-EDE-CBC-SHA SSLv3 Kx=PSK Au=PSK Enc=3DES(168) Mac=SHA1
KRB5-IDEA-CBC-SHA SSLv3 Kx=KRB5 Au=KRB5 Enc=IDEA(128) Mac=SHA1
KRB5-DES-CBC3-SHA SSLv3 Kx=KRB5 Au=KRB5 Enc=3DES(168) Mac=SHA1
KRB5-IDEA-CBC-MD5 SSLv3 Kx=KRB5 Au=KRB5 Enc=IDEA(128) Mac=MD5
KRB5-DES-CBC3-MD5 SSLv3 Kx=KRB5 Au=KRB5 Enc=3DES(168) Mac=MD5
ECDHE-RSA-RC4-SHA SSLv3 Kx=ECDH Au=RSA Enc=RC4(128) Mac=SHA1
ECDHE-ECDSA-RC4-SHA SSLv3 Kx=ECDH Au=ECDSA Enc=RC4(128) Mac=SHA1
ECDH-RSA-RC4-SHA SSLv3 Kx=ECDH/RSA Au=ECDH Enc=RC4(128) Mac=SHA1
ECDH-ECDSA-RC4-SHA SSLv3 Kx=ECDH/ECDSA Au=ECDH Enc=RC4(128) Mac=SHA1
RC4-SHA SSLv3 Kx=RSA Au=RSA Enc=RC4(128) Mac=SHA1
RC4-MD5 SSLv3 Kx=RSA Au=RSA Enc=RC4(128) Mac=MD5
PSK-RC4-SHA SSLv3 Kx=PSK Au=PSK Enc=RC4(128) Mac=SHA1
KRB5-RC4-SHA SSLv3 Kx=KRB5 Au=KRB5 Enc=RC4(128) Mac=SHA1
KRB5-RC4-MD5 SSLv3 Kx=KRB5 Au=KRB5 Enc=RC4(128) Mac=MD5
上記は、SSL/TLSプロトコルで使用される様々な暗号スイートのリストとなっている。 各行は1つの暗号スイートを表しており、以下の項目で構成されています。
- 暗号スイート名
- 使用するプロトコルのバージョン (TLSv1.2、SSLv3など)
- 鍵交換 (Kx) アルゴリズム
- 認証 (Au) アルゴリズム
- 暗号化 (Enc) アルゴリズムと強度
- メッセージ認証 (Mac) アルゴリズム
例えば、最初の行のECDHE-RSA-AES256-GCM-SHA384 TLSv1.2 Kx=ECDH Au=RSA Enc=AESGCM(256) Mac=AEAD
は、TLSv1.2で使用される暗号スイートで、楕円曲線DiffieHellman
と RSA鍵交換
、AES-256ビット暗号化
、GCM認証
を使用することを示している。
TLSv1.2以上が現在は推奨されているので、以前のプロトコルで使用されている暗号スイートは使用しないこととする。
CRYPTRECで利用できる暗号スイートは?
では、上記調査した上で利用できる暗号スイートについて確認してみる。
- CRYPTREC暗号の仕様書
https://www.cryptrec.go.jp/method.html
では先ほど見たOpenSSLの暗号スイートのリストから上から見ていく。
- 暗号スイート名
これは名前なのでスルー
- 使用するプロトコルのバージョン (TLSv1.2、SSLv3など)
これは、TLS1.2のものを選ぶ。
- 鍵交換 (Kx) アルゴリズム
鍵交換アルゴリズムは、DH
, ECDH
が推奨されている。
- 認証 (Au) アルゴリズム
- 暗号化 (Enc) アルゴリズムと強度
公開鍵暗号、共通鍵暗号の中から選ぶ。
- メッセージ認証 (Mac) アルゴリズム
ハッシュ関数、メッセージ認証コードの中から選んでいく。
上記まとめると以下が使用できる。
ECDHE-RSA-AES256-GCM-SHA384 TLSv1.2
ECDHE-ECDSA-AES256-GCM-SHA384 TLSv1.2
ECDHE-RSA-AES128-GCM-SHA256 TLSv1.2
ECDHE-ECDSA-AES128-GCM-SHA256 TLSv1.2
AES256-GCM-SHA384 TLSv1.2
AES128-GCM-SHA256 TLSv1.2
これらは全てTLSv1.2を使用し、認証にRSAまたはECDSA、暗号化にAES-GCMを採用した比較的新しく、強力な暗号スイートとなっている。CRYPTREC
では古いSSLv3や弱い暗号化アルゴリズムは推奨されていないため、このリストからは除外されている。
Apacheに設定する
上記で確認した上で、SSL Configuration Generator
サイトで自動生成してもらう。
今回は、Apache 2.4.58
, OpenSSL 1.0.2k-fips
を設定して生成する。
# intermediate configuration
SSLProtocol all -SSLv3 -TLSv1 -TLSv1.1
SSLCipherSuite ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384:DHE-RSA-CHACHA20-POLY1305
上記を設定して再起動する。
確認する
Chromeで https://localhost/sample にアクセスをし、F12キーで開発者ツールを開く。Security
タブを確認して、通信のアルゴリズムを確認する。
公開サーバでのチェック
公開サーバでの設定を変更したら下記でSSLの診断を行っておこう。
参考
CRYPTREC暗号の仕様書
https://www.cryptrec.go.jp/method.htmlCipher suite (暗号スイート)
https://developer.mozilla.org/ja/docs/Glossary/Cipher_suite暗号化スイートを調べてみた
https://qiita.com/miyuki_samitani/items/f3c1572f426176bce3ddTLS | SSLハンドシェイクの プロセスは?
https://www.cloudflare.com/ja-jp/learning/ssl/what-happens-in-a-tls-handshake/TLS暗号設定ガイドライン 安全なウェブサイトのために(暗号設定対策編)
https://www.ipa.go.jp/security/crypto/guideline/ssl_crypt_config.htmlTLS 暗号設定 暗号スイートの設定例
https://www.ipa.go.jp/security/crypto/guideline/gmcbt80000005ufv-att/tls_cipher_suite_config_20200707.pdfSSL Configuration Generator
https://ssl-config.mozilla.org/OpenSSLでの暗号スイートと指定方法を確認する(+Apache、nginxでのIPAガイド設定例含む))
https://kazuhira-r.hatenablog.com/entry/2021/08/31/00041678.9. Apache HTTP サーバーで対応している暗号の設定
https://access.redhat.com/documentation/ja-jp/red_hat_enterprise_linux/8/html/configuring_and_managing_identity_management/setting-the-supported-ciphers-on-an-apache-http-server_restricting-an-application-to-trust-a-subset-of-certs
おわりに
Apacheで暗号スイートの設定をしてみた。
今回は触り程度の理解の記事になったが、もう少し踏み込んでwireshark
での確認や使用している暗号アルゴリズムがどのような方式なのかを調査してみても面白そう。
また、パケットキャプチャ系に関してはZenn
で公開されている素晴らしい本があるので今度はこれを読んでみたい。
- パケットキャプチャで理解する TLS1.3
https://zenn.dev/arailly/books/41061020f0cfaa