昨今の通信の安全性は、SSL/TLSの設定が堅牢であることが前提になっています。しかし、SSL/TLS設定自体複雑であることが多く、考えて実装されていないケースを目の当たりにしています。
SSL/TLSの実装を行っている機器上で設定を確認するべきではありますが、外部からのスキャンによって、TLS暗号設定ガイドラインの推奨セキュリティ型チェックリストにどう一致しているのか確認すればよいのかまとめました。
本記事では、IPA「TLS暗号設定ガイドライン【推奨セキュリティ型チェックリスト】」について、nmapとOpenSSLを利用して外部から確認する方法を紹介します。
主に以下を確認できます。
・TLS 1.2 / TLS 1.3が利用可能か
・TLS 1.1以前が無効化されているか
・サーバ証明書の公開鍵アルゴリズムと鍵長
・利用可能な暗号スイート
・ECDHE / DHEのパラメータ
・外部スキャンだけでは確認できない項目
ただし、nmapはスキャン行為にも使われるツールであるため、自社サーバへのスキャンを試みた際に、セキュリティ製品によって遮断される可能性があります。環境によっては実現できないことがありますので、ご了承ください。
TLS暗号設定ガイドライン 安全なウェブサイトのために(暗号設定対策編)
https://www.ipa.go.jp/security/crypto/guideline/ssl_crypt_config.html
TLS暗号設定ガイドライン
https://www.ipa.go.jp/security/crypto/guideline/gmcbt80000005ufv-att/ipa-cryptrec-gl-3001-3.1.1.pdf
TLS暗号設定ガイドラインチェックリスト
https://www.ipa.go.jp/security/crypto/guideline/gmcbt80000005ufv-att/ipa-cryptrec-gl-3001-3.1.1-checklists.pdf
目次
プロトコルバージョン設定
nmapを利用すると対象サーバで利用できるSSL/TLSプロトコルバージョンを確認できます。
TLS1.2の設定有効化状態
nmap --script ssl-enum-ciphers --script-args tls.servername=<IP/FQDN> -p 443 <IP/FQDN>
下記のような出力があれば、「済」です。
SSL2.0からTLS1.1までを利用不可にしたか
nmap --script ssl-enum-ciphers --script-args tls.servername=<IP/FQDN> -p 443 <IP/FQDN>
ssl-enum-ciphers:に無効化対象のバージョンがなければ、「済」です。
下記はTLS1.0を利用しているため、チェックリストとしてはNG状態です。
TLS1.3が実装されているか
nmap --script ssl-enum-ciphers --script-args tls.servername=<IP/FQDN> -p 443 <IP/FQDN>
下記のような出力があれば、「実装済み」の状態です。
2-3で実装している場合には、「済」です。
サーバ証明書設定
opensslを利用して証明書情報の詳細を確認します。
サーバの公開鍵情報のSubject Public Key Algorithmと鍵長の組合せ
openssl s_client -connect <IP/FQDN>:443 -servername <IP/FQDN> </dev/null 2>/dev/null | openssl x509 -text -noout
上記のコマンドにて、表示されるPublic Key Algorithm で、rsaEncryptionかid-ecPublicと表示されます。id-ecは楕円曲線暗号です。
表示されるPublic Key AlgorithmがrsaEncryption(RSA暗号)ならば、2048 bit以上か確認します。ec(楕円曲線暗号)ならば、Public-Keyが256以上かつ、NIST CURVEの値がP-256になっているのかを確認します。~~ビットセキュリティは、鍵長による安全性のことです。
認証局の署名アルゴリズムと鍵長の組合せ
openssl s_client -connect <IP/FQDN>:443 -servername <FQDN> -showcerts </dev/null 2>/dev/null
このコマンドで、証明書チェインの情報も出力します。上位の認証局が署名に使った鍵長は、上位の証明書のPublic Keyを見る必要があります。(RSA-PSSが署名に使われた証明書にはめったに遭遇しないため、本項ではスキップさせていただきます。)
rsaEncryption(RSA暗号)の場合は、以下を確認します。Certificate Chainの0(自身の証明書情報)のsigalgを確認します。RSAEncryptionか、ecdsaか、SHA256かそれ以上かをチェックします。

