opensslコマンド関係の備忘録。
サーバに設定された証明書を確認する
正しくSSL通信が為されているならば証明書の署名と発行者、またSSLネゴシエーションのパラメータや暗号方式が得られる。
openssl s_client -connect HOSTNAME_OR_ADDR:443 -showcerts
中間証明書が正しく設定されているならばそれらを通じてルートCAまで一貫して辿れることが確認できる。 なお、ポート番号にはデフォルトでは以下を指定する。
- 443 HTTPS
- 995 POP over SSL
- 465 SMTP over SSL
- 993 IMAPS
このコマンドは「---」で表示が止まるが、TCPセッションは接続したままになっている。HTTPSの場合はget /
ENTERを打てばトップページの内容が得られるし、SMTPならHELO
等を打つことでSMTPサーバと直接会話することができる。
証明書ファイル(CRT)の内容を確認する
-inform
を省略した場合は-in
ファイルは(BASE64エンコードされた)PEMフォーマットであると仮定する。解読できない場合はDERを指定してみると良い。これは他のコマンドでも同様である。
openssl x509 -in "CERTFILE.PEM" -noout -text
openssl x509 -in "CERTFILE.CRT" -inform der -noout -text
証明書ファイルの有効期間を確認する
-text
での表示内容から有効期間(Validity)フィールドだけを表示する。
openssl x509 -in "CERTFILE.PEM" -noout -dates
notBefore=Jan 28 17:19:49 2015 GMT
notAfter=Jan 29 17:58:54 2016 GMT
証明書ファイルの要求使用者名を確認する
-text
での表示内容から要求使用者(Subject)フィールドだけを表示する。
openssl x509 -in "CERTFILE.PEM" -noout -subject
subject= /C=JP/CN=secure.example.jp/emailAddress=hostmaster@example.jp
証明書ファイルの発行署名者を確認する
-text
での表示内容から発行署名者(Issuer)フィールドだけを表示する。
openssl x509 -in "CERTFILE.PEM" -noout -issuer
issuer= /C=IL/O=StartCom Ltd./OU=Secure Digital Certificate Signing/CN=StartCom Class 1 Primary Intermediate Server CA
証明書申請ファイル(CSR)の内容を確認する
openssl req -in "CERTRESIGNQUEST.PEM" -noout -text
秘密鍵ファイルの内容を確認する
openssl rsa -in "PRIVATEKEY.PEM" -noout -text
証明書と秘密鍵の公開鍵(PUB)が一致するかを確認する
これは証明書と秘密鍵それぞれから公開鍵を抽出して比較することで実現できる。
openssl rsa -in "PRIVATEKEY.PEM" -pubout -out "PUBKEY.PEM"
openssl x509 -in "CERTIFICATE.PEM" -pubkey -noout > "CERTPUB.PEM"
diff "PUBKEY.PEM" "CERTPUB.PEM" && echo OK
秘密鍵のパスフレーズを削除する
サービスデーモンで使用する秘密鍵は、サービスを起動する度に毎回パスフレーズ入力を求められることになるのを避けるため、セキュリティ的に弱くなるのを承知しつつパスフレーズを削除しておくのが一般的1だ。入力ファイルと出力ファイルは同じファイル名にして上書き保存しても良いし別ファイルに変えても良い。普通は使用するサービスが区別できるような名前にするだろう。
openssl rsa -in "PRIVATEKEY.PEM" -out "SERVERKEY.PEM"
作成した秘密鍵ファイルは速やかにファイル属性をrootユーザの読み込み専用に変更し、通常は/etc/pki/tls/certs/
に適切な名前で格納する。
openssl rsa -in localhost.key -out localhost.key
chown root.root localhost.key
chmod 400 localhost.key
mv localhost.key /etc/pki/tls/certs/
証明書のフォーマット変換
UNIX系サーバソフトやアプリではPEM形式が多用されるが事実上平文も同然なので、外部とのやりとりやWindows/Macintosh上ではDER形式やPKCS12形式を利用するほうが多いだろう。なのでファイルフォーマット変換は利用する機会が多い。2
openssl x509 -in "input_file.der" -inform DER -out "output_file.pem" -outform PEM
openssl x509 -in "input_file.der" -inform DER -text -noout
openssl x509 -in "input_file.pem" -inform PEM -out "output_file.der" -outform DER
openssl pkcs12 -export -in "input_file.pem" -out "output_file.p12" -name "FRIENDLYNAME"
PKCS12への変換はシステムから外部へのエクスポートなのでパスフレーズの設定入力が求められる。-name
は任意入力だがたいていは誰彼が使うために発行したのかが区別できるように書く。
openssl pkcs12 -in "input_file.p12" -nodes -out "output_file.pem"
PKCS12からの変換は外部からシステムへのインポートなので正しいパスフレーズを解除入力しないと実行されない。
なおWindowsでは証明書ファイルをフォーマット形式ではなく用途によって既定の拡張子を定めている。用途と合致しない拡張子の証明書をインポートしようとすると正しい場所へストアされずに悩まされることがある。3
証明書の正当性検証
ルートCA証明書は自分自身を証明して他には依存していないため以下のコマンドでOKが返る。4
openssl verify ルートCA証明書
ルートCA証明書で直接署名された(ルートから見て深さが1の)証明書は-CAfile
オプションにルートCA証明書を与えることで直接検証できる。
openssl verify -CAfile 親証明書 子証明書
中間CA証明書で署名された(ルートから見て深さが2以上の)証明書の場合は検証確認が煩雑になる。取り敢えず簡便なのは、ルートCA証明書と必要な中間CA証明書をすべて含む一つの親証明書を作成してこれで検証する方法だろう。
cat StartSSL_CA_Root.pem StartSSL_CA_Class1.pem > StartSSL_CA.pem
openssl verify -CAfile StartSSL_CA.pem cert.pem
cert.pem: OK
アプリケーションのSSL警告を抑制する
システムにバンドルされていない証明書をシステムに追加するにはca-certificates
パッケージに付属のupdate-ca-trust
コマンドを使用する。/etc/pki/ca-trust/source/anchors/
に中間CA証明書をコピーしてupdate-ca-trust extract
を実行すると/etc/pki/ca-trust/extracted/pem/*.pem
証明書ストアに結合される。5
cp StartSSL_CA_Class1.pem /etc/pki/ca-trust/source/anchors/
update-ca-trust extract
openssl verify -CAfile /etc/pki/ca-trust/extracted/pem/tls-ca-bundle.pem cert.pem
cert.pem: OK
この証明書ストアはwget
コマンド等が参照しているので、この作業を行うとこのCA証明書を参照するホストについては--no-check-certificate
オプションを付加する必要がなくなる。自作CA証明書(いわゆるオレオレ証明書)もこの方法でシステムに登録できる。
パスフレーズ未削除運用するときに考慮すべき最大の問題は、サーバマシン自体を再起動した際にサービスそのものが、現場でサーバ管理者が正しいパスフレーズを入力するまで機能停止しつづけることだろう。時にはこのパスフレーズを誰も知らなかったり唯一知っていたはずの人物が何年も前に他界してたりするものである。 ↩
慣習的なものだが拡張子の用途とファイル形式が合致していないので混乱しやすい。.pemはPEM形式であることを示すがそれだけではKEYかCSRかCRTか判らないし、.crtが証明書なのは判るもののPEMかDERかPKCS7かはファイルを開いてみるまで判らない。 ↩
Windowsの場合.crtはサーバ用証明書で.pfxは個人用クライアント証明書と見做され.derはOutlookやアドレス帳へのクライアント証明書インポートに使われる。 ↩
システムにバンドル済のルートCA証明書は/etc/pki/tls/certs/ca-bundle.crtに、信頼済証明書は/etc/pki/tls/certs/ca-bundle.trust.crtに結合されて格納されている。これらはca-certificatesパッケージで提供されておりyum updateで更新されることもありえるから直接編集するべきではない。 ↩
更新されるストアファイルはemail-ca-bundle.pem、objsign-ca-bundle.pem、tls-ca-bundle.pemの3つで、それぞれメール個人署名、オブジェクトコード署名、SSL通信署名に対応する。 ↩