Posted at

nginx ssl設定(オレオレ証明書)

More than 1 year has passed since last update.


環境


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


推奨設定の確認


https://wiki.mozilla.org/Security/Server_Side_TLS#Recommended_configurations


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サーバーのテスト 


https://www.ssllabs.com/ssltest/


参考


オレオレ証明書をopensslで作る