Memo/Linux/SSL

http://dexlab.net/pukiwiki/index.php?Memo/Linux/SSL
 

SSL証明書


中間証明書(CA)の表示

  • CentOS 6.x:
    1. sudo find / -name cacerts
    2. /usr/java/jdk1.8.0_66/jre/lib/security/cacerts
    3. /etc/pki/java/cacerts
    4. /etc/pki/ca-trust/extracted/java/cacerts
    5.  
    6. # JDK
    7. keytool -v --list -keystore /usr/java/jdk1.8.0_66/jre/lib/security/cacerts | less
    8. Enter keystore password: <ENTER>
    9.  
    10. # その他?
    11. less /etc/pki/tls/certs/ca-bundle.crt

key/crtの一致検証

  • nginxの起動時に以下のエラーで失敗する場合、key/crtが間違っている
    1. nginx: [emerg] SSL_CTX_use_PrivateKey_file("/etc/nginx/ssl/example.com.key") failed (SSL: error:0B080074:x509 certificate routines:X509_check_private_key:key values mismatch)
  • md5_1とmd5_2が一致するなら成功。異なる場合、どちらかが間違っている。
    1. openssl rsa -in example.com.key -modulus -noout | openssl md5
    2. (stdin)= <md5_1>
    3.  
    4. openssl x509 -in example.com.crt -modulus -noout | openssl md5
    5. (stdin)= <md5_1>

pfx形式から変換

Windows Server IIS等で使われるpfx形式から、linuxでよく使われるkey, crt形式へ変換

  1. # key: 秘密鍵
  2. openssl pkcs12 -in exsample.pfx -nocerts -nodes -out exsample.key
  3.  
  4. # body.crt: 証明書
  5. openssl pkcs12 -in exsample.pfx -clcerts -nokeys -out exsample.body.crt
  6.  
  7. # chain.crt: 中間証明書
  8. openssl pkcs12 -in exsample.pfx -cacerts -nokeys -out exsample.chain.crt
  • 出力されたファイル中のヘッダ情報を消す
  • 中間証明書でエラーが出る場合、中間証明書内の順序を入れ替える

ランダムな16進数の生成

  • ランダムな16進数4桁(4文字ではない)を16進数で出力
    1. openssl rand -hex 4
    2. 7317fa43
  • ランダムな16進数4桁(4文字ではない)をbase64で出力
    1. openssl rand -base64 4
    2. bKpHSw==

自己証明書の作成

  • keyとcrtを一度に作成。パスフレーズ無し
    1. COMMON_NAME=example.com
    2. DAYS=3650 # 10 years
    3. NEWKEY="rsa:2048"
    4. SUBJ="/C=JP/ST=/L=/O=/OU=/CN=$COMMON_NAME"
    5. openssl req \
    6.         -newkey ${NEWKEY} \
    7.         -sha256 \
    8.         -keyout ${COMMON_NAME}.key \
    9.         -nodes \
    10.         -x509 \
    11.         -out ${COMMON_NAME}.crt \
    12.         -days ${DAYS} \
    13.         -subj "${SUBJ}"
  • 生成時にパスフレーズを追加する場合
    1. PRIVATE_KEY_PASS=$(mkpasswd -l 16 -s 0)
    2. ...
    3. # -nodes は指定しない
    4. # -passout を追加
    5.         -passout "pass:$PRIVATE_KEY_PASS" \
    6.  
    7. # 環境変数で指定したい場合
    8. export PRIVATE_KEY_PASS=<...>
    9.         -passout "env:PRIVATE_KEY_PASS" \
    10.  
    11. # ファイルで指定したい場合
    12. echo "pass" > private_key_pass.txt
    13.         -passout "file:private_key_pass.txt" \
  • 後からパスフレーズを追加
    1. openssl rsa -in example.com.key -aes128 -out example.com.key.pass

有効期限のチェック

  • リモートの場合。結果が「Certificate will expire」の場合は期限が切れている
    1. ENDPOINT=www.example.com:443
    2. DAYS=30
    3. openssl s_client -showcerts -connect $ENDPOINT -servername $ENDPOINT < /dev/null 2>&1 | openssl x509 -checkend $(( 86400 * $DAYS )) -enddate
    4. notAfter=Nov 28 12:00:00 2018 GMT
    5. Certificate will not expire
  • crtファイルがローカルにある場合
    1. openssl x509 -in example.crt -checkend $(( 86400 * $DAYS )) -enddate

アプリケーション毎のCA証明書

Javaやnode.jsなど、アプリケーション毎にCA証明書を持っている場合があり、マイナーなSSL認証局だと使えない(httpsでの通信で証明書エラー)場合がある。

  • RHEL/CentOS:
    1. sudo yum update ca-certificates

