サイトアイコン アラコキからの Raspberry Pi 電子工作

Let’s Encrypt の証明書で nginx を HTTPS化し SSL通信にする

Raspberry Pi + nginx = Webサーバー
Let's Encrypt の証明書でHTTP/2化し、
無料で 『セキュリティ評価:A+』 を取得
 
「SSLなう! (https://sslnow.ml/)」はブラウザ上で動作する Let’s Encrypt クライアントで、
・証明書発行までほぼブラウザのみで可能
・ドメイン名所有確認方法として http-01 と dns-01 に対応
・証明書発行のための通信はすべて ブラウザ と Let’s Encrypt サーバ の間で直接行われる
・証明書申請用の署名鍵・連絡先はブラウザの localStorage に保存
と、超簡単!
 
サイト arakan60.mydns.jp で A+ を取得。
 
 

 

スポンサー リンク

 

 
 
 
 
 
1. 「SSLなう!」にした理由
 
証明書の取得における厄介な問題点
 1. 認証局のクライアントアプリのインストールが必要。
 2. 証明書申請のために、メールアドレスが必要。
.
1.認証局のクライアントアプリのインストールについて
Let’s Encryptクライアントのダウンロードの場合、『Debian 7 (wheezy) のパッケージ管理システムには Certbot クライアントは収録されていません。』ということで、certbot-auto のセットアップに苦労した。
 
2. 証明書申請のために、メールアドレスが必要
殆んどの認証局で、証明書を申請する時点で、
postmaster@mydns.jp
hostmaster@mydns.jp
webmaster@mydns.jp
postmaster@arakan60.mydns.jp
hostmaster@arakan60.mydns.jp
webmaster@arakan60.mydns.jp
のようなメールアドレスが求められるが、サーバーにメールシステムが設定されていなければお手上げだ。
 

そこで、Let's Encrypt の証明書をブラウザ上で簡単 に取得できる、「SSLなう! (https://sslnow.ml/)」を利用した。→ 変更:「SSLなう! (https://sslnow.cf/)」

以下、「SSLなう! 」によるSSL化の記録。

 
 
 
2. 「SSLなう!」による証明書の取得
 
2. 「SSLなう!」による証明書取得手順
 2-1. Let's Encrypt へ登録
 2-2. チャレンジトークンの取得
 2-3. ドメイン名の所有確認
 2-4. 証明書発行申請
 2-5. 発行された証明書の保存
 
2-1. Let's Encrypt へ登録。
 
処理中です画面。
 
登録に成功しました画面。
 
登録が完了すると、次回以降はブラウザから自動的に署名鍵が読み込まれ、登録のステップはスキップされる。
 
2-2. チャレンジトークンの取得。
証明書を取得したいドメイン名を入力し「トークンを取得」ボタンを押す。
複数のドメイン名に対する証明書を発行したい場合は「追加」ボタンを押す。
 
トークンの取得に成功しました画面。
 
2-3. ドメイン名の所有確認。
トークンが取得できたら、URL欄にトークンをアップロードするディレクトリーが表示されるので、ディレクトリーとファイルを用意し、そのファイルの中に、右側に表示されている内容を貼り付けて、アップロードする。アップロードが出来たら『確認ボタン』を押す。
 
所有権の確認に成功しました画面。
 
2-4. 証明書発行申請。
「RSA」を選んで、秘密鍵の「生成」ボタンを押す。
秘密鍵を一度生成し、保存されているならばその内容を貼り付ければよい。
 
RSA 秘密鍵を生成しました画面。
 
秘密鍵が生成されたら『クリップボードにコピー』を押し、保存しておく。
これが、今後必要となる秘密鍵『privkey.pem』である。
「証明書発行申請」ボタンを押して証明書の発行を申請する。
 
証明書の取得に成功しました画面。
 
証明書発行申請を何回も繰り返すと、” Too many certificates already issued for:xxxxx ” という、エラーメッセージが出て発行申請が出来なくなる。
 
一週間に 5回以上はエラーになるようで、丸一週間待てば、再発行可能になる。
 
2-5. 発行された証明書の保存。
証明書は3種類発行されるので、それぞれコピーして保存する。
 
①.cert.pem(サーバ証明書)
 
②.chain.pem(中間証明書)
③.fullchain.pem(サーバ証明書と中間証明書が結合されたもの)
 
以上で、証明書の取得は完了。
 
 
 
3. nginx サーバー設定:HTTPS通信を有効化
 
 3-1. 証明書と秘密鍵の配置
 3-2. sudo nano /etc/nginx/sites-available/default の編集
 
証明書が取得出来たら、HTTPS通信を有効化するために、nginx の設定変更を行うが、この前に、ufw で設定した、iptables でのファイヤウォールに、ポート番号443 を通す ufw allow 443/tcp を行っておく。(これを忘れていた為、他のドメインににリダイレクトされ悩む。)
 
3-1. 証明書と秘密鍵を次の場所に配置。
# 証明書
 /etc/letsencrypt/live/arakan60.mydns.jp/fullchain.pem
# 秘密鍵
 /etc/letsencrypt/live/arakan60.mydns.jp/privkey.pem
 
3-2. sudo nano /etc/nginx/sites-available/default の編集。
Let's Encrypt の証明書と秘密鍵を nginx の ssl_certificate と ssl_certificate_key で指定する。
server {
  listen 80;
  server_name arakan60.mydns.jp;
  return 301 https://$host$request_uri;
}

server {
  listen 443;
  ssl on;
  server_name arakan60.mydns.jp;
  root /home/yaopi/www;

  ssl_certificate /etc/letsencrypt/live/arakan60.mydns.jp/fullchain.pem;
  ssl_certificate_key /etc/letsencrypt/live/arakan60.mydns.jp/privkey.pem; 
  ...省略...
 
上部の5行で、HTTP→HTTPS リダイレクト指定を行っている。
尚、ここで ssl_protocols 等について設定を省いているのは、
/etc/nginx/nginx.conf に記述があるからである。
 
以上で、SSL化に関する設定は、すべて完了。
 
 
2019.12.09 追記
 
/etc/nginx/conf.d/default.conf の記述について。
 listen 443;
 ssl on;
 
 
上記の記述だと、【sudo nginx -t】で次の警告が出る。
nginx: [warn] the "ssl" directive is deprecated, use the "listen ... ssl" directive instead in /etc/nginx/conf.d/default.conf:21
 
警告が出ない、修正版の記述要領。
  listen 443 ssl;
  # ssl on;
 
 
 
4. 「Qualys SSL Labs」でのセキュリティ評価
 
4-1. 上記設定での結果は " B " となった
 
原因は、" This server supports weak Diffie-Hellman (DH) key exchange parameters. Grade capped to B. " とのこと。
 
4-2. チューニング後の結果。
次のような設定を追加した。
 
sudo nano /etc/nginx/nginx.conf の編集。
##
# SSL Settings
##
ssl_protocols TLSv1 TLSv1.1 TLSv1.2; # Dropping SSLv3, ref: POODLE
ssl_prefer_server_ciphers on;

# 安全でない暗号化スイートはサポートしない
ssl_ciphers  'ECDH !aNULL !eNULL !SSLv2 !SSLv3';

#HTTP Strict Transport Security --- HSTSの設定
add_header Strict-Transport-Security 'max-age=31536000; includeSubDomains; preload';

 

7行目以下を追記。

その結果!

めでたしめでたし。

 
 
2019.12.09 追記
 
最近の、警告表示。
 
警告の内容。
This server does not support Forward Secrecy with the reference browsers. Grade capped to B.
 
Forward Secrecy設定が必要、というメッセージに変わった。
 
Nginxでの Forward Secrecy の設定方法。
        ##
        # SSL Perfect Forward Secrecy(PFS)を有効にする Settings
        ##
        ssl_protocols TLSv1 TLSv1.1 TLSv1.2; # Dropping SSLv3, ref: POODLE
        ssl_prefer_server_ciphers on;

        # 安全でない暗号化スイートはサポートしない
        # ssl_ciphers  'ECDH !aNULL !eNULL !SSLv2 !SSLv3';
        ssl_ciphers "EECDH+ECDSA+AESGCM EECDH+aRSA+AESGCM EECDH+ECDSA+SHA384 EECDH+ECDSA+SHA256 EECDH+aRSA+SH$"

        #HTTP Strict Transport Security --- HSTSの設定
        add_header Strict-Transport-Security 'max-age=31536000; includeSubDomains; preload';
 
 
 
5. 常時SSL化後にやること
 
 5-1. Google Search ConsoleへURL登録
 5-2. Google AnalyticsのURL変更
 5-3. WordPressの設定変更
 5-4. サイト内URL(画像・リンク)の変更
 
5-1. Google Search ConsoleへURL登録。
 
5-2. Google AnalyticsのURL変更。
 
5-3. WordPressの設定変更。
 
5-4. サイト内URL(画像・リンク)の変更。
『Search Regex』という、プラグインではうまく変換されなかったので、『Search-Replace-DB-master』という、ツールで変換した。
 
 
参考:
 
 

以上。
(2017.01.11)

 

 

スポンサー リンク

 

             

 

 

 
モバイルバージョンを終了