開発環境をHTTPS化。自前の認証局でSSL証明書を署名

PWAの開発環境を作るために自前(オレオレ)証明書をインストールしたときの覚書。


環境

開発クライアント: Windows 10 64bit, Google Chrome 68, Firefox 61.0.1
開発VMサーバー:CentOS 7.5.1804, nginx 1.14.0, OpenSSL 1.0.2k-fips

レンタルオフィス内のルーター内に開発環境があるためcertbotを使って環境を整えることができない。

名前解決はWindowsのhostsファイルで行う。


参考サイト

自動スクリプトの記事は「NET::ERR_CERT_AUTHORITY_INVALID」になったけど、今後自動化するときの参考になりそう。


目次

  1. 自前の認証局ルート証明書を作成
  2. 証明書署名要求(CSR)を作成して署名
  3. nginxに設定
  4. Google Chromeに認証局ルート証明書をインポート
  5. 開発サイトを開く(動作確認)



1.自前の認証局ルート証明書を作成

前に自分で調べたときの記事を参考にしながら作る。

コマンドメモ
# mkdir /etc/nginx/ssl.d/
# cd /etc/nginx/ssl.d/

ルート認証局用の証明書はOpenSSLが用意してくれているシェルスクリプトを利用する。
# /etc/pki/tls/misc/CA -newca

/etc/pki/CA/に出力される。
CA証明書: /etc/pki/CA/cacert.pem
CA秘密鍵: /etc/pki/CA/private/cakey.pem



2.証明書署名要求(CSR)を作成して署名

HTTPS化したいドメインは「dev.dksg.co.jp」

秘密鍵と証明書署名要求(CSR)を作る
# openssl req -new -sha256 -nodes -out server.csr -newkey rsa:2048 -keyout dev.dksg.co.jp.key

Google Chrome 58以上に対応するためにv3.extを作って対応する(詳細は参考サイトを参照)。
# vi v3.ext

authorityKeyIdentifier=keyid,issuer
basicConstraints=CA:FALSE
keyUsage = digitalSignature, nonRepudiation, keyEncipherment, dataEncipherment
subjectAltName = @alt_names

[alt_names]
DNS.1 = dev.dksg.co.jp


自前認証局の証明書を使って署名実行。
# openssl x509 -req -in server.csr -CA /etc/pki/CA/cacert.pem -CAkey /etc/pki/CA/private/cakey.pem -CAcreateserial -out dev.dksg.co.jp.crt -days 1000 -sha256 -extfile v3.ext



3.nginxに設定

作成した証明書と秘密鍵をnginxに設定

server {
     listen       443 ssl;
     server_name  dev.dksg.co.jp;

    root    /home/httpd/dksg-hp/wordpress;

    # WordPress Setting
     include conf.d/global/wordpress_restrictions.conf;
     include conf.d/global/wordpress_dev.conf;

    # SSL
     include conf.d/global/ssl.conf;
     ssl_certificate      /etc/nginx/ssl.d/dev.dksg.co.jp.crt;
     ssl_certificate_key  /etc/nginx/ssl.d/dev.dksg.co.jp.key;
}

テストして再起動
# nginx -t
# systemctl restart nginx



4.Google Chromeに認証局ルート証明書をインポート

作成した「/etc/pki/CA/cacert.pem」をWindowsに持ってくる。

Google Chromeの「Settings > Advanced > Privacy and security > Manage certificates」から「ルート証明書」としてインポート。

image

Chromeの再起動は必要なし。



5.開発サイトを開く(動作確認)

既に開いているのを更新すると「Not secure」ままだったけど、開き直したら無事HTTPS化になった。

image


Firefoxの場合はOSの証明書を参照しないようになっているので、「about:config」で「security.enterprise_roots.enabled」をtrueして再起動。

でもやっぱり「安全な接続ではありません」になるので、例外として追加した。


今後はマルチドメイン化してドメインごとに証明書を作らないようにしたい。


< Related Posts >