忘備録
CA
/etc/pki/tls/openssl.cnfがデフォルトで使われる設定ファイルで、これをCA用に修正します。
[ CA_default ] dir = /etc/pki/CA # <= 相対パスになってたら、絶対パスに直した方が良い x509_extensions = v3_ca # <= v3_caを見るようにする default_days = 365 # <= サーバ/クライアントの認証期間 default_crl_days = 3650 # <= CA自体の認証期間はこっち [ req_distinguished_name ] countryName_default = JP stateOrProvinceName_default = Kanagawa localityName_default = Yokohama 0.organizationName_default = yourcompany # <= 何でも良い organizationalUnitName_default = CA # <= 何でも良いけどサーバ/クライアントと違う値にすること commonName_default = your.domain # <= CA用の時は何でも良いと思われる emailAddress_default = mail@your.domain [ v3_ca ] keyUsage = cRLSign, keyCertSign # <= CAの場合はこれっぽい nsCertType = sslCA, emailCA, objCA # <= CAとして動作させる値を指定
サーバ向け
修正した/etc/pki/tls/openssl.cnfを/etc/pki/Server配下にコピーして、
以下の項目を追加/修正します。
[ CA_default ] x509_extensions = usr_cert # <= CA用じゃないのでusr_certを指定 [ req ] #x509_extensions = v3_ca # <= コメントアウト req_extensions = v3_req # <= v3_reqを見るようにする [ req_distinguished_name ] organizationalUnitName_default = WWW # <= 何でも良いけどCAと違う値にすること commonName_default = *.your.domain # <= サーバ名と一致させる必要あり。*で曖昧指定できる emailAddress_default = mail@your.domain # <= 何でもよさげ [ usr_cert ] keyUsage = nonRepudiation, digitalSignature, keyEncipherment # <= CAじゃない場合はこれっぽい nsCertType = server # <= serverを指定
クライアント向け
作成した/etc/pki/Server/openssl.cnfを/etc/pki/Client配下にコピーして、
以下の項目を修正します。
[ req_distinguished_name ] organizationalUnitName_default = DEV # <= 何でも良いけど違う値にすること commonName_default = client # <= 何でもよさげ emailAddress_default = # <= 何でもよさげ [ usr_cert ] nsCertType = client, email, objsign # <= クライアント用途を指定
CAの各ファイルを作成
$ /etc/pki/tls/misc/CA -newca $ echo "00" > /etc/pki/CA/crlnumber $ cd /etc/pki/CA $ openssl x509 -inform pem -in cacert.pem -outform der -out cacert.der
challengePasswordは、設定するとエラーになるWebブラウザがあった記憶があるので、
空にしておくのが無難だと思います。
crlnumberは、期限切れの証明書などを失効させるのに必要なのですが、
最初は自分で作らなければならないみたいです。
cacert.derは、WebブラウザにCAを登録するためのファイルです。
サーバの秘密鍵を作成
$ cd /etc/pki/Server $ openssl genrsa -config openssl.cnf -out key.pem -aes256 2048
上記の秘密鍵ファイルの場合、Apacheなどでは起動時にパスワード入力が必要になります。
それを避けたい場合は、さらに以下のコマンドを実行し、生成されたファイルを使います。
$ openssl rsa -in key.pem -out key2.pem
また、MySQLサーバの場合は、こちらのファイルでないとダメでした。
クライアントの秘密鍵を作成
$ cd /etc/pki/Client $ openssl genrsa -config openssl.cnf -out key.pem -aes256 2048
秘密鍵ファイルのアクセス権を変更
$ chmod 400 /etc/pki/CA/private/cakey.pem $ chmod 400 /etc/pki/Server/key.pem $ chmod 400 /etc/pki/Client/key.pem
サーバの証明書を作成(毎年)
$ cd /etc/pki/Server $ openssl req -new -config openssl.cnf -key key.pem -out csr.pem $ openssl ca -config openssl.cnf -in csr.pem -out cert.pem
クライアントの証明書を作成(毎年)
$ cd /etc/pki/Client $ openssl req -new -config openssl.cnf -key key.pem -out csr.pem $ openssl ca -config openssl.cnf -in csr.pem -out cert.pem $ openssl pkcs12 -export -in cert.pem -inkey key.pem -out cert.p12
p12形式のファイルが、クライアント証明書としてWebブラウザなどに取り込むファイルです。
ExportPasswordは、設定するとエラーになるWebブラウザがあった記憶があるので、
空にしておくのが無難だと思います。
その場合、Webブラウザなどでパスワードを聞かれたら、空でOKします。
また、以下のようにp12形式のファイルから、証明書と秘密鍵を取り出すこともできます。
$ openssl pkcs12 -in cert.p12 -nocerts -out key.pem -nodes $ openssl pkcs12 -in cert.p12 -clcerts -nokeys -out cert.pem
例えば、Gitでクライアント認証する場合は、
p12形式ではなく証明書と秘密鍵を個別に指定する必要がありますが、
そういった場合でも、クライアント端末にはcert.p12だけ配布しておけば、
必要な時に上記コマンドによって証明書と秘密鍵を取り出して使うことができます。
期限切れの証明書を失効(毎年)
$ openssl ca -gencrl -revoke /etc/pki/CA/newcerts/?.pem -out /etc/pki/CA/crl.pem
/etc/pki/CA/newcerts配下の証明書の内容をcatなどで確認して、
目的の証明書を指定します。
-outが失効情報のファイルで、例えば、ApacheのSSLCARevocationFileに指定するファイルです。
このファイルが無かったり、空だったりすると、Apacheでエラーになった記憶があるので、
最初の構築時は、証明書を余分に作って失効させておいた方が良いと思います。
/etc/pki/CA配下のcrlnumberやindex.txtを確認すると、失効状況がわかるかと思います。
引用:http://aki2o.hatenablog.jp/entry/2015/01/12/223011