Memo/Linux/SSL

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

SSL証明書


中間証明書(CA)の表示

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

key/crtの一致検証

  • nginxの起動時に以下のエラーで失敗する場合、key/crtが間違っている
    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が一致するなら成功。異なる場合、どちらかが間違っている。
    openssl rsa -in example.com.key -modulus -noout | openssl md5
    (stdin)= <md5_1>
    
    openssl x509 -in example.com.crt -modulus -noout | openssl md5
    (stdin)= <md5_1>

pfx形式から変換

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

# key: 秘密鍵
openssl pkcs12 -in exsample.pfx -nocerts -nodes -out exsample.key

# body.crt: 証明書
openssl pkcs12 -in exsample.pfx -clcerts -nokeys -out exsample.body.crt

# chain.crt: 中間証明書
openssl pkcs12 -in exsample.pfx -cacerts -nokeys -out exsample.chain.crt
  • 出力されたファイル中のヘッダ情報を消す
  • 中間証明書でエラーが出る場合、中間証明書内の順序を入れ替える

ランダムな16進数の生成

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

自己証明書の作成

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

有効期限のチェック

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

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

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

  • RHEL/CentOS:
    sudo yum update ca-certificates

openssl にタイムアウトを設定

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

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

全てのSSL証明書の表示

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

SHA-2の検証


SSL証明書の作成

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

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

  • crtファイルからチェック
    openssl x509 -noout -text -in example.com.crt
    
    #Not Before(証明書の発行日時)
    #Not After(証明書の有効期限)
    
    # 有効期限をGMTからUTCへ変換
    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'
    2016-10-04 03:54:51 UTC
  • 有効期限内だが、証明書発行元で無効にした場合は検出できなかった
  • curl
  • openssl s_client -connect
  • 有効/無効だけの判断
    fqdn=www.google.com
    
    # SSL証明書に問題が無い場合、終了ステータスは0
    curl -s https://$fqdn/ > /dev/null; echo $?
    0
    
    # 問題があるSSL証明書や設定されていない場合、0以外
    curl -s https://$fqdn/ > /dev/null; echo $?
    51
  • 期限をローカルタイムで表示
    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'
    
    2013-10-01 12:10:13 JST

トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2018-09-15 (土) 07:31:38 (35d)