環境
Server:CentOS Linux release 7.2.1511
nginx:v1.11.5
事前準備
自己署名証明書(オレオレ証明書)をopensslで作成する
?普通の証明書との違いは?
サーバー管理者と認証局(CA)が同一になること
秘密鍵の作成
# openssl genrsa 2048 > server.key
証明書署名要求の作成
# openssl req -new -key server.key > server.csr
自分で署名して10年間有効な証明書作る
# openssl x509 -days 3650 -req -signkey server.key < server.csr > server.crt
# mkdir /etc/nginx/ssl
# mv server* /etc/nginx/ssl
nginxの設定
server {
listen 443 ssl;
server_name localhost;
ssl_certificate_key /etc/nginx/ssl/server.key;
ssl_certificate /etc/nginx/ssl/server.crt;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_ciphers 'ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES256-SHA384:ECDHE-RSA-AES128-SHA:ECDHE-ECDSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA:ECDHE-RSA-AES256-SHA:DHE-RSA-AES128-SHA256:DHE-RSA-AES128-SHA:DHE-RSA-AES256-SHA256:DHE-RSA-AES256-SHA:ECDHE-ECDSA-DES-CBC3-SHA:ECDHE-RSA-DES-CBC3-SHA:EDH-RSA-DES-CBC3-SHA:AES128-GCM-SHA256:AES256-GCM-SHA384:AES128-SHA256:AES256-SHA256:AES128-SHA:AES256-SHA:DES-CBC3-SHA:!DSS';
ssl_prefer_server_ciphers on;
ssl_dhparam /etc/nginx/ssl/dhparam.pem;
access_log /var/log/nginx/ssl_access.log main;
error_log /var/log/nginx/ssl_error.log;
root /var/www/html;
error_page 404 /404.html;
error_page 500 502 503 504 /50x.html;
location = /favicon.ico {
access_log off;
empty_gif;
expires 30d;
}
}
# curl -I -k https://localhost
HTTP/1.1 200 OK
SSL設定を生成してくれるサイトがある。。
https://mozilla.github.io/server-side-tls/ssl-config-generator/
Server Version:1.11.5
OpenSSL Version:1.0.1e
推奨設定の確認
OpenSSLのバージョンを確認
[root@centos7 ~]# nginx -V
nginx version: nginx/1.11.5
built by gcc 4.8.5 20150623 (Red Hat 4.8.5-4) (GCC)
built with OpenSSL 1.0.1e-fips 11 Feb 2013
OpenSSL1.0.1以上が推奨
SSLv3を無効化(ssl_protocols)
https://nginx.org/en/docs/http/ngx_http_ssl_module.html#ssl_protocols
SSL(Secure Sockets Layer)/TLS(Transport Layer Security)はデータを暗号化して送受信できるトランスポート層のプロトコル。
SSLv3はTLSv1.0が策定される前に使用されていた古いプロトコル。
1.9.1以降のnginxではデフォルトでSSLv3は無効 TLSv1以降のみが使用できるように設定されている。
用するHTTPSプロトコルを明示的に指定する場合はssl_protocolsディレクティブを使用
デフォルト値はTLSv1 TLSv1.1 TLSv1.2
使用する暗号化スイートを明示的に指定(ssl_ciphers)
暗号化スイート(Cipher Suites) 通信の各部分にどの暗号技術を使うかという組み合わせ
デフォルトで指定されている暗号化スイートには、過去の互換性のために決して安全とは言い難いものも含まれている。
高い安全性を実現するためには、暗号化スイートを明示的に指定する必要がある。
使用可能にする暗号化スイートは、ssl_ciphersディレクティブで指定する。
openssl ciphers -v で対応一覧を確認できる。
例)
# openssl ciphers -v
ECDHE-RSA-AES256-GCM-SHA384 TLSv1.2 Kx=ECDH Au=RSA Enc=AESGCM(256) Mac=AEAD
設定 | 値 |
---|---|
暗号スイートの名前 | ECDHE-RSA-AES256-GCM-SHA384 |
プロトコル | TLSv1.2 |
鍵交換に使われる暗号化アルゴリズム | Au=RSA |
認証に使われる暗号化アルゴリズム | Enc=AESGCM(256) |
メッセージの認証に使われるハッシュアルゴリズム | Mac=AEAD |
mozilla wikiで最新版の推奨設定を確認する。
https://wiki.mozilla.org/Security/Server_Side_TLS#Recommended_configurations
Intermediate compatibility を確認。
サーバー側の暗号化スイート設定を優先(ssl_prefer_server_ciphers)
TLSでは使用する暗号化スイートをクライアント、サーバー間で交渉し決定する。
デフォルトではクライアントが決定する暗号化スイートを優先するようになっている。
クライアントによってはセキュリティ強度が弱い暗号化スイートが選択されてしまうことがあるので、
ssl_prefer_server_ciphersディレクティブを有効にすることでサーバーの暗号化スイートを優先できる。
オマケ SSLサーバーのテスト