HTTPSの設定


私はHTTPSサーバを設定する多くの方法を試みました、そして、私は最後に大好きなメソッドを見つけました.
生産証明書を支払う代わりに、Cerbot https://certbot.eff.org/とLetsEncrypt https://letsencrypt.org/を通して、あなた自身の証明書を確認するのは簡単です.
以下の流れはUbuntuのためのものです.そして、あなたの実際のバックエンドによってサーブしたファイルを持っているのと対照的にファイルを提供するためにNGinxを使用します.あなたがサーバーに完全なアクセスをするならば、私はこの解決がよりエレガントであるとわかります.

Cerbotのインストールと証明書の受信

インストール
Ubuntuの場合は20 :
sudo snap install core; sudo snap refresh core
sudo snap install --classic certbot
sudo ln -s /snap/bin/certbot /usr/bin/certbot
以前のバージョン
sudo add-apt-repository ppa:certbot/certbo
sudo apt-get update
sudo apt-get install certbot

2 . certbotの実行
sudo certbot certonly --manual
これは、プロンプトで停止しますそれを開いて、次の手順に従ってください.

3 . Certbot用の右データを提供するnginxを設定します
# Snap didn't have nginx when I was doing this setup, so:
sudo apt install nginx
sudo ufw allow 'Nginx HTTP'
(https://docs.nginx.com/nginx/admin-guide/web-server/serving-static-content/参照)
# By default nginx will serve files from /var/www/html
# Put the cert there by default, or see what works best for your setup:
sudo mkdir /var/www/html/.well-known
sudo mkdir /var/www/html/.well-known/acme-challenge
sudo vim /var/www/html/.well-known/acme-challenge/<filename from certbot>
<copy in certbot data>
sudo chmod a=r /var/www/html/.well-known/acme-challenge/<filename from certbot>

# We don't need to change anything with the above folder structure.
# Alternatively, we can change the config
sudo vim /etc/nginx/sites-enabled/default
# If you do change the config, reload nginx
sudo systemctl reload nginx

検証の終了
Certbotに戻ってくださいEnterキーを押すとプロンプトが表示されます.確認してください.
 - Congratulations! Your certificate and chain have been saved at:
   /etc/letsencrypt/live/yourdomain.com/fullchain.pem
   Your key file has been saved at:
   /etc/letsencrypt/live/yourdomain.com/privkey.pem
   Your certificate will expire on 2021-06-07. To obtain a new or
   tweaked version of this certificate in the future, simply run
   certbot again. To non-interactively renew *all* of your
   certificates, run "certbot renew"

証明書の使用
新しく作成された証明書は、ルートhttps://certbot.eff.org/docs/using.html#where-are-my-certificatesでのみ利用可能です
sudo chmod 0755 /etc/letsencrypt/{live,archive}
# In the doc above, this isn't mentioned as necessary, but I couldn't get access to the privkey w/o being explicit
sudo chmod 0755 /etc/letsencrypt/live/yourdomain.com/privkey.pem
今、あなたはいずれかのサービスによって直接これらの証明書を使用するか、またはNGNX取引をその層とすることを選択することができます.

nginxの設定
httpsのポートサフィックスでサーバを利用できるようにするには、ポート443で実行する必要があります.それはLinuxで高い特権を必要とします、そして、ノードを走らせるのは良い考えでありません.しかし、Nginxは完全にこれのためにちょうど適しています.
ポートレスアクセスを設定する良い方法はnginx経由でポート転送を設定することです.HTTP(ポート80)からリダイレクトを構成することも可能ですが、この設定ポート80では、証明書ファイルを提供するだけです.
# Open the nginx config
sudo vim /etc/nginx/sites-available/default
# Then, here is an example of a working config:

# This is just to serve the data that certbot wants, it's nginx's default config
server {
  listen 80 default_server;
  listen [::]:80 default_server;

  root /var/www/html;

  index index.html index.htm index.nginx-debian.html;

  server_name _;

  location / {
    # First attempt to serve request as file, then
    # as directory, then fall back to displaying a 404.
    try_files $uri $uri/ =404;
  }
}

# Port forwarding - this is what we want to add
server {
  listen 443 ssl; # https://stackoverflow.com/questions/51703109/nginx-the-ssl-directive-is-deprecated-use-the-listen-ssl
  server_name yourdomain.com;

  ssl_certificate           /etc/letsencrypt/live/yourdomain.com/fullchain.pem;
  ssl_certificate_key       /etc/letsencrypt/live/yourdomain.com/privkey.pem;

  ssl_session_cache  builtin:1000  shared:SSL:10m;
  ssl_protocols  TLSv1 TLSv1.1 TLSv1.2;
  ssl_ciphers HIGH:!aNULL:!eNULL:!EXPORT:!CAMELLIA:!DES:!MD5:!PSK:!RC4;
  ssl_prefer_server_ciphers on;

  access_log            /var/log/nginx/yourdomain.access.log;

  location / {
    proxy_set_header        Host $host;
    proxy_set_header        X-Real-IP $remote_addr;
    proxy_set_header        X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header        X-Forwarded-Proto $scheme;

    # NOTE: This will also work if you use
    # proxy_pass          https://localhost:8443; 
    # This could be desirable to e.g. use https
    # for the app in all environments - that way
    # you can run in development w/o nginx on https.
    proxy_pass          http://localhost:8080;
    proxy_read_timeout  90;

    # Just make sure to also update this to
    # proxy_redirect      https://localhost:8443 https://yourdomain.com;
    # if you want to use https for the server
    proxy_redirect      http://localhost:8080 https://yourdomain.com;
  }
}
あなたの実際のドメインとyourdomain.com
sudo systemctl reload nginx

Nginxなしで走る
これらの環境変数へのプロジェクトへのアクセス
SSL_PRIVATE_KEY_PATH = /etc/letsencrypt/live/yourdomain.com/privkey.pem
SSL_CERTIFICATE_PATH = /etc/letsencrypt/live/yourdomain.com/fullchain.pem
注意:このスタイルはnginx設定で動作します.はい、あなたのアプリケーションのための同じ証明書を使用することができますNGinxは、それらを受け入れるでしょうポートの転送が正しく動作します.
例えば、ノード.以下のようにロードします.
const fs = require('fs')
const express = require('express')
const https = require('https')

const loadSsl = () => {
  const privateKey  = fs.readFileSync(process.env.SSL_PRIVATE_KEY_PATH, 'utf8')
  const certificate = fs.readFileSync(process.env.SSL_CERTIFICATE_PATH, 'utf8')
  return { key: privateKey, cert: certificate }
}

const express = express()
const server = https.createServer(loadSsl(), express)
server.listen(process.env.PORT, () => { // e.g. port 8443
  console.log(`Server live on port ${process.env.PORT}`)
})
そして今、あなたはyourdomain.com:PORT(ポート接尾辞を取り除くために上のnginxセットアップに従ってください)であなたのサービスにアクセスすることができます.

devで動く
上記のように、これらの証明書を使用してサーバー上で動作しますが、開発中に実行する良い方法は何ですか?
HTTPを使用するか、または自己署名証明書を発行して、それからDEVでコードベースのいろいろな部分で自己署名証明書を受け入れるのは一般的です.
代わりに、ローカル認証局を使用してlocalhost証明書を発行するのが好きです.開発環境を最大限に生産的にするのは最もシームレスな方法です.
これは、魔法のツールmkcert(https://github.com/FiloSottile/mkcert)で行うことができ、それは音よりも簡単です
# Only do this once for all mkcert projects
brew install mkcert
brew install nss # for Firefox
mkcert -install
# Set up this repo with mkcert certificates
# I personally just keep my mkcert right in the folder of the repo.
# Don't forget to add the directory to .gitignore!
mkdir mkcert
cd mkcert
mkcert localhost
現在devでは、これらを環境に追加します(前のセクションからhttpsのロードロジックを持っていると仮定します).
SSL_PRIVATE_KEY_PATH = mkcert/localhost-key.pem
SSL_CERTIFICATE_PATH = mkcert/localhost.pem

メンテナンス
発行証明書は3ヶ月有効です.残り時間を取得するには、次のコマンドを実行します.
sudo certbot certificates
新しい証明書を手動で再発行するには、次の手順に従います.
sudo certbot --force-renewal
これはCERTBOTからのすべての証明書を更新します(すなわち、1つのマシンで複数の証明書とサービスをサポートすることを意図しています).
Certbotは自動化されるように構築されています-ので、好きならcrontabを設定する独自のスタイルを選択します.汎用renewコマンドは
sudo certbot renew
詳細については、https://certbot.eff.org/docs/using.html?highlight=renew#renewing-certificatesを参照してください