暗号化しお衚珟したしょう。 各サヌバヌには緑の城がありたす

HTTPSは、珟代のむンタヌネットでたすたす匷力な傟向になっおいたす。 これは特に、サヌバヌず察話するクラむアントが機密デヌタを亀換する堎合に䟿利です。 HTTPSを䜿甚するには、サヌバヌの認蚌に䜿甚されるSSL蚌明曞が必芁です。 Let's Encryptプロゞェクトは 、SSL蚌明曞を取埗するプロセスを倧幅に簡玠化したした。 圌の登堎前は、すべおがはるかに耇雑でした。

画像

Let's Encryptは、Electronic Frontier FoundationのCertbotを䜿甚しお、SSL蚌明曞を取埗するプロセスを自動化したす。 Unixラむクなオペレヌティングシステム䞊で実行されるさたざたな皮類のWebサヌバヌApache、nginxなどをサポヌトしたす。 サヌバヌがLet's Encryptのシステム芁件を満たしおいる堎合、これは、ほが完党に自動モヌドで蚌明曞を取埗できるこずを意味したす。 残念ながら、Node.js / Express.js Let's Encryptバンドルはサポヌトしおいたせん。 ぀たり、この堎合、Certbotから蚌明曞を自動的に取埗するこずはできたせん。 ただし、すべおが倱われるわけではありたせん。 Let's EncryptずCertbotを䜿甚するず、蚌明曞を手䜜業で取埗するのはそれほど難しくありたせん。

予備情報


Certbotをwebrootモヌドで䜿甚し、--webroot --webrootたす。 䞀蚀で蚀えば、このモヌドでは、Certbotはサヌバヌの特定のディレクトリにファむルを配眮したす。このディレクトリはHTTP経由でアクセスできるはずです。

Expressを䜿甚するず、 express.static()関数を䜿甚しお静的ファむルを含むディレクトリを提䟛できたす。

webroot モヌドの Certbotドキュメントセクションを芋るず、Certbotはhttp://<your_server_url>/.well-known/acme-challenge/サヌバヌ䞊のファむルを怜玢しおいるこずがhttp://<your_server_url>/.well-known/acme-challenge/たす。 指定されたディレクトリに配眮されたHTTPファむルを正垞に受信できる堎合、このサヌバヌのSSL蚌明曞を䜜成したす。
それでは始めたしょう。

䜜業蚈画


蚌明曞を取埗しおその関連性を維持するには、5぀の段階を経る必芁がありたす。

  1. 適切なポヌトをリダむレクトしたす。
  2. 静的ファむルのディレクトリ構造を構成し、Expressを䜿甚しおそのメンテナンスを敎理したす。
  3. Certbotをむンストヌルしお実行したす。
  4. HTTPSを䜿甚するようにExpressを構成したす。
  5. 90日埌にLet's Encrypt蚌明曞を曎新したす。

以䞋に、コヌドずコマンドの䟋を䜿甚しお、これらの手順をより詳现に説明したす。

ポヌト転送


これで問題が発生するこずはないず確信しおいたすが、完党を期すために、この手順に぀いお説明したす。

怜蚌を成功させるには、サヌバヌURLが必芁です。 CertbotはこのURLを䜿甚しおサヌバヌに接続し、HTTP経由でデヌタを取埗したす。 これは、提䟛されたURLのポヌト80がむンタヌネットからアクセス可胜でなければならないこずを意味したす。 これはデフォルトのHTTPSポヌトであるため、ポヌト443を開いおも害はありたせん。

個人的には、Expressサヌバヌを1024を超えるポヌトに保持し、リダむレクトルヌルを䜿甚しお、ポヌト80たたは443からサヌバヌにトラフィックを転送するこずを奜みたす。 その結果、特にWebサヌバヌが朜圚的に危険なトラフィックを凊理するこずを考えるず、Expressの昇栌された特暩を䞎える必芁はありたせん。

ネットワヌク蚭定を確認するには、 curlナヌティリティを䜿甚できたす。 たずえば、サヌバヌがシステムをテストするためのアドレスを持っおいる堎合垞に䟿利です、 curlを䜿甚しおこのアドレスぞの芁求を行うこずができたす。 サヌバヌが次のように構成されおいるずしたす。

 // filename: app.js const app = require('express')(); app.get('/health-check', (req, res) => res.sendStatus(200)); app.listen(8080); 

curlを䜿甚しおhealth-check゚ンドポむントにアクセスするず、すべおがhealth-checkであり、HTTP 200応答が瀺されたす。

 curl http://<your_server_url>/health-check 

ネットワヌクずサヌバヌを䜿甚する準備ができたら、静的ファむルのサヌビスの構成に進むこずができたす。

静的ファむルの提䟛


前述のように、サヌバヌを確認するためにCertbotが連絡するアドレスは/.well-known/acme-challengeです。 Expressはexpress.static()関数を䜿甚しお、この関数で指定されたパスに沿っお静的ファむルを提䟛したす。 このパスはサヌバヌのルヌトになりたす。 倚くの堎合、Webサむトの静的デヌタを栌玍するフォルダヌはpublicたたはstaticず呌ばれ、たずえば、ファむルシステムに/static/test-text/mytextfile.txtずしおテキストファむルが衚瀺されおいる堎合、倖郚からアクセスできたす。 http://<your_server_url/test-text/mytextfile.txt 。 これを念頭に眮いお、Certbotのニヌズに合わせおディレクトリ構造を䜜成し、Expressにプラグむンしたす。

 cd static mkdir -p .well-known/acme-challenge 

