SSL 3.0の無効化
脆弱性対策のため、サーバー環境における全てのSSL 3.0を無効化しておくほうが良さ気。
背景
Androidブラウザでhttpsのサイトが見れない(通信が安全でないと言われる)
webブラウザでは問題がなかったので見落としていたが、たまたまモバイルでページを見てみるとこの状態・・・
webサーバーの環境
- Azure VM(Ubuntu)
- Nginx(リバースプロキシ用)
- Nodejs + Express.js (webサーバ)
- RapidSSL(https用)
調査
そもそも、SSLの設定したらココでチェックするのが定石らしい。
https://www.ssllabs.com/ssltest/index.html
そして案の定怒られる。怒られたのはSSL3.0の使用のせい。
Nginxでの対応
server { listen 443 ssl; ssl_protocols TLSv1 TLSv1.1 TLSv1.2; }
みたいにTLSv1 TLSv1.1 TLSv1.2を指定。後はサービス再起動。
Node.jsでの対応
https://gist.github.com/3rd-Eden/715522f6950044da45d8
var constants = require('constants') , https = require('https') , path = require('path') , fs = require('fs'); https.createServer({ secureProtocol: 'SSLv23_method', secureOptions: constants.SSL_OP_NO_SSLv3, cert: fs.readFileSync(path.join(__dirname, 'ssl', 'server.crt')), key: fs.readFileSync(path.join(__dirname, 'ssl', 'server.key')), }, function (req, res) { res.end('works'); }).listen(443);
Node.jsの公式ドキュメントにはsecureOptionsが載ってないけど、こんな感じで指定しておく。
ついでに中間証明書やciphersをきちんと設定しておく
https.createServerのオプションでcaを指定、ciphersも。
ca: [fs.readFileSync('./rapidssl-chain.crt', 'utf8'),fs.readFileSync('./geotrust-chain.crt', 'utf8')], ciphers:'TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384:TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256:......',,,
まとめ
これらの設定しても反映されてない雰囲気があって、Azure VM自体を再起動したら反映された。