nginx オレオレ証明書/Let's EncryptでSSL証明書
【目次】
オレオレ証明書を作る
SSL証明書を作る。なぜオレオレかというと、本来別物の「サーバ管理者」と「認証局」の2役を自分でやるから。
手順
- サーバ管理者が秘密鍵ファイル(server.key)を作成
- サーバ管理者が秘密鍵ファイルから、公開鍵(Public Key)と秘密鍵のハッシュを組合わせ、証明書署名要求ファイル(server.csr)を作成、認証局に送付。
- 認証局は自分の秘密鍵で証明書署名要求ファイルに署名し、サーバ証明書(server.crt)を作成し返却。
(認証局が自分の秘密鍵でサーバの公開鍵を署名している)
※CSR作成時にできたサーバの秘密鍵は、サーバ管理者が保持。
対象 | ファイル名 |
---|---|
秘密鍵 (Private Key) | server.key |
証明書署名要求 (CSR) | server.csr |
サーバ証明書(CRT) | server.crt |
server.key (秘密鍵) ・ server.csr (証明書署名要求)・ server.crt (サーバ証明書)
各種の保存先は/etc/nginx
配下にした。
さっそく作業をしていく。
$ openssl genrsa 2048 > server.key # 秘密鍵作成 $ openssl req -new -key server.key > server.csr # 証明書署名要求(CSR)の作成 # 情報をいろいろ入力 # この際Common Name (e.g. server FQDN or YOUR name) []: には # Virtual Hostのドメイン名を入れること! $ openssl req -text < server.csr # 作成されたserver.csrの中身を確認 $ openssl x509 -days 3650 -req -signkey server.key < server.csr > server.crt # CSRに署名、サーバ証明書(CRT)作成 # getting Private keyと出る $ openssl x509 -text < server.crt # 作成されたserver.crtの中身を確認 $ sudo vim /etc/nginx/sites-available/XXX.work # Virtual Hostの設定ファイル修正
Virtual Hostの設定ファイルを修正。
server { listen 443 ssl; server_name www.XXX.work XXX.work ; ssl on; ssl_certificate /etc/nginx/server.crt; ssl_certificate_key /etc/nginx/server.key; access_log /srv/XXX.work /log/access.log; error_log /srv/XXX.work /log/error.log; location / { root /srv/XXX.work /public/; index index.html index.php; } }
/etc/nginx/server.crt
はCRTの置き場のこと。/etc/nginx/server.key
はkeyの置き場のこと。
これで設定は完了。
あとはnginxを再起動させる前に、文法チェック。
$ sudo nginx -t # 設定ファイルが正しい文法で書けているか確認 $ sudo service nginx reload # nginx.confを再読込
これでhttps://www.XXX.work
にアクセスできればOK
オレオレSSLのため、この段階だと警告が出る。
警告なくすぞ!Let's EncryptでSSL証明書を作る
オレオレ証明書の警告をなくすため、SSL証明書を取得する。
Let's Encryptは無料なのでそちらを利用。ちなみにLet's Encryptは、HTTPSの普及のために無料で証明書を発行してくれるCA。
certbotをインストール
SSL証明書の発行にはcertbot
を利用するので、まずはこちらをインストール。
参考:Certbot
$ sudo apt-get install certbot python-certbot-nginx $ sudo certbot certonly --nginx # 証明書の取得(certonlyなしだと、同時にnginx confを自動編集する) $ sudo certbot renew # 証明書を自動更新する
HTTPS通信の設定
httpsで表示されるように設定する。
まずは/etc/letsencrypt/live/XXX.work #ls -l
で発行された証明書たちを確認する。
ファイル名 | 正体 |
---|---|
cert.pem | 証明書 |
chain.pem | 中間証明書 |
fullchain.pem | 証明書+中間証明書の連結ファイル |
privkey.pem | 秘密鍵 |
これらのうち、confファイルには
ssl_certificate
:証明書+中間証明書の連結ファイル(fullchain.pem)
ssl_certificate_key
:秘密鍵(privkey.pem)
を設定する。
$ sudo vim etc/nginx/sites-available/XXX.work
でファイルを編集する。
server { listen 443 ssl; ssl_certificate /etc/letsencrypt/live/XXX.work /fullchain.pem; ssl_certificate_key /etc/letsencrypt/live/XXX.work /privkey.pem; server_name www.XXX.work XXX.work ; access_log /srv/XXX.work /log/access.log; error_log /srv/XXX.work /log/error.log; location / { root /srv/XXX.work /public/; index index2.html index.php; } } server { listen 80; server_name www.XXX.work ; access_log /srv/XXX.work /log/access.log; error_log /srv/XXX.work /log/error.log; location / { root /srv/XXX.work/public/; index index.html index.php; } }
再起動してhttps://www.XXX.work
が見られるようになっている!
(URLのとこにも鍵マークがついている!)
参考サイト
参考:プログラミングビギナーNekoteniがあなたに贈る!NginxでSSLの巻
参考:Certbot