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自体を再起動したら反映された。