🔐

怒られないオレオレ証明書を作る

2024/01/25に公開

はじめに

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
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
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

参考リンク

https://www.tohoho-web.com/ex/openssl.html

https://zenn.dev/yuulab/articles/dd8b37761c4987

https://qiita.com/bashaway/items/ac5ece9618a613f37ce5

https://qiita.com/thetsuthetsu/items/5292aab4ba5f61ce11ca

Discussion