OpenSSLで自己認証局を作る¶
- 作成日
2018-12-05
毎回検索してたので自分用にまとめておきます。
How to setup your own CA with OpenSSL と CentOS7.2 64bit OpenSSLを使用して自己認証局で署名したSSLクライアント証明書を作成 | kakiro-web カキローウェブ を参考にしました。
試した環境はUbuntu 18.04.1 LTSでOpenSSLのバージョンは1.1.0gです。
$ openssl version
OpenSSL 1.1.0g 2 Nov 2017
自己認証局を作成¶
管理しやすくするため、OSのディストリビューションで用意されているファイルは使わず、独立した作業ディレクトリを作るという方針にします。
カレントディレクトリに myCA
というディレクトリを作ってそこで管理することにします。以下のディレクトリ名、ファイル名、証明書のサブジェクトは適宜変更してください。
mkdir -p myCA
cd myCA
認証局の秘密鍵用のディレクトリを作って鍵を生成します。4096bitのRSAにしています。
mkdir private
openssl genrsa -out private/my-ca.key.pem 4096
注釈
認証局の秘密鍵の内容を確認するには以下のコマンドを実行します。
openssl rsa -in private/my-ca.key.pem -text
上で生成した秘密鍵を使って認証局の自己証明書を作成します。
openssl req -new -sha256 -x509 -key private/my-ca.key.pem \
-days 365 \
-subj "/C=JP/ST=Osaka/L=Osaka City/O=Example, Inc./CN=my-ca.example.com" \
-out my-ca.crt.pem
注釈
認証局の証明書の内容を確認するには以下のコマンドを実行します。
openssl x509 -in my-ca.crt.pem -text
認証局用の設定ファイル my-ca.cnf
を作成します。
メッセージダイジェストのアルゴリズムはsha256にしています。
cat <<'EOF' > my-ca.cnf
# we use 'ca' as the default section because we're usign the ca command
[ ca ]
default_ca = my_ca
[ my_ca ]
# a text file containing the next serial number to use in hex. Mandatory.
# This file must be present and contain a valid serial number.
serial = ./serial
# the text database file to use. Mandatory. This file must be present though
# initially it will be empty.
database = ./index.txt
# specifies the directory where new certificates will be placed. Mandatory.
new_certs_dir = ./newcerts
# the file containing the CA certificate. Mandatory
certificate = ./my-ca.crt.pem
# the file contaning the CA private key. Mandatory
private_key = ./private/my-ca.key.pem
# the message digest algorithm. Remember to not use MD5
default_md = sha256
# for how many days will the signed certificate be valid
default_days = 365
# a section with a set of variables corresponding to DN fields
policy = my_policy
[ my_policy ]
# if the value is "match" then the field value must match the same field in the
# CA certificate. If the value is "supplied" then it must be present.
# Optional means it may be present. Any fields not mentioned are silently
# deleted.
countryName = match
stateOrProvinceName = supplied
organizationName = supplied
commonName = supplied
organizationalUnitName = optional
commonName = supplied
EOF
認証局の動作に必要なファイルとディレクトリを作成します。
mkdir newcerts
touch index.txt
echo 'unique_subject = yes' > index.txt.attr
echo '01' > serial
自己認証局を使ってサーバ証明書を発行¶
まず上記で作成した myCA
ディレクトリに移動しておきます。
まずサーバ証明書を保存する作業ディレクトリを作成します。
mkdir ../server-certs
サーバの秘密鍵を生成します。4096bitのRSAにしています。
openssl genrsa -out ../server-certs/sv01.example.com.key.pem 4096
注釈
サーバの秘密鍵の内容を確認するには以下のコマンドを実行します。
openssl rsa -in ../server-certs/sv01.example.com.key.pem -text
自己認証局に証明書の署名を依頼するためにCSR (Certificate Siging Request) を作成します。
openssl req -new -key ../server-certs/sv01.example.com.key.pem \
-sha256 \
-subj "/C=JP/ST=Osaka/L=Osaka City/O=Example, Inc./CN=sv01.example.com" \
-out ../server-certs/sv01.example.com.csr.pem
注釈
CSRの内容を確認するには以下のコマンドを実行します。
openssl req -in ../server-certs/sv01.example.com.csr.pem -text
自己認証局で証明書を発行し署名します。
openssl ca -batch -config my-ca.cnf \
-days 365 \
-notext \
-out ../server-certs/sv01.example.com.crt.pem \
-infiles ../server-certs/sv01.example.com.csr.pem
注釈
証明書の内容を確認するには以下のコマンドを実行します。
openssl x509 -in ../server-certs/sv01.example.com.crt.pem -text
また証明書を発行すると serial
ファイル内のシリアル番号が1増加され、index.txt
というファイルに発行したときのサブジェクト(-subj
オプションで指定した値)と発行時のシリアル番号などが記録されます。
上記で index.txt.attr
に unique_subject = yes
と指定したので、同じサブジェクトで再度証明書を発行しようとすると index.txt
の中身をチェックしてエラーが出るようになります。