自己認証局でSSLクライアント認証

忘備録

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