次に、Certificate Chainの1(中間証明書)のPKEYを確認します。RSAの場合、鍵長が2048以上になっているのか確認します。ECの場合、prime256以上であるのかを確認します。
これが問題なければ、「済」となります。
自ら公開鍵と秘密鍵の鍵ペアを生成する場合には、新たな公開鍵と秘密鍵の鍵ペアを生成しているか
証明書の鍵ペアを使いまわしている場合、万が一鍵が漏洩していた場合、そのリスクを引き継ぎ続けてしまいます。そのため、鍵ペアは毎回変更することが望ましいです。
証明書更新対応行っているメンバーへ確認をしたほうがよいです。
上記3-3についての指示を仕様書や運用手順書等に明記したか
社内の手順書を確認しましょう。
暗号スイート設定
暗号スイートは、TLS暗号設定ガイドラインに以下のように記載があります。
"TLS1.2 までの暗号スイートは「鍵交換_署名_暗号化_ハッシュ関数」の組によって構成される。例えば、「TLS_DHE_RSA_WITH_CAMELLIA_256_GCM_SHA384」であれば、鍵交換には「DHE」、署名には「RSA」、暗号化には「鍵長 256 ビット GCM モードのCamellia(CAMELLIA_256_GCM)」メッセージ認証コード(HMAC)を作るハッシュ関数には「SHA-384」が使われることを意味する。「TLS_RSA_WITH_AES_128_CBC_SHA」であれば、鍵交換と署名には「RSA」、暗号化には「鍵長 128 ビット CBC モードの AES(AES_128_CBC)」、HMAC に使うハッシュ関数には「SHA-1」が使われることを意味する。"
また1行飛んで以下の記述もあります。
"TLS1.3 の暗号スイートでは、TLS1.2 までの暗号スイートの組から「鍵交換」と「署名」が外され、「暗号化_ハッシュ関数」だけの構成に変更となった。"
表18記載の暗号アルゴリズムを全てを設定無効(利用不可)にしたか
nmap -p 443 --script ssl-enum-ciphers <FQDN/IP>
先述の、暗号スイートの命名方法を把握したうえで、進めます。
表18の項目は、「鍵交換」「署名」「暗号化」「ハッシュ関数」に分けて記述されているので、出力される暗号スイートのいずれかに合致するものがないのかチェックしていきます。
※先頭のTLSは無視することを忘れないでください。
TLS1.3の暗号スイートは、表18に抵触するものは少ないです。抵触するのはSM系のもので、中国での利用を背景としてTLS1.3向けに標準化された方式であり、IETFでも推奨ではないため、国内での確認であればTLS1.2側の一覧に注目をすればよさそうです。
利用されている場合には、是正を行い、nmapの実行後に合致するものがなければ、「済」です。
ECDHEを利用する暗号スイートを設定するか。
nmap -p 443 --script ssl-enum-ciphers <FQDN/IP>
nmapの実行結果にて、「鍵交換」に、ECDHEがある場合、「済」とします。
ECDHEを128ビットセキュリティ以上の曲線にしたか
ECDHEを鍵交換にしている暗号スイートの末尾の()内の値が曲線名になります。
上記画像では(ecdh_x25519)とあり、これは、Curve25519を指すものであることから(※RFC7748より)、いずれも条件を満たしているとわかります。問題がなければ「済」とします。
DHEを利用する暗号スイートを設定するか。
nmap -p 443 --script ssl-enum-ciphers <FQDN/IP>
上記画像では、(dh 2048)とあり、これは鍵交換パラメータのサイズ情報と解釈できるため、「済」とします。
表19記載の暗号アルゴリズムを組み合わせた暗号スイートのみで設定しているか
nmap -p 443 --script ssl-enum-ciphers <FQDN/IP>
nmapの実行結果より、暗号スイートが、条件を満たしているのかをチェックしていきます。ただし、本来製品の設定状況を確認するものであり、本項については外部からスキャンをしてチェックを網羅するのは、困難です。
推奨項目ということと、外部からのスキャンでは限界があるため、網羅的な記述は割愛させていただきます。
-「実際に外部から確認して分かった限界」-
TLS1.2の署名が「RSA」の場合、実際の署名方式が RSASSA-PKCS1-v1_5 か RSASSA-PSS(TLS1.2) かを判別できません。厳密な確認が必要な場合は、opensslを使って、対象暗号スイートを -cipher、署名方式を -sigalgs で固定して追加確認をする必要があります。
TLS1.3では、署名アルゴリズムは暗号スイートとは別にネゴシエーションされるため、外部スキャンのみで「許可される署名方式が安全なものだけである」と網羅的に確認するのは困難です。
(このあたりの調査は、TLSを分かったつもりの私でもTLS1.3の仕様などにも踏みこまないといけず、苦しかったです。)
暗号スイートの優先順位が設定できるか。
スキャンでは確認することが難しいため、製品などの仕様を確認してください。
優先順位の設定状況を記入します。
優先順位の設定状況を記入します。
外部スキャンで確認できる範囲と限界
ここまで、nmapやOpenSSLを利用して「TLS暗号設定ガイドライン【推奨セキュリティ型チェックリスト】」の各項目を確認する方法を紹介しました。
ただし、チェックリストのすべてを外部から確認できるわけではありません。確認方法は大きく以下の3つに分けられます。
確認方法 |
主な項目 |
外部から確認可能 |
TLSバージョン、証明書の公開鍵・署名アルゴリズム、利用可能な暗号スイート、ECDHE/DHEのパラメータ |
外部から一部確認できる |
暗号スイート・署名方式の組み合わせ、暗号スイートの優先順位 |
製品設定・運用確認が必要 |
証明書更新時の鍵ペア再生成、手順書への明記 |
特に「4-4 暗号アルゴリズムの組み合わせ」については、TLS 1.2のRSA署名方式の詳細や、TLS 1.3で許可されている署名アルゴリズムを、nmapによる暗号スイートの列挙だけで網羅的に確認することは困難です。
また、鍵ペアを証明書更新時に再生成しているかといった運用面の項目は、外部通信から判断できないため、実際の設定や運用手順を確認する必要があります。
そのため、外部スキャンは設定確認を補助する方法として利用し、最終的には製品設定や運用手順と合わせて確認することが重要です。
記載されている会社名、システム名、製品名は一般に各社の登録商標または商標です。
当社製品以外のサードパーティ製品の設定内容につきましては、弊社サポート対象外となります。
























