目次
免責事項(前の記事へのコメントによる)
ドメイン名
前回我々はドッキングウィンドウコンテナにその上で終わったが、静的index.htmlファイルを配布し、nginxのWebサーバーを立ち上げました。今回は、データ暗号化とhttpからhttpsへの強制リダイレクトを追加して、Webサーバーの機能を拡張します。
これを行うには、組織の問題を解決する必要があります。実際、暗号化証明書はドメイン名または名前のグループに対してのみ取得できます。このため、トップレベルのドメイン名の目的を忘れずに、いずれかのドメイン名レジストラにアクセスして、ブランドに一致する名前(目的、スローガンなど)を選択します。私の場合、dartservice.ruは完璧です。登録プロセス中に、名前、住所、電子メールなどの所有者情報フォームに記入する必要があります。次に、レジストラのコントロールパネルでDNSレコードの管理に移動し、次の3つのレコードを作成する必要があります。
- 少なくとも2つのNSレコード。これらはレジストラのドメインネームサーバーの名前であり、それらの名前はドメイン名を購入するときにレジストラによって提供されます。
- レコード。これは、ドメイン名とサーバーのIPアドレスの間の関係の直接の記録です。
私の場合、DNSレコードは次のよう
になります。これを行った後は、すぐに結果が得られるとは思わないでください。DNSサーバー間の情報交換は、通常、RUゾーンで1〜12時間かかります。次に...プロジェクト/test/http/client.httpに別のテストを追加します
SSL
もちろん、一般的に、SSLは古い名前です。プロトコルの新しいバージョンはTLS1.0 ... 1.3と呼ばれますが、メカニズムは同じままです。アプリケーション層プロトコル(この場合はHTTP)とトランスポート層プロトコル(TCP / IP)の間の移行中のデータ暗号化です。実際には、次のものが必要です。
- 対応するドメインの所有権を確認して、特別な認証機関から暗号化証明書を取得します。
- NGINX.
- .
- , http https.
Let'sencryptサービス によって自動的に発行された無料の証明書を使用することは現時点では一般的に受け入れられています。このような証明書の制限の1つは、有効期間です。たった90日。その後、証明書を再度取得する必要があります。証明書を自動的に(人間の介入なしに)取得するために、ドメインの所有権を確認するアクションを定期的に実行するACMEプロトコルとアプリケーションが開発されました。certbotアプリを使用して推奨を暗号化しましょう。これはpythonで記述されており、独自のリポジトリとpython3をインストールする必要があります。したがって、DockerHubレジストリからcertbotがインストールされたdockerコンテナを使用します。certbot / certbotの最新の安定バージョンを選択しましょう:v1.5.0..。
次に、ACMEプロトコルを使用して証明書を取得するためのメカニズムを理解しましょう。
- 最初の起動時に、Certbotは秘密鍵と公開鍵を生成し、Let's Encryptionサービスでドメイン管理者アカウントを作成して、公開鍵とドメイン情報を渡します。
- その後、暗号化してメッセージを送信します。このメッセージは、certbotが秘密鍵で署名して返送する必要があります。
- ertbotは、このドメインの所有権を確認するために、dartservice.ru / .well-known / acme-challengeで読み取ることができる特別なファイルをサーバーに配置する必要があります。
- Certbotは証明書要求を作成し、それをLet's暗号化に送信し、その代わりにドメインの証明書を受け取ります。
スクリプトにアプリケーションコンテナを追加しましょうdocker -compose.yaml:
ここに新しいパラメータcomand:ここにコンテナの起動後に実行されるコマンドがあります。この場合、certonly(証明書を取得します)。証明書の取得はオンラインで行われます。つまり、いくつかの質問に一貫して答える必要があります。コマンドの後にフラグを渡すと、人間の介入なしでこれを行うことができます。--webroot(確認方法)-webroot-path = / usr / share / nginx / html / letsencrypt(ドメイン所有権確認ファイルが配置されるパス)-email admin @ email.com(ドメイン管理者メール)-agree-tos(ライセンス契約の条件に同意します)-no-eff-email(certbot開発者に電子メールを報告しません)-d dartservice.ru(ドメインのリスト)。
NGINXコンテナを構成しましょう。
ここでの変更は、httpsポート(443)を開き、SSL証明書とドメイン所有権確認ファイルを使用してフォルダをマウントすることです。
重要なパラメータは、Diffie-Hellmanキーフォルダです。つまり、このキーは、接続を確立するときにサーバーとクライアントの間で暗号化キーを安全に交換するために必要です。詳細はこちら。
そのようなキーを生成しましょうが、次の問題に直面します:キーはopensslプログラムによって作成されます、これはLinuxコンソールユーティリティであり、Windowsマシンに表示される可能性はほとんどありません。最も簡単な解決策は、スクリプトを実行し、Webコンテナコンソールに移動してそこにキーを作成し、コンテナにマウントされているホストフォルダをファイルの出力パスに渡すことです。
スクリプトを実行します。
docker-compose up -d
実行中のコンテナのリストをリクエストします。
docker-compose ps
コンテナコンソールを開きます。
docker exec -it srv_web_1 bash
NGINX構成フォルダー(覚えているように、ホストからマウントされます)でキーの生成を開始します。
openssl dhparam -out /etc/nginx/conf.d/dhparams.pem 2048
キーを./dhparams/dhparam-2048.pemに移動します。
コンテナコンソールCtrl-Dを終了し、スクリプトを停止します。
docker-compose down
次に、NGINX構成を変更しましょう。/conf.d/defaulf.conf:
新しい場所^〜/ .well-known / acme-challengeを追加して、/ usr / share / nginx / html / letsencryptフォルダーから静的ファイルを提供します。これは、certbot確認ファイルが配置される場所です。httpsへの他のすべてのリクエストのリダイレクトを設定しましょう。
すべてが最初のSSL証明書の受信の準備ができています。次のコマンドを使用して、
プロジェクトをVPSの新しいフォルダー/ opt / srv_1 /にコピーしましょう。
scp -r ./* root@91.230.60.120:/opt/srv_1/
VScodeからSSH経由でVPSに接続しましょう。
実行中のサーバーのフォルダーに移動しましょう。
cd /opt/srv_0/
スクリプトを停止します。
docker-compose down
次に、新しいサーバーフォルダcd / opt / srv_1 /に移動し、スクリプトを実行します。
docker-compose up
コンソールでは、certbotが確認ファイルzeS4O87S6AfRQ3Kj4MaBlBFZx3AIiWdPn61DwogDMK4を作成し、これをLet's暗号化サービスに報告し、サービスが4つの異なるIPアドレスからこのファイルを要求してから証明書を発行したことがわかります。完全なチェーンと秘密鍵の形式の証明書は、対応するフォルダーに保存されました。証明書は90日間有効です(2020年5月10日まで)。
サーバーのNGINX構成で安全な接続のための2番目の場所を作成する時が来ました./conf.d/defaulf.conf:
スクリプトを再起動します
docker-compose restart
ブラウザが証明書にどのように反応するかを見てみましょう
。GoogleChromeは証明書に満足しています。ここで、タスクはより困難になります。SSL接続のさまざまなブラウザーのセキュリティと可用性をテストしますhttps://www.ssllabs.com/ssltest/。アドレスを入力すると、結果が得られます。
証明書とキーの交換はすべて問題ありませんが(Diffie-Hellmanのおかげで)、テストロボットは古いTLS1.0およびTLS1.1プロトコルをサポートするために評価を下げました(私たちの意見では「B」は「4」です)。 ..。 NGINX構成でそれらを無効にすることは難しくありませんが、テストレポートをさらに見ると、たとえば、この場合の一部のモバイルデバイスのブラウザーは接続できないことがわかり
ます。実行するサービスタスクがいくつか残っています。
ドメインの証明書を取得する試行回数は、7日以内に5回を超えてはなりません。その後、Let'sencryptサービスが私たちをブロックする可能性があります。しかし、開発中にスクリプトを実行するたびにcertbotがしますしてみてくださいそうで、これを行うには、ドッキングウィンドウ-compose.dev.yamlスクリプト変更コマンドのパラメータcertbotのコンテナを:--dryラン
フラグは、証明書を取得せずに実行するテストです。 テストを書いてみましょう: ソースコードgithub。
結論
そのため、このステップでは、サーバーとクライアントアプリケーション間の通信を保護し、ドメインを「信頼」するようにブラウザーに教えました。
次の記事では、サービスの開始までのカウントダウンを含むフラッターWebページを作成し、収集してサーバーに配置します。