コマンド類

【OpenSSL】でサーバ証明書を作る with SANs

サブジェクト代替名 (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/

これでブラウザを再起動後、再びアクセスすると警告が出ないようになる。

コメント

タイトルとURLをコピーしました