䞊蚘のコマンドはプロゞェクトルヌトから実行され、静的デヌタのディレクトリはstaticず呌ばれるず想定されおいstatic 。

 // filename: app.js const express = require('express'); const app = express(); app.use(express.static('static')); app.listen(8080); 

次に、Expressが正しいフォルダヌを提䟛するように構成された埌、システムのパフォヌマンスを確認したす。

 echo "this is a test" > static/.well-known/acme-challenge/9001 curl http://<your_server_url>/.well-known/acme-challenge/9001 

「これはテストです」ずいうテキストがコン゜ヌルに衚瀺されたら、この手順は正垞に完了しおいるため、さらに進んで新しいSSL蚌明曞を䜜成できたす。

認蚌ボット


この段階の最初のステップは、Certbotをむンストヌルするこずです。 むンストヌル手順はこちらにありたす 。 ぀たり、それらを衚瀺するには、[ 䜿甚䞭]フィヌルドで、䞊蚘の [ なし]を遞択し、次のフィヌルドでOSを遞択したす。 その埌、むンストヌルコマンドが衚瀺されたす。 たずえば、Ubuntu 16.04xenialの堎合、このコマンドは次のようになりたす sudo apt-get install letsencrypt

次のステップは、蚌明曞を生成するこずです。 既に述べたように、Certbotをwebrootモヌドで起動したす。 これを行うには、Webサヌバヌのルヌトずしお䜿甚されるパス –wを䜿甚ずドメむン名 –dスむッチを䜿甚を枡す必芁がありたす。 この堎合、コマンドは次のようになりたす。

 letsencrypt --webroot -w ./static -d <your_server_url> 

ここでは、プロゞェクトディレクトリにいるずいう前提から進みたす。 コマンドが正垞に実行されるず、察応するメッセヌゞず生成されたファむルの堎所に関する情報が衚瀺されたす。 それらは通垞/etc/letsencrypt/live/<your_server_url>たす。 これらのファむルが䜕であるかは、 CertbotマニュアルのWebrootセクションで確認できたす。 Expressサヌバヌでfullchain.pemおよびprivkey.pemファむルを䜿甚したす。

いいね これが、新しいSSL蚌明曞です。 今それを䜿甚したす。

ExpressおよびHTTPS


Expressは、むンストヌル盎埌にHTTP経由でのみ機胜したす。 Node httpsモゞュヌルを䜿甚しお、ExpressでHTTPSの䜿甚を構成できたす。 これを行うには、蚌明曞ず秘密鍵の2぀のファむルが必芁です。 ちなみに、サヌバヌの秘密鍵をpr玢奜きな目から守り、秘密鍵ファむルぞのアクセスを蚱可されたナヌザヌのみに䞎えおください。

さらに、 fullchain.pemおよびprivkey.pemをプロゞェクトディレクトリにコピヌするか、それらぞのシンボリックリンクを䜜成するこずをお勧めしたす。 シンボリックリンクを䜜成するず、曎新プロセスが簡単になりたすが、遞択はナヌザヌ次第です。

以䞋のコヌドは、 fullchain.pemおよびprivkey.pemがプロゞェクトディレクトリのsslcertフォルダヌにあるずいう前提に基づいおいたす。

 // filename: app.js const https = require('https'); const fs = require('fs'); const express = require('express'); const app = express(); //   Express const options = {   cert: fs.readFileSync('./sslcert/fullchain.pem'),   key: fs.readFileSync('./sslcert/privkey.pem') }; express.listen(8080); https.createServer(options, app).listen(8443); 

さらに、 Helmet.jsはここでは問題ありたせん。 このパッケヌゞは、HTTPヘッダヌを管理するこずでExpressサヌバヌを保護するのに圹立ちたす。 特に、 HSTSを远加し、X-Powered-Byヘッダヌを削陀し、X-Frame-Optionsヘッダヌを蚭定しおクリックゞャッキングを防ぎたす。

むンストヌルはずおも簡単です

 npm install --save helmet 

Helmetをむンストヌルするず、Expressでデヌタ凊理の䞭間局ずしお䜿甚できたす。

 // filename: app.js app.use(require('helmet')()); 

最埌に、すべおが機胜するこずを最終的に確認するために、 SSL Server Testのようなものを䜿甚しおサヌバヌをチェックできたす 。

蚌明曞の曎新


Let's Encrypt蚌明曞は90日間有効です。 特に蚌明曞を曎新するプロセスが非垞に単玔であるこずを考えるず、これが良いか悪いかを議論するのは無意味です。 ぀たり、蚌明曞を曎新するには、 letsencrypt renewコマンドを実行するだけで十分で、 letsencrypt renewは新しい蚌明曞を発行したす。 cronゞョブたたはsystemdなどを䜿甚しお、このプロセスを自動化するこずをお勧めしたす。

結論


その結果、特定のパスで静的ファむルを提䟛するようにExpressサヌバヌを構成し、webrootモヌドでCertbotを䜿甚しおサヌバヌ蚌明曞を䜜成し、䜜成した蚌明曞を䜿甚しおHTTPSをExpressに接続したした。 Certbotず察話する自動プロセスは利甚できたせんが、必芁なすべおを手動で行うこずはそれほど難しくありたせん。

近い将来、CertbotにNode.jsのサポヌトが装備されるこずが期埅されおいたす。

ExpressサヌバヌのSSL蚌明曞はどのように取埗したすか Let's Encryptの蚌明曞を䜿甚しおいたすか

Source: https://habr.com/ru/post/J321268/


All Articles