Chiroru's Diary

日々の学びをちょこちょこメモしていきます

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のため、この段階だと警告が出る。

f:id:chiroru_memo:20200309144051p:plain
警告

警告なくすぞ!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で発行された証明書たちを確認する。

f:id:chiroru_memo:20200309232541p:plain
証明書たち確認

ファイル名 正体
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の巻

参考:オレオレ証明書をopensslで作る(詳細版)

参考:Certbot

参考:SSLの暗号化通信のしくみ