Skip to main content

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証明書を配布して事前にインストールしてもらうようにすれば、身元確認の問題はおきないのではないか。 限定された範囲での利用なら、この運用で問題ないのではないか。