質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Node.js

Node.jsとはGoogleのV8 JavaScriptエンジンを使用しているサーバーサイドのイベント駆動型プログラムです。

SSL

SSL(Secure Sockets Layer)とは、暗号化されたプロトコルで、インターネット上での通信セキュリティを提供しています。

Q&A

1回答

573閲覧

複数のサブドメイン使用時のSSLプロキシの構築方法を知りたい

namuyan

総合スコア76

Node.js

Node.jsとはGoogleのV8 JavaScriptエンジンを使用しているサーバーサイドのイベント駆動型プログラムです。

SSL

SSL(Secure Sockets Layer)とは、暗号化されたプロトコルで、インターネット上での通信セキュリティを提供しています。

0グッド

0クリップ

投稿2019/03/10 08:02

編集2019/03/10 12:35

Nodejsを用いてProxyを構築しています。
domain.comtest.domain.comなど、複数のドメインよりアクセスを受け付けたいです。
そこで下記の様にコードを組みました。しかし、サブドメイン毎にSSLを別に読み込まなければならない為うまくいきません。

js

1let https = require('https'), 2 httpProxy = require('http-proxy'), 3 fs = require('fs'); 4 5var ssl = { 6 key: fs.readFileSync('../ssl/privkey.pem', 'utf8'), 7 cert: fs.readFileSync('../ssl/fullchain.pem', 'utf8') 8}; 9 10 11let HomepageProxy = new httpProxy.createProxyServer({ 12 target: {host: 'localhost', port: 3000} 13}); 14 15 16let TestApiProxy = new httpProxy.createProxyServer({ 17 target: {host: 'localhost', port: 3000} 18}); 19 20 21let wsProxy = new httpProxy.createProxyServer({ 22 target: {host: 'localhost', port: 3000} 23}); 24 25let baseUrl = "domain.com"; 26let server = https.createServer(ssl, function ( req, res ) { 27 //console.log(req.headers.host); 28 //console.log(req.headers); 29 try{ 30 let domain = req.headers.host; 31 let host = domain.split(":")[0]; 32 33 if (host===baseUrl) { 34 HomepageProxy.proxyRequest(req, res); 35 } else if (host==="test."+baseUrl){ 36 TestApiProxy.proxyRequest(req, res); 37 } else { 38 res.writeHead(404); 39 res.end(); 40 } 41 } catch (e) { 42 console.log('error', e); 43 res.writeHead(404); 44 res.end(); 45 } 46}); 47 48server.on( 'upgrade', function( req, socket, head ) { 49 try{ 50 req.headers['x-forwarded-for'] = req.connection.remoteAddress || req.connection.socket.remoteAddress; 51 //console.log(req.headers); 52 wsProxy.ws(req, socket, head); 53 } catch (e) { 54 res.writeHead(404); 55 res.end(); 56 } 57}); 58 59server.listen(443);

package.jsonは以下の様になります。

json

1{ 2 "name": "proxy", 3 "version": "1.0.0", 4 "description": "Proxy server.", 5 "main": "index.js", 6 "scripts": { 7 "start": "node index.js &", 8 "stop": "./stop.sh" 9 }, 10 "author": "Robert Lie", 11 "license": "ISC", 12 "dependencies": { 13 "fs": "0.0.1-security", 14 "http-proxy": "^1.16.2" 15 } 16}

どのようにコードを組めばいいのかわかる方、参考になりそうな情報を知っている方は回答の方を宜しくお願いします。

追記

上記のコードではWSも使用しています。

追記2

回答を参考にしコードを組んでみましたが動きません。
ブラウザでアクセスしてみましたが安全な接続ができませんでしたと出るだけでエラー番号も出されず先へ進めない状態です。ここからどうすればいいのか教えて下さい。参考

js

1let httpProxy = require('http-proxy'), 2 fs = require('fs'), 3 tls = require("tls"); 4 5function getCredentialsContext(cer) { 6 return tls.createSecureContext({ 7 key: fs.readFileSync('/etc/letsencrypt/live/' + cer + '/privkey.pem'), 8 cert: fs.readFileSync('/etc/letsencrypt/live/' + cer + '/fullchain.pem') 9 }).context; 10} 11 12let certs = { 13 "domain.tk": getCredentialsContext('domain.tk'), 14 "test.domain.tk": getCredentialsContext('test.domain.tk') 15}; 16let options = { 17 https: { 18 SNICallback: function(hostname) { 19 return certs[hostname]; 20 } 21 }, 22 hostnameOnly: true, 23 router: { 24 'domain.tk': '127.0.0.1:3000', 25 'test.domain.tk': '127.0.0.1:3000' 26 }, 27 target: { 28 https: true // This could also be an Object with key and cert properties 29 } 30}; 31 32let proxy = httpProxy.createServer(options); 33 34proxy.on('upgrade', function (req, socket, head) { 35 req.headers['x-forwarded-for'] = req.connection.remoteAddress || req.connection.socket.remoteAddress; 36 proxy.proxy.proxyWebSocketRequest(req, socket, head); 37}); 38 39proxy.listen(443);

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

「ドメインごとに証明書を出し分けたい」場合、SNIという仕組みを使う必要があります。https.createServerの引数としてSNICallbackを指定することで、指定されたドメインに応じて証明書を出す処理が可能となります(Node.jsドキュメント)。

投稿2019/03/10 08:11

maisumakun

総合スコア145183

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

namuyan

2019/03/10 12:37

回答を基にコードを組みましたが動きません。エラーコードも出ず困っています。もし回答をして頂けましたら嬉しいです。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問