lrlikebrother

Raspberry Pi 構築 リバースプロキシ編

HTTPS通信を行うには

Port443のSSL通信をするためにはサーバの証明書が必要

主な流れとしては

  1. 自分のサーバでCSRとKEYを作成
  2. CSRをCAへ送信して証明書の発行を申請
  3. CAから電子署名されたCRTと中間CA証明書を受け取る
  4. 受け取った証明書類をWebサーバへ設置する
  5. ランクの低い証明書であれば、Certbotを使って自動化が可能

Certbot

自動でSSL証明書を発行してくれる

CSRやKEY生成からサーバ設定まで自動で行ってくれる

Cronを使って自動更新をすることも可能

証明書の発行と認証はLet’s Encryptという認証局が行う

参考サイト1参考サイト2

早速やっていく

今回はこちらのnginxを使いながらcertbotという認証局を通してくれる便利なリポジトリを使用させていただいた

https://github.com/wmnnd/nginx-certbot

ここで注意点だが短時間で認証局にドメインテストを行いまくると

そのドメインでの認証書発行を行うまでにかなりの時間を要してしまうので注意

1時間に5回以上本番での証明書発行を行うと制限がかかるかもしれない。

それも無視してやりまくると1週間以上の待ち時間を要するらしいです(友達が1杯してました)

ReadMeに書いてある通りにshファイルを実行すればいいが

日本語のドキュメントがあまりなく、サブドメインを使っての記事が見当たらなかったためかなり沼ってしまった・・・

data/nginx/app.confファイルを変更

server {
    listen 80;
    // server_name example.org;
    // Change
    server_name xxx.com subdomain.xxx.com;

    server_tokens off;

    location /.well-known/acme-challenge/ {
        root /var/www/certbot;
    }

    location / {
        return 301 https://$host$request_uri;
    }
}

443が入ってるデフォルトのコードの塊をコピーして、必要な個数分記載する

今回の例で言うと二つ作ります

注意点としては、server_nameはdomain, subdomain名を記載しますが

ssl_certificate、ssl_certificate_keyに書くドメイン名はメインのドメインに書き換えないとうまくいかないです

server {
    listen 443 ssl;
    server_name xxx.org; // domain
    server_tokens off;

    ssl_certificate /etc/letsencrypt/live/xxx.org/fullchain.pem; // domain
    ssl_certificate_key /etc/letsencrypt/live/xxx.org/privkey.pem; // domain
    include /etc/letsencrypt/options-ssl-nginx.conf;
    ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem;

    location / {
        proxy_pass  http://xxx.org; // domain or subdomain or port
        proxy_set_header    Host                $http_host;
        proxy_set_header    X-Real-IP           $remote_addr;
        proxy_set_header    X-Forwarded-For     $proxy_add_x_forwarded_for;
    }
}

server {
    listen 443 ssl;
    server_name subdomain.xxx.org; // subdomain
    server_tokens off;

    ssl_certificate /etc/letsencrypt/live/xxx.org/fullchain.pem; // domain
    ssl_certificate_key /etc/letsencrypt/live/xxx.org/privkey.pem; // domain
    include /etc/letsencrypt/options-ssl-nginx.conf;
    ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem;

    location / {
        proxy_pass  http://subdomain.xxx.org; // domain or subdomain or port
        proxy_set_header    Host                $http_host;
        proxy_set_header    X-Real-IP           $remote_addr;
        proxy_set_header    X-Forwarded-For     $proxy_add_x_forwarded_for;
    }
}

init-letsencrypt.shファイルの変更

domainsの中身を以下にのように書き換えてください

domains=(xxx.com subdomain.xxx.com)

30行目以降のサーバー認証を作成、削除、Nginxを動かしている場所を追加したいドメイン分動かさなければいけないのですが

デフォルトの状態だと認証自体は複数でも動くけど

それ以外は単体での稼働しかできないのでダミーの認証がないって言われて承認されないので注意

for domain in "${domains[@]}"; do
  echo "### Creating dummy certificate for $domain ..."
  path="/etc/letsencrypt/live/$domain"
  mkdir -p "$data_path/conf/live/$domain"
  docker-compose run --rm --entrypoint "\
    openssl req -x509 -nodes -newkey rsa:$rsa_key_size -days 1\
      -keyout '$path/privkey.pem' \
      -out '$path/fullchain.pem' \
      -subj '/CN=localhost'" certbot
  echo
done

echo "### Starting nginx ..."
docker-compose up --force-recreate -d nginx
echo

for domain in "${domains[@]}"; do
  echo "### Deleting dummy certificate for $domain ..."
  docker-compose run --rm --entrypoint "\
    rm -Rf /etc/letsencrypt/live/$domain && \
    rm -Rf /etc/letsencrypt/archive/$domain && \
    rm -Rf /etc/letsencrypt/renewal/$domain.conf" certbot
  echo
done

テストする

12行目付近にstagingという値に0がデフォルトで入ってるので1に変更しましょう

staging=0 # Set to 1 if you're testing your setup to avoid hitting request limits

テストに成功したら作成されたいらないデータを削除します

data/配下にnginx以外のフォルダが作成されていると思うのでそれを削除して

docker-compose down

本番

上記を行い完全に削除したら本番でやって行きましょう

自信があればいきなり本番でもOK

本番環境で実行してうまくいけば完了

エラーが発生したのであればDockerのLogを見て解決すること

 ./init-letsencrypt.sh