2017-03-13 14 views
3

https接続用にExpressJSアプリを設定しようとしています。 Expressサーバーは、localhost:8080およびsecure localhost:8443で実行されます。ここでExpressとNginxでHTTPSを設定する

は、httpsに関連server.jsコードです:私がやったこと

server { 
    listen 80; 
    listen [::]:80; 
    server_name fire.mydomain.me; 

    location/{ 
     proxy_pass http://localhost:8080; 
     proxy_http_version 1.1; 
     proxy_set_header Upgrade $http_upgrade; 
     proxy_set_header Connection 'upgrade'; 
     proxy_set_header Host $host; 
     proxy_cache_bypass $http_upgrade; 
    } 
} 

server { 
    listen 443; 
    listen [::]:443; 
    server_name fire.mydomain.me; 
    location/{ 
     proxy_pass https://localhost:8443; 
     proxy_http_version 1.1; 
     proxy_set_header Upgrade $http_upgrade; 
     proxy_set_header Connection 'upgrade'; 
     proxy_set_header Host $host; 
     proxy_cache_bypass $http_upgrade; 
    } 
} 

  • の生成SSL

    var app = express(); 
    
    var https = require('https'); 
    
    const options = { 
        cert: fs.readFileSync('/etc/letsencrypt/live/fire.mydomain.me/fullchain.pem'), 
        key: fs.readFileSync('/etc/letsencrypt/live/fire.mydomain.me/privkey.pem') 
    }; 
    
    app.listen(8080, console.log("Server running")); 
    https.createServer(options, app).listen(8443, console.log("Secure server running on port 8443")); 
    

    そして、ここでは私のnginxの設定ですドメインfire.mydomain.meのLetsencrypt certonlyツールによる証明書。

  • nginxの設定。
  • server.jsノードアプリケーションの設定。
  • Ufwの443ポートのTCPルールを追加する。

私は、SSLの設定を通過する接続を強制的にserver.jsではない、SSLサーバ行をコメント

  • を試してみました:私は火に行くしようとすると、このページを提供しています。 mydomain.me:443ではなく、 "https:// fire.mydomain.me"には適用されません。いずれの場合も、SSLはありません。 https:// fire.mydomain.meにアクセスしようとすると、Google Chromeで「このウェブサイトは安全な接続を提供していません」というメッセージが表示されます。

  • 私は私のSSLノードの設定を設定するには、最初の場所でこのチュートリアルに従っ: https://medium.com/@yash.kulshrestha/using-lets-encrypt-with-express-e069c7abe625#.93jgjlgsc

答えて

10

あなたは同じホスト上で実行されているあなたのnginxのリバースプロキシとNodeアプリ間でHTTPSを使用する必要はありません。ポート80へのHTTPリクエストとポート443へのHTTPSリクエストの両方を、この場合はノードアプリケーション(8080)の同じポートにプロキシすることができます。その場合はTLS証明書を設定する必要はありません。

あなたがあなたのserver.jsファイルを変更することができます。

var app = express(); 

app.listen(8080, console.log("Server running")); 

とこれはそれがどのようにあるポートで443

をポート80およびHTTPSの両方のHTTP用proxy_pass http://localhost:8080;を持つnginxの設定ファイルを使用します通常行われます。ループバックインターフェイス上のトラフィックを暗号化するとセキュリティは追加されません。トラフィックを盗聴するためには、ボックスへのルートアクセスが必要です。それがあるときは、証明書を読み取り、トラフィックを復号化できます。 https://nodejs.org/en/blog/vulnerability/の投稿のほとんどがOpenSSLに関連しているという事実を考慮すると、NodeでSSLを使用すると、ループバックインターフェイストラフィックを暗号化する特定のケースでセキュリティが低下する可能性があると主張できます。詳細については、GitHubのNodeプロジェクトのthis discussionを参照してください。 @rspソリューションへ

+0

はあなた先生ありがとう、あなたのexplainationは非常に有用であり、これは動作しています! :) ' – Guillaume

5

おかげで、ここで働いnginxの設定です:

server { 
listen 80; 
listen 443 ssl; 

server_name fire.mydomain.me; 

ssl_certificate  /etc/letsencrypt/live/fire.mydomain.me/fullchain.pem; 
ssl_certificate_key /etc/letsencrypt/live/fire.mydomain.me/privkey.pem; 

location/{ 
    proxy_pass http://localhost:8080; 
    proxy_http_version 1.1; 
    proxy_set_header Upgrade $http_upgrade; 
    proxy_set_header Connection 'upgrade'; 
    proxy_set_header Host $host; 
    proxy_cache_bypass $http_upgrade; 
    } 
} 
+1

これは、データがノードアプリケーションに到達する前にすでに復号化されていることを意味しますか? httpトラフィックが既にhttpsにリダイレクトされている場合、つまり、if($ scheme!= "https") '、私はまだhttp_upgradeヘッダのすべてを必要としますか? – svenyonson

関連する問題