サイズ: 3814
コメント:
|
サイズ: 9132
コメント:
|
削除された箇所はこのように表示されます。 | 追加された箇所はこのように表示されます。 |
行 7: | 行 7: |
== SSLサーバー動作検証 == === コマンド(基本形) === {{{ openssl s_client -connect wiki.ninth-nine.com:443 < /dev/null }}} * FreeBSDの場合、ETCSYMLINK オプション付けて(通常デフォルト)[[https://www.freshports.org/security/ca_root_nss/|ports/security/ca_root_nss]] をインストールすること。 * 最近のOSではこれで十分だが、古いOSやFreeBSD(10.1-RELEASE 以下)だとルートCAのチェインがたどれないケースがある。 * その場合、更に{{{-CAfile ルート証明書.crt}}}オプションを指定すること。 * FreeBSD の場合{{{-CAfile /usr/local/share/certs/ca-root-nss.crt}}} * CentOS の場合{{{-CAfile /etc/pki/tls/cert.pem}}} * ルートCAのチェインがたどれてないかどうかの判定は、正規のサイトで接続確認して、`Verify return code: 20 (unable to get local issuer certificate)`という結果が得られれば、たどれてないことを意味する。 === コマンド(-CAfile オプション) === {{{ openssl s_client -connect wiki.ninth-nine.com:443 -CAfile /etc/ssl/cert.pem < /dev/null }}} === コマンド(-cipher オプション) === サーバーが対応している暗号スイート(Cipher Suite)の洗い出し。 {{{ openssl s_client -connect wiki.ninth-nine.com:443 -cipher 'ALL' < /dev/null }}} コマンド実行後に得られる`SSL-Session`の`Cipher`を順次指定(封印)する。これ以上調停できなくなった時が、全てリストアップ仕切れたことを意味する(減算法)。 {{{ 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 }}} * {{{-tls1_1}}}(TLS1.1), {{{-tls1_2}}}(TLS1.2)オプションはOS(OpenSSL)のバージョンにより使用できない場合がある。 * 実際、現時点(2016/05/03)で{{{-tls1_3}}}(TLS1.3)オプションは存在しないし、将来的には{{{-ssl2}}}(SSL2.0)オプションが無くなるかもしれない。 === コマンド(-servername オプション) === Server Name Indication(SNI)の検証する。 {{{ openssl s_client -connect wiki.ninth-nine.com:443 -servername wiki.ninth-nine.com < /dev/null }}} |
OpenSSL
よくあるOpenSSLの使い方を紹介する。OpenSSLはバージョン毎でできることが違うので注意。違いが顕著なところについてはOS毎に解説する。
SSL証明書発行関連について別項目で紹介する。
SSLサーバー動作検証
コマンド(基本形)
openssl s_client -connect wiki.ninth-nine.com:443 < /dev/null
FreeBSDの場合、ETCSYMLINK オプション付けて(通常デフォルト)ports/security/ca_root_nss をインストールすること。
- 最近のOSではこれで十分だが、古いOSやFreeBSD(10.1-RELEASE 以下)だとルートCAのチェインがたどれないケースがある。
その場合、更に-CAfile ルート証明書.crtオプションを指定すること。
FreeBSD の場合-CAfile /usr/local/share/certs/ca-root-nss.crt
CentOS の場合-CAfile /etc/pki/tls/cert.pem
ルートCAのチェインがたどれてないかどうかの判定は、正規のサイトで接続確認して、Verify return code: 20 (unable to get local issuer certificate)という結果が得られれば、たどれてないことを意味する。
コマンド(-CAfile オプション)
openssl s_client -connect wiki.ninth-nine.com:443 -CAfile /etc/ssl/cert.pem < /dev/null
コマンド(-cipher オプション)
サーバーが対応している暗号スイート(Cipher Suite)の洗い出し。
openssl s_client -connect wiki.ninth-nine.com:443 -cipher 'ALL' < /dev/null
コマンド実行後に得られるSSL-SessionのCipherを順次指定(封印)する。これ以上調停できなくなった時が、全てリストアップ仕切れたことを意味する(減算法)。
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
-tls1_1(TLS1.1), -tls1_2(TLS1.2)オプションはOS(OpenSSL)のバージョンにより使用できない場合がある。
実際、現時点(2016/05/03)で-tls1_3(TLS1.3)オプションは存在しないし、将来的には-ssl2(SSL2.0)オプションが無くなるかもしれない。
コマンド(-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)中では使わないこと。
参考文献