openssl
自己認証局の作成・運用を手作業で実施する手順を記載する。
自己認証局の作成
(事前にindex.txtファイル、serialファイル等もろもろ準備した、作業ディレクトリで作業。)
擬似乱数ファイルの作成(ほどよく更新されるファイルのダイジェストを得る。パーミッション、更新日時に留意。)
openssl dgst -sha1 /var/log/{lastlog,wtmp*} > rand.dat
秘密鍵を作成(当面はRSAで問題ない) aes256で秘密鍵を保護。
openssl genrsa -aes256 -rand rand.dat -out cakey.pem 4096
openssl rsa -in cakey.pem -text -noout
(nooutを指定しないと保護されない秘密鍵が画面に出る。)
CSRを作成(署名アルゴリズムをsha256にしている)
openssl req -config openssl.cnf -new -sha256 -key cakey.pem -out cacsr.csr \
-subj '/C=country/ST=state/L=local/O=object name/OU=organizational unit/CN=common name'
openssl req -in cacsr.csr -text -noout
CSRより自己署名のCA証明書を作成(署名アルゴリズムをsha256にする)
openssl req -x509 -sha256 -days ddd -key cakey.pem -in cacsr.csr -out cacert.cer
openssl x509 -in cacert.cer -text -noout
CAでの、CSRに対する署名
サーバ証明書、クライアント証明書でも同様
openssl ca -md sha256 -config openssl.cnf -cert cacert.cer -keyfile cakey.pem -in servercsr.csr -out servercert.cer
Revoke、CRL作成
以前と同じDNの証明書を作りたい場合、その証明書の期限が切れていても、事前に以前のものを取り消す必要がある場合がある。
openssl ca -config openssl.cnf -cert cacert.cer -keyfile cakey.pem -revoke usercert.cer
openssl ca -config openssl.cnf -md sha256 -cert cacert.cer -keyfile cakey.pem -gencrl -out crl.pem
openssl crl -in crl.pem -text -noout
CA証明書とCRLを結合して利用する場合がある。 結合してできたファイルをCA証明書として指定することで、CRLの情報も読み取られる。(dovecot等)
cat cacert.cer crl.pem > cacert2.cer
openssl crl -in cacert2.cer -text -noout
openssl x509 -in cacert2.cer -text -noout
結合したファイルで、サーバ証明書を検証する。
openssl verify -crl_check -CAfile cacert2.cer usercert.cer
サーバ証明書の申請
クライアント証明書でも同様
擬似乱数ファイル作成。秘密鍵作成
openssl dgst -sha1 /var/log/{lastlog,wtmp*} > rand.dat
openssl genrsa -out serverkey.pem 2048
openssl rsa -in serverkey.pem -text -noout
証明書署名要求を作成 プライベートCAで自分で署名する分には、CSRの署名アルゴリズムにこだわる必要はない。 認証機関に承認を依頼する場合は影響があるとかないとか。
openssl req -config openssl.cnf -new -sha256 -key serverkey.pem -out servercsr.csr \
-subj '/C=country/ST=state/L=local/O=object name/OU=organizational unit/CN=my server'
openssl req -in servercsr.csr -text -noout
CSRをCAに申請して署名してもらう。 署名された証明書を確認する。
openssl x509 -in servercert.cer -text -noout
openssl verify -purpose sslserver -CAfile cacert.cer servercert.cer
openssl verify -purpose sslclient -CAfile cacert.cer usercert.cer
必要に応じて秘密鍵のパスフレーズ解除
openssl rsa -in serverkey.pem -out serverkey-nopass.pem
chmod 600 serverkey-nopass.pem
証明書、ssl通信のテスト
クライアントからの接続テスト
openssl s_server
-CAfile cacert.cer
-cert servercert.cer
-key serverkey.pem
-Verify num クライアント証明書を要求し、検証する
-crl_check CRLによる検証を実施
-state
サーバへの接続テスト
openssl s_client
-connect address:port 省略時はlocalhost:4433
-CAfile cacert.cer
-cert usercert.cer
-key userkey.pem
-crl_check
-state
pkcs12の作成
(スマホ、PC等にインストールできるように)クライアントの秘密鍵、証明書を1ファイルにまとめる。(拡張子はpfxやp12が一般的)
openssl pkcs12 -export -in cert.cer -inkey key.pem -out file.p12
iphoneで、CA証明書(.cer)と、p12ファイル(.p12)をメール等で送って、それぞれ「信頼」する。
[おまけ]秘密鍵と証明書の対応の確認
秘密鍵と証明書のmodulusが同一であることを確認(md5ダイジェストが一致することをもってよしとする)
openssl rsa -in 秘密鍵 -modulus -noout | openssl md5
openssl x509 -in 証明書 -modulus -noout | openssl md5
[おまけ]楕円曲線暗号を使った鍵の作成
google先生によると、prime256v1、secp384r1 あたりが良く使われるらしい。(ecdsaの使用の判断は熟慮の上で。)
openssl ecparam -list_curves
openssl ecparam -name secp384r1 -genkey -out secp384r1.key
openssl ec -in secp384r1.key -text -noout
openssl ec -in secp384r1.key -out secp384r1_aes256.key -aes256
認証局による証明書は、暗号化とサーバ運営者の身元確認という目的がある。 個人で作成する自己認証局では、暗号化はできるが身元確認ができないと言われる。 実社会で互いに信頼できる相手なら、CA証明書を配布して事前にインストールしてもらうようにすれば、身元確認の問題はおきないのではないか。 限定された範囲での利用なら、この運用で問題ないのではないか。