openssl にタイムアウトを設定

bash等で自動化したい時に、タイムアウトを設定したい場合があるが、opensslコマンド自体には設定が無い。

  • timeoutコマンドを用いる
    1. timeout 3 openssl ...

全てのSSL証明書の表示

  • 例:google.comのSSL証明書を表示
    1. openssl s_client -showcerts -connect www.google.com:443 < /dev/null

SHA-2の検証


SSL証明書の作成

  • テスト用秘密鍵の作成
    1. openssl genrsa -aes256 2048 > example.com.key
  • パスワード無し秘密鍵の作成(apache, nginx, ELB他用)
    1. openssl rsa -in example.com.key -out example.com.nopass.key
  • 秘密鍵の検証(パスワードが付いているかも確認できる)
    1. openssl rsa -check -noout -in example.com.key
    2. # パスフレーズがある場合は聞いてくる
    3. Enter pass phrase for example.com.key:
    4.  
    5. RSA key ok
  • テスト用CSRの作成。SHA-256対応のCSR作成のため「-sha256」を付与。「Common Name」を実際に運用したいFQDNにする。ワイルドカード「*.example.com」も可能。「example.com」と「www.example.com」は異なるSSL証明書になる。
    1. openssl req -new -sha256 -x509 -days 3650 -text -key example.com.nopass.key > example.com.csr
    2.  
    3. Country Name (2 letter code) [XX]:JP
    4. State or Province Name (full name) []:
    5. Locality Name (eg, city) [Default City]:
    6. Organization Name (eg, company) [Default Company Ltd]:
    7. Organizational Unit Name (eg, section) []:
    8. Common Name (eg, your name or your server's hostname) []:example.com
    9. Email Address []:
  • CSRファイルの検証
    1. openssl req -verify -noout -in example.com.csr
    2.  
    3. verify OK
  • CSRファイルの内容を表示
    1. openssl req -text -noout -in example.com.csr
  • 正式なSSL証明書の場合、SSL認証局にkey, csrをアップロードして購入する。crtファイルと中間証明書(chained-crt)をダウンロード(無い場合もある)
  • SSL自己証明書用の場合、csrファイルから、keyとcrtとを同時に生成できる
    1. openssl x509 -req -in example.com.csr -signkey example.com.key -sha256 -days 3650 -out example.com.crt
  • CRTファイルの検証
    1. openssl x509 -noout -subject -in example.com.crt
    2.  
    3. subject= /OU=Domain Control Validated/CN=*.example.com
  • 秘密鍵: /etc/nginx/ssl/ssl.key
    1. -----BEGIN RSA PRIVATE KEY----- 秘密鍵 -----END RSA PRIVATE KEY-----
  • サーバ証明書: /etc/nginx/ssl/ssl.crt
    • 一つに纏める場合の順序
      1. -----BEGIN CERTIFICATE----- サーバー証明書 -----END CERTIFICATE----- -----BEGIN CERTIFICATE----- 中間証明書 -----END CERTIFICATE----- -----BEGIN CERTIFICATE----- クロスルート証明書 -----END CERTIFICATE-----

SSL証明書(https://)の有効性をチェック

  • crtファイルからチェック
    1. openssl x509 -noout -text -in example.com.crt
    2.  
    3. #Not Before(証明書の発行日時)
    4. #Not After(証明書の有効期限)
    5.  
    6. # 有効期限をGMTからUTCへ変換
    7. openssl x509 -noout -text -enddate -in example.com.crt | perl -ne 'if(/^notAfter=(.+)/){print "$1";}' | xargs -i date -u -d '{}' '+%Y-%m-%d %H:%M:%S %Z'
    8. 2016-10-04 03:54:51 UTC
  • 有効期限内だが、証明書発行元で無効にした場合は検出できなかった
  • curl
  • openssl s_client -connect
  • 有効/無効だけの判断
    1. fqdn=www.google.com
    2.  
    3. # SSL証明書に問題が無い場合、終了ステータスは0
    4. curl -s https://$fqdn/ > /dev/null; echo $?
    5. 0
    6.  
    7. # 問題があるSSL証明書や設定されていない場合、0以外
    8. curl -s https://$fqdn/ > /dev/null; echo $?
    9. 51
  • 期限をローカルタイムで表示
    1. openssl s_client -showcerts -connect $fqdn:443 < /dev/null 2>&1 | openssl x509 -enddate 2>/dev/null | perl -ne 'if(/^notAfter=(.+)/){print "$1";}' | xargs -i date -d '{}' '+%Y-%m-%d %H:%M:%S %Z'
    2.  
    3. 2013-10-01 12:10:13 JST

トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2018-08-17 (金) 14:26:05 (4d)