サイズ: 5593
コメント:
|
サイズ: 7484
コメント:
|
削除された箇所はこのように表示されます。 | 追加された箇所はこのように表示されます。 |
行 6: | 行 6: |
<<TableOfContents(2)>> | <<TableOfContents(3)>> == SSLサーバー動作検証 == * 詳細は [[/req|openssl s_client]]ページ参照のこと。 * ここではコマンドとオプションのみ紹介する。 === コマンド(基本形) === SSLサーバーへの接続確認。 {{{ openssl s_client -connect wiki.ninth-nine.com:443 < /dev/null }}} === コマンド(-CAfile オプション) === 接続にあたり自己署名証明書を指定する場合。 {{{ openssl s_client -connect wiki.ninth-nine.com:443 -CAfile /etc/ssl/cert.pem < /dev/null }}} ※-CAfile で指定できるSSL証明書ファイルは自己署名証明書(ルート証明書・俺々証明書)である。 === コマンド(-cipher オプション) === サーバーが対応している暗号スイート(Cipher Suite)の洗い出し。 {{{ openssl s_client -connect wiki.ninth-nine.com:443 -cipher 'ALL' < /dev/null openssl s_client -connect wiki.ninth-nine.com:443 -cipher 'ALL!ECDHE-RSA-AES256-SHA' < /dev/null openssl s_client -connect wiki.ninth-nine.com:443 -cipher 'ALL!ECDHE-RSA-AES256-SHA!DHE-RSA-AES256-SHA256' < /dev/null openssl s_client -connect wiki.ninth-nine.com:443 -cipher 'ALL!ECDHE-RSA-AES256-SHA!DHE-RSA-AES256-SHA256!DHE-RSA-AES256-SHA' < /dev/null openssl s_client -connect wiki.ninth-nine.com:443 -cipher 'ALL!ECDHE-RSA-AES256-SHA!DHE-RSA-AES256-SHA256!DHE-RSA-AES256-SHA!DHE-RSA-CAMELLIA256-SHA' < /dev/null openssl s_client -connect wiki.ninth-nine.com:443 -cipher 'ALL!ECDHE-RSA-AES256-SHA!DHE-RSA-AES256-SHA256!DHE-RSA-AES256-SHA!DHE-RSA-CAMELLIA256-SHA!AES256-SHA256' < /dev/null openssl s_client -connect wiki.ninth-nine.com:443 -cipher 'ALL!ECDHE-RSA-AES256-SHA!DHE-RSA-AES256-SHA256!DHE-RSA-AES256-SHA!DHE-RSA-CAMELLIA256-SHA!AES256-SHA256!AES256-SHA' < /dev/null openssl s_client -connect wiki.ninth-nine.com:443 -cipher 'ALL!ECDHE-RSA-AES256-SHA!DHE-RSA-AES256-SHA256!DHE-RSA-AES256-SHA!DHE-RSA-CAMELLIA256-SHA!AES256-SHA256!AES256-SHA!CAMELLIA256-SHA' < /dev/null openssl s_client -connect wiki.ninth-nine.com:443 -cipher 'ALL!ECDHE-RSA-AES256-SHA!DHE-RSA-AES256-SHA256!DHE-RSA-AES256-SHA!DHE-RSA-CAMELLIA256-SHA!AES256-SHA256!AES256-SHA!CAMELLIA256-SHA!ECDHE-RSA-AES128-GCM-SHA256' < /dev/null openssl s_client -connect wiki.ninth-nine.com:443 -cipher 'ALL!ECDHE-RSA-AES256-SHA!DHE-RSA-AES256-SHA256!DHE-RSA-AES256-SHA!DHE-RSA-CAMELLIA256-SHA!AES256-SHA256!AES256-SHA!CAMELLIA256-SHA!ECDHE-RSA-AES128-GCM-SHA256!ECDHE-RSA-AES128-SHA256' < /dev/null : }}} === コマンド(-プロトコル/-no_プロトコル オプション) === 対応プロトコルを「個別」に調査する。 {{{ openssl s_client -connect wiki.ninth-nine.com:443 -ssl2 -no_ssl3 -no_tls1 -no_tls1_1 -no_tls1_2 < /dev/null openssl s_client -connect wiki.ninth-nine.com:443 -no_ssl2 -ssl3 -no_tls1 -no_tls1_1 -no_tls1_2 < /dev/null openssl s_client -connect wiki.ninth-nine.com:443 -no_ssl2 -no_ssl3 -tls1 -no_tls1_1 -no_tls1_2 < /dev/null openssl s_client -connect wiki.ninth-nine.com:443 -no_ssl2 -no_ssl3 -no_tls1 -tls1_1 -no_tls1_2 < /dev/null openssl s_client -connect wiki.ninth-nine.com:443 -no_ssl2 -no_ssl3 -no_tls1 -no_tls1_1 -tls1_2 < /dev/null }}} 実際のブラウザで見た時の挙動とは結果が違う場合があるので注意。これは非対応プロトコルのフォールバック方法の違いに起因する(詳細はめんどくさいの解説しない)。 === コマンド(-servername オプション) === Server Name Indication(SNI)の検証する。 {{{ openssl s_client -connect wiki.ninth-nine.com:443 -servername wiki.ninth-nine.com < /dev/null }}} |
行 9: | 行 65: |
* [[用語解説/SSL証明書#CSR|CSR]]の内容を確認する。 * 大枠は `-text` オプションを指定することになるが、個別にデータを取りたい場合のオプションを解説する。 |
* 詳細は [[/req|openssl req]]ページ参照のこと。 * ここではコマンドとオプションのみ紹介する。 |
行 12: | 行 68: |
=== コマンド === | === コマンド(-text オプション) === CSRが有する詳細情報を表示する。 |
行 18: | 行 75: |
=== 実行結果例 === | === コマンド(-subject) === サブジェクト(主体者)のディスティングイッシュ名を取得する。 |
行 20: | 行 78: |
Certificate Request: Data: Version: 2 (0x2) Subject: CN=wiki.ninth-nine.com Subject Public Key Info: Public Key Algorithm: rsaEncryption Public-Key: (2048 bit) Modulus: 00:c3:6e:81:a0:ca:e8:d2:6a:b9:f1:ef:23:c2:3e: 80:c6:77:fa:e1:57:89:07:bd:10:16:db:b2:40:e9: d5:85:24:e5:3f:84:ac:f7:60:07:7a:f7:62:aa:9f: eb:f5:ee:da:4e:ff:13:06:d7:77:c7:29:dd:7e:89: 68:75:38:ca:5a:10:c6:d5:8e:7a:95:5b:59:90:5b: 59:9c:17:74:69:ea:fe:d7:a9:91:af:01:c6:cb:d9: 95:cc:0b:27:a3:c3:af:f7:eb:e8:e2:3a:99:ba:1a: 9e:fc:db:fe:d5:b7:fd:8e:81:da:ad:79:dd:eb:19: b2:bb:8a:1d:04:b6:fa:bb:49:4d:a7:e1:43:42:05: b6:45:1b:83:5f:52:12:d9:97:05:07:ff:92:7a:96: 8d:f3:19:7b:9d:0b:cf:01:54:1c:5d:41:87:5d:11: e8:d1:9b:03:7a:b3:16:31:55:9f:b5:37:88:93:40: d6:29:95:df:68:24:e8:6b:5a:f5:50:fc:9b:55:13: 8a:dd:2b:88:19:93:14:de:a7:bc:b5:6a:1c:8f:04: 67:74:6b:fd:b9:ab:56:ca:e7:04:63:63:2c:cc:0a: cc:f9:cf:b0:58:db:c5:fa:0b:08:ab:6c:5a:5c:9e: c1:c2:29:72:b0:cb:c3:0b:aa:4f:48:aa:0a:cf:3c: 8a:b1 Exponent: 65537 (0x10001) Attributes: Requested Extensions: X509v3 Subject Alternative Name: Requested Extensions: X509v3 Subject Alternative Name: DNS:wiki.ninth-nine.com Signature Algorithm: sha256WithRSAEncryption 10:47:1a:72:c3:31:f8:fb:a7:ae:70:c9:2a:8d:92:59:fd:10: ed:d0:88:03:03:b8:4e:95:ea:ba:1f:a6:2e:5e:46:f7:7e:11: f3:c9:ce:1f:9c:92:3a:76:07:68:25:da:46:7a:53:c8:9b:b8: 5c:a2:94:10:0e:45:df:07:55:ec:46:2e:5b:cd:3f:96:91:ac: 50:a9:2e:d0:52:1c:d2:1f:ae:33:f6:d1:81:78:67:dc:2a:7d: e4:58:11:3f:be:12:da:46:8f:d1:36:2a:66:f8:15:37:15:ac: 4b:5a:e4:67:67:48:11:e4:2c:49:63:68:17:ae:97:44:a0:a0: 02:02:30:ed:53:33:06:8e:71:25:ea:f0:db:9e:65:ef:9e:2f: 3c:49:48:90:a4:eb:7e:21:34:9b:8d:a6:2b:94:ad:a9:2d:bf: b7:84:bc:1f:61:67:11:ab:e3:82:b5:13:7a:c8:46:15:d6:07: f0:ed:40:ec:1a:f0:3e:f6:27:88:59:3d:4e:38:4b:67:23:d0: 9e:fd:33:d2:13:49:dc:75:d0:7d:9d:a7:e3:80:8d:84:0d:76: d2:ba:1e:3c:f0:45:f6:78:1f:30:0b:e7:00:67:d3:ae:cb:d9: 12:e3:52:02:26:b2:00:f1:ce:f2:8f:6f:d2:5b:f2:c7:ef:da: 9c:a3:ca:d3 |
openssl req -noout -subject -in CSRファイル名.csr |
行 71: | 行 82: |
この結果から以下のことがわかる。 | === コマンド(-modulus) === モジュロを取得する。取得するだけだと何する?なので、秘密鍵と対になっているか確認する。 {{{ diff -u <(openssl req -noout -modulus -in CSRファイル名.csr) <(openssl rsa -noout -modulus -in 秘密鍵ファイル名.key) |
行 73: | 行 87: |
=== 署名情報 === ||<#FFFF00> ラベル名 ||<#FFFF00> 内容 ||<#FFFF00> 意味 ||<#FFFF00> 備考 || || Subject || CN=wiki.ninth-nine.com || 証明書のディスティングイッシュ名 || || || Public Key Algorithm || rsaEncryption || 公開鍵暗号アルゴリズムはRSA暗号 || || || Signature Algorithm || sha256WithRSAEncryption || 署名アルゴリズムは SHA256 || || |
}}} |
行 79: | 行 89: |
=== RSA暗号パラメータ === ||<#FFFF00> ラベル名 ||<#FFFF00> 内容 ||<#FFFF00> 意味 ||<#FFFF00> 備考 || || Public-Key || 2048 bit || 2048bit 公開鍵 || || || Modulus || モジュロ(2048bit 分) || モジュロ || 秘密鍵のモジュロと一致 || || Exponent || 65537 (0x10001) || 冪指数 || 65537 を明示 || |
※`<(`''command''`)`というイディオム(実行結果をテンポラリファイル名で渡してくれる)は zsh/bash 拡張なので、シェルスクリプト(sh/ash/ksh)中では使わないこと。 |
行 85: | 行 91: |
RSA暗号パラメータ(モジュロや冪指数)については以下の文献が詳しい。 * [[http://akademeia.info/index.php?RSA%B0%C5%B9%E6|RSA暗号]] * [[http://d.hatena.ne.jp/ozuma/20130510/1368114329|opensslでRSA暗号と遊ぶ]] |
== 署名済公開鍵(CRT)の確認 == * 詳細は [[/req|openssl x509]]ページ参照のこと。 * ここではコマンドとオプションのみ紹介する。 * 署名済み公開鍵のことをcertificateと呼ぶがCSRのように明確に定義(省略形)しているのは無いが、比較的、一般的に通じる「CRT」で通すものとする。もちろん秘密鍵は「KEY」で。 * 大枠は `-text` オプションを指定することになるが、個別にデータを取りたい場合のオプションを解説する。 |
行 89: | 行 97: |
=== 属性(Attributes) === 本例では X509v3 要求拡張(Requested Extensions)が付加されている(通常必要ない)。 |
=== コマンド(-text オプション) === {{{ openssl x509 -noout -text -in CRTファイル名.crt |
行 92: | 行 101: |
||<#FFFF00> ラベル名 ||<#FFFF00> 内容 ||<#FFFF00> 意味 ||<#FFFF00> 備考 || || X509v3 Subject Alternative Name || DNS:wiki.ninth-nine.com || いわゆるSANの設定 || SANについてはいつかきっと… || |
}}} === コマンド(-subject/-issuer オプション) === サブジェクト(主体者)やイシュア(発行者)のディスティングイッシュ名を取得する。もちろんオプションは別々に指定可能。 {{{ openssl req -noout -subject -issuer -in CRTファイル名.crt }}} === コマンド(-startdate/-enddate オプション) === 有効期限(開始日時あるいは終了日時)を取得する。もちろんオプションは別々に指定可能。 {{{ openssl x509 -noout -startdate -enddate -in CRTファイル名.crt }}} === コマンド(-modulus オプション) === モジュロを取得する。取得するだけだと何する?なので、秘密鍵と対になっているか確認する。 {{{ diff -u <(openssl x509 -noout -modulus -in CRTファイル名.crt) <(openssl rsa -noout -modulus -in 秘密鍵ファイル名.key) }}} ※`<(`''command`)`というイディオム(実行結果をテンポラリファイル名で渡してくれる)は zsh/bash 拡張なので、シェルスクリプト(sh/ash/ksh)中では使わないこと。 |
行 99: | 行 130: |
* [[https://wiki.openssl.org/index.php/Manual:X509%281%29|openssl x509(1)のマニュアル]] * PKI一般について * [[https://www.ipa.go.jp/security/pki/033.html|電子証明書]] * [[https://www.nic.ad.jp/ja/newsletter/No23/080.html|PKIとは]] |
OpenSSL
よくあるOpenSSLの使い方を紹介する。OpenSSLはバージョン毎でできることが違うので注意。違いが顕著なところについてはOS毎に解説する。
SSL証明書発行関連について別項目で紹介する。
SSLサーバー動作検証
詳細は openssl s_clientページ参照のこと。
- ここではコマンドとオプションのみ紹介する。
コマンド(基本形)
SSLサーバーへの接続確認。
openssl s_client -connect wiki.ninth-nine.com:443 < /dev/null
コマンド(-CAfile オプション)
接続にあたり自己署名証明書を指定する場合。
openssl s_client -connect wiki.ninth-nine.com:443 -CAfile /etc/ssl/cert.pem < /dev/null
※-CAfile で指定できるSSL証明書ファイルは自己署名証明書(ルート証明書・俺々証明書)である。
コマンド(-cipher オプション)
サーバーが対応している暗号スイート(Cipher Suite)の洗い出し。
openssl s_client -connect wiki.ninth-nine.com:443 -cipher 'ALL' < /dev/null openssl s_client -connect wiki.ninth-nine.com:443 -cipher 'ALL!ECDHE-RSA-AES256-SHA' < /dev/null openssl s_client -connect wiki.ninth-nine.com:443 -cipher 'ALL!ECDHE-RSA-AES256-SHA!DHE-RSA-AES256-SHA256' < /dev/null openssl s_client -connect wiki.ninth-nine.com:443 -cipher 'ALL!ECDHE-RSA-AES256-SHA!DHE-RSA-AES256-SHA256!DHE-RSA-AES256-SHA' < /dev/null openssl s_client -connect wiki.ninth-nine.com:443 -cipher 'ALL!ECDHE-RSA-AES256-SHA!DHE-RSA-AES256-SHA256!DHE-RSA-AES256-SHA!DHE-RSA-CAMELLIA256-SHA' < /dev/null openssl s_client -connect wiki.ninth-nine.com:443 -cipher 'ALL!ECDHE-RSA-AES256-SHA!DHE-RSA-AES256-SHA256!DHE-RSA-AES256-SHA!DHE-RSA-CAMELLIA256-SHA!AES256-SHA256' < /dev/null openssl s_client -connect wiki.ninth-nine.com:443 -cipher 'ALL!ECDHE-RSA-AES256-SHA!DHE-RSA-AES256-SHA256!DHE-RSA-AES256-SHA!DHE-RSA-CAMELLIA256-SHA!AES256-SHA256!AES256-SHA' < /dev/null openssl s_client -connect wiki.ninth-nine.com:443 -cipher 'ALL!ECDHE-RSA-AES256-SHA!DHE-RSA-AES256-SHA256!DHE-RSA-AES256-SHA!DHE-RSA-CAMELLIA256-SHA!AES256-SHA256!AES256-SHA!CAMELLIA256-SHA' < /dev/null openssl s_client -connect wiki.ninth-nine.com:443 -cipher 'ALL!ECDHE-RSA-AES256-SHA!DHE-RSA-AES256-SHA256!DHE-RSA-AES256-SHA!DHE-RSA-CAMELLIA256-SHA!AES256-SHA256!AES256-SHA!CAMELLIA256-SHA!ECDHE-RSA-AES128-GCM-SHA256' < /dev/null openssl s_client -connect wiki.ninth-nine.com:443 -cipher 'ALL!ECDHE-RSA-AES256-SHA!DHE-RSA-AES256-SHA256!DHE-RSA-AES256-SHA!DHE-RSA-CAMELLIA256-SHA!AES256-SHA256!AES256-SHA!CAMELLIA256-SHA!ECDHE-RSA-AES128-GCM-SHA256!ECDHE-RSA-AES128-SHA256' < /dev/null :
コマンド(-プロトコル/-no_プロトコル オプション)
対応プロトコルを「個別」に調査する。
openssl s_client -connect wiki.ninth-nine.com:443 -ssl2 -no_ssl3 -no_tls1 -no_tls1_1 -no_tls1_2 < /dev/null openssl s_client -connect wiki.ninth-nine.com:443 -no_ssl2 -ssl3 -no_tls1 -no_tls1_1 -no_tls1_2 < /dev/null openssl s_client -connect wiki.ninth-nine.com:443 -no_ssl2 -no_ssl3 -tls1 -no_tls1_1 -no_tls1_2 < /dev/null openssl s_client -connect wiki.ninth-nine.com:443 -no_ssl2 -no_ssl3 -no_tls1 -tls1_1 -no_tls1_2 < /dev/null openssl s_client -connect wiki.ninth-nine.com:443 -no_ssl2 -no_ssl3 -no_tls1 -no_tls1_1 -tls1_2 < /dev/null
実際のブラウザで見た時の挙動とは結果が違う場合があるので注意。これは非対応プロトコルのフォールバック方法の違いに起因する(詳細はめんどくさいの解説しない)。
コマンド(-servername オプション)
Server Name Indication(SNI)の検証する。
openssl s_client -connect wiki.ninth-nine.com:443 -servername wiki.ninth-nine.com < /dev/null
署名リクエスト(CSR)の確認
詳細は openssl reqページ参照のこと。
- ここではコマンドとオプションのみ紹介する。
コマンド(-text オプション)
CSRが有する詳細情報を表示する。
openssl req -noout -text -in CSRファイル名.csr
コマンド(-subject)
サブジェクト(主体者)のディスティングイッシュ名を取得する。
openssl req -noout -subject -in CSRファイル名.csr
コマンド(-modulus)
モジュロを取得する。取得するだけだと何する?なので、秘密鍵と対になっているか確認する。
diff -u <(openssl req -noout -modulus -in CSRファイル名.csr) <(openssl rsa -noout -modulus -in 秘密鍵ファイル名.key)
※<(command)というイディオム(実行結果をテンポラリファイル名で渡してくれる)は zsh/bash 拡張なので、シェルスクリプト(sh/ash/ksh)中では使わないこと。
署名済公開鍵(CRT)の確認
詳細は openssl x509ページ参照のこと。
- ここではコマンドとオプションのみ紹介する。
- 署名済み公開鍵のことをcertificateと呼ぶがCSRのように明確に定義(省略形)しているのは無いが、比較的、一般的に通じる「CRT」で通すものとする。もちろん秘密鍵は「KEY」で。
大枠は -text オプションを指定することになるが、個別にデータを取りたい場合のオプションを解説する。
コマンド(-text オプション)
openssl x509 -noout -text -in CRTファイル名.crt
コマンド(-subject/-issuer オプション)
サブジェクト(主体者)やイシュア(発行者)のディスティングイッシュ名を取得する。もちろんオプションは別々に指定可能。
openssl req -noout -subject -issuer -in CRTファイル名.crt
コマンド(-startdate/-enddate オプション)
有効期限(開始日時あるいは終了日時)を取得する。もちろんオプションは別々に指定可能。
openssl x509 -noout -startdate -enddate -in CRTファイル名.crt
コマンド(-modulus オプション)
モジュロを取得する。取得するだけだと何する?なので、秘密鍵と対になっているか確認する。
diff -u <(openssl x509 -noout -modulus -in CRTファイル名.crt) <(openssl rsa -noout -modulus -in 秘密鍵ファイル名.key)
※<(command)というイディオム(実行結果をテンポラリファイル名で渡してくれる)は zsh/bash 拡張なので、シェルスクリプト(sh/ash/ksh)中では使わないこと。
参考文献