[node.js]HTTPS通信に対応させてみる(SSL-リバースプロキシ環境を構築する)

タイトルの通り。httpsのこともこれから勉強していかなければならないのかなーと思い。

きっかけはこの記事です。

『証明書を無料で発行、HTTPSの導入を支援する「Let’s Encrypt」』は何に使え、何に使えないのか – いろいろやってみるにっき

HTTPS普及を推進するプロジェクト「Let’s Encrypt」、Linux Foundation傘下に

これを見ながら10年後くらいはWeb全てがhttpsになってんじゃねーかなと思えてきて。

無料なら個人でも気兼ねなく使えますもんね。商用には辞めたほうがいい感じですけれど・・・

 

当然、証明書は所謂オレオレ証明書です。

・・・オレオレ証明書って言い方はどうなんだろうとちょっと思います。別に偽サイトじゃないのにニュアンスからそう思わせてしまうじゃないかと。

ソースコード。

var https = require('https');
var fs = require('fs');

var ssloptions={key: fs.readFileSync('server.key', 'utf8'),
    cert: fs.readFileSync('server.crt', 'utf8')};

var serverhttps = https.createServer(ssloptions,function ( req, res ) {
        res.writeHead(200, {'Content-Type': 'text/plain'});
    res.end('SSL Connection');
});

serverhttps.listen(443);

URL:https://potproject.net/

※オレオレ証明書なので当然https通信に関する警告が各ブラウザで出ます。

node.jsには標準モジュールとして既にhttpsが存在します。これでencrypt関連のことは全く知らなくても使えます。

なので、最小限のコードであれば通常のhttp通信と違うところは証明書の登録をしなくてはならないという点だけです。

証明書(秘密鍵・公開鍵)に関してはopensslで生成。ここに公的機関が発行した証明書を入れ替えればすぐに使えます。

これで通信は暗号化されたわけですが、最近はSSL絡みの脆弱性がいっぱい出てきてますし、規格に関してはまだまだ変わっていくのでしょうかねー・・・

このブログもhttpsに対応させよう

せっかくなのでブログも対応させよう。

httpsに対応することで、ログイン時に盗聴されて乗っ取られることはなくなると思います。そもそもまずそんなことは起きない・・・というツッコミはさておき。
鯖自体、リバースプロキシサーバでサブドメインごとに振り分けているため、設定は結構複雑になってきます。

こんな感じで鯖の構造も変更しました。
http-node-proxy(リバースプロキシサーバ | port 80/443[外部ポート番号])
—potproject.net(Node.js | port 8080(http/https)
—blog.potproject.net(Apache | port 8081(http)/8443(https))
別途、ApacheにSSLの設定をしなくてはならないです。

と思ったんですが、リバースプロキシからの通信は暗号化する必要ないので(同じ鯖で内部ルーティングしているため)、
ネットワークからリバースプロキシまでをSSLで暗号化、
リバースプロキシからapacheの受付内部ポートまでは暗号化せずhttpで渡すようにしました。
なので、バーチャルホスト設定で8443ポートを内部ルーティングできるようにして、ApacheのSSL設定は停止しました。
Apache ssl.conf設定。ssl.confだけどSSL切ってます

Listen 8443 https

<VirtualHost _default_:8443>

# General setup for the virtual host, inherited from global configuration
DocumentRoot "/var/www/wordpress"
ServerName blog.potproject.net
SetEnv HTTPS on

#   SSL Engine Switch:
#   Enable/Disable SSL for this virtual host.
SSLEngine off

---中略---

</VirtualHost>

node.jsプロキシサーバの設定。

var https = require('https');
var fs = require('fs');

var httpsoptions={target:'http://127.0.0.1:8443',secure:false};

var ssloptions={key: fs.readFileSync('server.key', 'utf8'),
    cert: fs.readFileSync('server.crt', 'utf8')};

var serverhttps = https.createServer(ssloptions,function ( req, res ) {
        if (req.headers.host == 'potproject.net') {
    res.writeHead(200, {'Content-Type': 'text/plain'});
    res.end('SSL Connection');
    }else if (req.headers.host == 'blog.potproject.net') {
        Proxy.web( req, res ,httpsoptions);

    }

});
serverhttps.listen(443);

こんな形に変更しました。

options[secure]はhttps -> httpsでプロキシをする時にtrueにします。今回はhttps -> httpなのでfalseです。

そしてhttpsでつながった・・・のはいいのですが、デザインが崩れて明らかにCSSやJSが読み込めていない。
調べたところ、こういう問題があるようです。
WordPress をSSL運用すると管理画面でアップロードした画像が見れない
こんな問題があるらしい。ってことはまだ治っていないのだろうか?それともテーマの問題か?
ということでSetEnv HTTPS onをssl.confに追加し、コードを組むことででちゃんと表示されるようになりました。
その後、WordPress HTTPS(SSL)プラグインを導入し、管理者ログインと画面をhttps通信化。
ちゃんと管理者画面だけhttpsにリダイレクトしてくれますのでいいですね。

https://blog.potproject.net/
※オレオレ証明書なので当然https通信に関する警告が(以下略
これでこのブログもhttpsの仲間入りですね。オレオレ証明書だしまあ多分ほとんど意味ない気がしますが・・・
Let’s Encryptの無料証明書がきたらぜひ使ってみようと思います。まあその時までこのままで。
無料のSSLならStartSSLなんか使えるという声もありますが登録めんどそうなので・・・

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)