怒られないオレオレ証明書を作る
はじめに
localhostをSSL化すると、ブラウザから警告が出る場合があります。
ここではブラウザの警告が出ないようにしつつ、localhostをSSL化する手順を紹介します。
作るものは大きく分けて「ルート認証局」「中間認証局」「サーバー証明書」の3つです。
開発環境
- Windows 11
- WSL 2.0.9.0
- Ubuntu 22.04.3
- Openssl 3.0.2
証明書の作成
作業環境の構築
ディレクトリを作成し、その中へ移動します。
mkdir ~/ssl && cd $_
設定ファイルを作成します。セクション[ SAN ]
には、証明書を適用したいドメインを追加してください。
vi ./openssl.cnf
################################################################
# default
HOME = .
config_diagnostics = 1
oid_section = default_oids
[ default_oids ]
tsa_policy1 = 1.2.3.4.1
tsa_policy2 = 1.2.3.4.5.6
tsa_policy3 = 1.2.3.4.5.6.7
################################################################
# ca command
[ ca ]
default_ca = ca_default
[ ca_default ]
dir = .
certs = $dir/certs
crl_dir = $dir/crl
database = $dir/index.txt
new_certs_dir = $dir/newcerts
certificate = $dir/csr.pem
serial = $dir/serial
crlnumber = $dir/crlnumber
crl = $dir/crl.pem
private_key = $dir/key.pem
name_opt = ca_default
cert_opt = ca_default
default_days = 365
default_crl_days = 365
default_md = sha256
default_bits = 2048
preserve = no
policy = ca_policy
x509_extensions = ca_extensions
[ ca_policy ]
countryName = optional
stateOrProvinceName = optional
localityName = optional
organizationName = optional
organizationalUnitName = optional
commonName = supplied
emailAddress = optional
[ ca_extensions ]
authorityKeyIdentifier = keyid,issuer
basicConstraints = CA:TRUE
subjectAltName = @SAN
subjectKeyIdentifier = hash
################################################################
# req command
[ req ]
prompt = no
default_md = sha256
default_bits = 2048
string_mask = utf8only
distinguished_name = req_dn
x509_extensions = req_extensions
[ req_dn ]
CN = Localhost
[ req_extensions ]
authorityKeyIdentifier = keyid,issuer
basicConstraints = CA:FALSE
subjectAltName = @SAN
subjectKeyIdentifier = hash
################################################################
# SAN
[ SAN ]
DNS.1 = localhost
DNS.2 = www.localhost
ルート認証局の作成
ディレクトリを作成し、その中へ移動します。
mkdir ~/ssl/rca && cd $_
必要なディレクトリとファイルを作成します。
mkdir ./certs ./crl ./newcerts
touch ./index.txt
echo "00" > ./serial
echo "00" > ./crlnumber
秘密鍵を作成します。
openssl genrsa -out ./key.pem
証明書署名要求を作成します。
openssl req -config ../openssl.cnf \
-new -key ./key.pem -out ./csr.pem \
-subj "/CN=Localhost RCA"
証明書署名要求に署名します。質問が表示されたらy
で答えてください。
openssl ca -config ../openssl.cnf \
-selfsign -in ./csr.pem -out ./crt.pem
証明書を作成します。
openssl x509 -in ./crt.pem -out ./rca.crt
中間認証局の作成
ディレクトリを作成し、その中へ移動します。
mkdir ~/ssl/ica && cd $_
必要なディレクトリとファイルを作成します。
mkdir ./certs ./crl ./newcerts
touch index.txt
echo "00" > serial
echo "00" > crlnumber
秘密鍵を作成します。
openssl genrsa -out ./key.pem
証明書署名要求を作成します。
openssl req -config ../openssl.cnf \
-new -key ./key.pem -out ./csr.pem \
-subj "/CN=Localhost ICA"
証明書署名要求に署名します。質問が表示されたらy
で答えてください。
openssl ca -config ../openssl.cnf \
-in ./csr.pem -out ./crt.pem \
-keyfile ../rca/key.pem -cert ../rca/crt.pem
証明書を作成します。
openssl x509 -in ./crt.pem -out ./ica.crt
サーバー証明書の作成
ディレクトリを作成し、その中へ移動します。
mkdir ~/ssl/server && cd $_
必要なディレクトリとファイルを作成します。
mkdir ./certs ./crl ./newcerts
touch ./index.txt
echo "00" > ./serial
echo "00" > ./crlnumber
秘密鍵を作成します。
openssl genrsa -out ./key.pem
証明書署名要求を作成します。
openssl req -config ../openssl.cnf \
-new -key ./key.pem -out ./csr.pem \
-subj "/CN=Localhost Server"
証明書署名要求に署名します。質問が表示されたらy
で答えてください。
openssl ca -config ../openssl.cnf \
-in ./csr.pem -out ./crt.pem \
-keyfile ../ica/key.pem -cert ../ica/crt.pem
証明書を作成します。
openssl x509 -in ./crt.pem -out ./server.crt
証明書チェーンの作成
カレントディレクトリを移動します。
cd ~/ssl
証明書チェーンを作成します。
cat ./rca/rca.crt ./ica/ica.crt >> ./server/chain.pem
証明書チェーンでサーバー証明書を検証します。
OK
が表示されたら成功です。
openssl verify -CAfile ./server/chain.pem ./server/server.crt
証明書の使い方
ルート認証局の証明書をインストールする
- Windowsでルート認証局の証明書(~/ssl/rca/rca.crt)を開きます。
- 警告が表示されたら「開く」を選択します。
- 証明書が表示されたら「証明書のインストール」を選択します。
- 保存場所を「現在のユーザー」に設定し、「次へ」を選択します。
- 証明書ストアを「証明書をすべて次のストアに配置する」に設定し、「信頼されたルート証明機関」を参照してから「次へ」を選択します。
- 設定を確認して「完了」を選択します。
- 警告が表示されたら「はい」を選択します。
- 完了メッセージが表示されたら「OK」を選択します。
- 証明書の「OK」を選択して閉じます。
中間認証局の証明書をインストールする
- Windowsで中間認証局の証明書(~/ssl/ica/ica.crt)を開きます。
- ルート証明局と同様に証明書ストアの選択まで進み、「中間証明機関」を参照してから「次へ」を選択します。
- ルート証明局と同様にインポートを完了します。
サーバー証明書をApache2で利用する
WSLにApache2をインストールして起動します。
sudo apt update
sudo apt upgrade -y
sudo apt install apache2
sudo systemctl enable apache2
sudo systemctl start apache2
必要なファイルをコピーします。
sudo cp ~/ssl/server/server.crt /etc/ssl/certs/server.crt
sudo cp ~/ssl/server/key.pem /etc/ssl/private/server.key
設定ファイルを作成します。
sudo vi /etc/apache2/sites-available/vhost.conf
<VirtualHost *:80>
ServerName localhost
ServerAlias www.localhost
DocumentRoot /var/www/html
</VirtualHost>
<VirtualHost *:443>
ServerName localhost
ServerAlias www.localhost
DocumentRoot /var/www/html
SSLEngine on
SSLCertificateFile /etc/ssl/certs/server.crt
SSLCertificateKeyFile /etc/ssl/private/server.key
</VirtualHost>
モジュールと設定ファイルを有効化します。
sudo a2enmod ssl
sudo a2ensite vhost
Apache2を再起動します。
sudo systemctl restart apache2
SANに設定したドメインにSSLでアクセスできるか確認します。警告なしでアクセスできれば成功です。
https://localhost
https://www.localhost
2024年5月28日追記
中間認証局と証明書チェーンの作成は任意で大丈夫です。
中間認証局を作成しない場合は、サーバー証明書署名要求の署名時に、「ica」の部分を「rca」に変更してください。
openssl ca -config ../openssl.cnf \
-in ./csr.pem -out ./crt.pem \
-keyfile ../ica/key.pem -cert ../ica/crt.pem
openssl ca -config ../openssl.cnf \
-in ./csr.pem -out ./crt.pem \
-keyfile ../rca/key.pem -cert ../rca/crt.pem
参考リンク
Discussion