= OpenSSL = よくあるOpenSSLの使い方を紹介する。OpenSSLはバージョン毎でできることが違うので注意。違いが顕著なところについてはOS毎に解説する。 SSL証明書発行関連について別項目で紹介する。 <> == SSLサーバー動作検証 == * 詳細は [[/s_client|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)の確認 == * 詳細は [[/req|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)の確認 == * 詳細は [[/req|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)中では使わないこと。 = 参考文献 = * [[http://akademeia.info/index.php?RSA%B0%C5%B9%E6|RSA暗号]] * [[http://d.hatena.ne.jp/ozuma/20130510/1368114329|opensslでRSA暗号と遊ぶ]] * [[https://wiki.openssl.org/index.php/Manual:S_client%281%29|openssl s_client(1)のマニュアル]] * [[https://wiki.openssl.org/index.php/Manual:Req%281%29|openssl req(1)のマニュアル]] * [[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とは]]