サブジェクト代替名 (SANs) を付与したサーバ証明書を作る
最近のブラウザでは証明書のコモンネームは確認せず、サブジェクト代替名 (SANs) のみを確認します。
証明書を PC に「信頼されたルート証明機関」としてインストールしたとしても、SANs に該当 URL が無いと https 接続したときにエラーが表示されます。
今回は OpenSSL にて SANs に URL ではなく IP アドレスを付与して警告を出さないようにします。
vCenter などといった WebUI での管理コンソールアクセスでは https は自己署名になっていることが多いが、警告画面が出る状態だとブラウザは ID/パスワードを記憶してくれません。
今回のように警告が出ないようにセットアップすれば ID/パスワードを記憶してくれるようになるので便利になります。
openssl で証明書を作成
秘密鍵を作成
RSA 3072 bit で秘密鍵を作成。
# openssl genrsa -out server.key 3072
CSR を作成
C, ST, L, O, CN の情報は対話形式だと面倒なのでワンラインで。ここで CN (コモンネーム) を指定しているが前述のとおり、あまり意味はない。
# openssl req -new -key server.key -out server.csr -subj '/C=JP/ST=Tokyo/L=Default City/O=Default Company Ltd/CN=www.example.com'
SANs 用 text を生成
Linux の場合以下コマンドで作成するが、Windows の場合含め、直接 sans.txt ファイルを作成して、以下のダブルクォーテーションで囲まれた文字列を記載してもよい。
# echo "subjectAltName = IP:192.168.1.14, DNS:www.example.com" > sans.txt
ブラウザから URL ではなく IP でアクセスする場合は以下のように IP: の後にサーバの IP アドレスを指定する。上記の例ではサーバの IP アドレスは 192.168.1.14 である。URL でアクセスする場合は DNS: の後に FQDN を指定する。上記の例では www.example.com である。
作成した CSR に対して自分の秘密鍵で署名 (=自己署名)
# openssl x509 -req -days 365 -in server.csr -signkey server.key -out server.crt -extfile sans.txt
これで完成。
RedHat 系 Linux の Nginx にとりあえず導入
サンプルなので雑に作ってますのであしからず。
まずは nginx をインストールして firewalld の穴あけ。
# dnf -y install nginx # systemctl enable --now nginx # firewall-cmd --permanent --add-service={http,https} # firewall-cmd --reload
先ほど作成したファイルのうち .key と .crt を適切な場所に配置。
# cp server.key /etc/nginx/ # cp server.crt /etc/nginx/
設定ファイルを追加。
# cat << EOF > /etc/nginx/conf.d/tls.conf
server {
listen 443 ssl http2;
server_name www.example.com;
ssl_certificate "/etc/nginx/server.crt";
ssl_certificate_key "/etc/nginx/server.key";
ssl_protocols TLSv1.2 TLSv1.3;
ssl_ciphers "ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384:ECDHE-RSA-AES128-SHA";
ssl_prefer_server_ciphers off;
ssl_session_cache shared:SSL:1m;
ssl_session_timeout 120m;
root /usr/share/nginx/html;
}
EOF
サーバ再起動。
# systemctl restart nginx
ブラウザでアクセスし、警告画面を無視し、表示されることを確認した後、以下の手順で PC に証明書をダウンロード&インストール。
https://milestone-of-se.nesuke.com/knowhow/lookup-windows-cert/
これでブラウザを再起動後、再びアクセスすると警告が出ないようになる。
コメント