diff --git a/nginx/defaults/main.yml b/nginx/defaults/main.yml index 6aaef477..e3ff1842 100644 --- a/nginx/defaults/main.yml +++ b/nginx/defaults/main.yml @@ -3,6 +3,8 @@ nginx_enabled: True nginx_use_ppa: False nginx_ppa_repo: ppa:nginx/stable nginx_package_state: installed +# See https://mozilla.github.io/server-side-tls/ssl-config-generator/ +nginx_ssl_level: intermediate #nginx_virthosts: [] @@ -77,6 +79,8 @@ nginx_basic_auth_users: nginx_letsencrypt_managed: True nginx_websockets_support: False nginx_use_common_virthost: False +# Set it to 'ssl http2' if the nginx version supports it +nginx_ssl_type: ssl # When we do not use letsencrypt: # nginx_ssl_cert_file: '{{ pki_dir }}/certs/nginx.crt' # nginx_ssl_cert_key: '{{ pki_dir }}/keys/nginx.key' diff --git a/nginx/tasks/nginx-config.yml b/nginx/tasks/nginx-config.yml index 60d82f22..10ced7cb 100644 --- a/nginx/tasks/nginx-config.yml +++ b/nginx/tasks/nginx-config.yml @@ -3,6 +3,16 @@ - name: Create the snippets directory file: dest={{ nginx_snippets_dir }} state=directory + - name: Create the pki directory + file: dest={{ {{ pki_dir }}/nginx }} state=directory + + - name: Create a dhparams file 2048 bits long + shell: openssl dhparam -out {{ pki_dir }}/nginx/dhparams.pem 2048 + args: + creates: '{{ pki_dir }}/nginx/dhparams.pem' + when: nginx_ssl_level == 'intermediate' + notify: Reload nginx + - name: remove nginx default virtualhost file: dest=/etc/nginx/sites-enabled/default state=absent notify: Reload nginx diff --git a/nginx/templates/nginx-server-ssl.conf.j2 b/nginx/templates/nginx-server-ssl.conf.j2 index c234c991..f3fb5620 100644 --- a/nginx/templates/nginx-server-ssl.conf.j2 +++ b/nginx/templates/nginx-server-ssl.conf.j2 @@ -5,13 +5,27 @@ ssl_certificate_key {{ letsencrypt_acme_certs_dir }}/privkey; ssl_certificate {{ nginx_ssl_cert_file | default('/etc/nginx/ssl/server.crt') }}; ssl_certificate_key {{ nginx_ssl_cert_key | default ('/etc/nginx/ssl/server.key') }}; {% endif %} -ssl_session_cache shared:SSL:10m; -ssl_session_timeout 10m; +ssl_session_cache shared:SSL:50m; +ssl_session_timeout 120m; +{% if nginx_ssl_level == 'intermediate' %} +ssl_dhparam {{ pki_dir }}/nginx/dhparams.pem; ssl_protocols TLSv1 TLSv1.1 TLSv1.2; -ssl_ciphers "ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-DSS-AES128-GCM-SHA256:kEDH+AESGCM:ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA:ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA:ECDHE-ECDSA-AES256-SHA:DHE-RSA-AES128-SHA256:DHE-RSA-AES128-SHA:DHE-DSS-AES128-SHA256:DHE-RSA-AES256-SHA256:DHE-DSS-AES256-SHA:DHE-RSA-AES256-SHA:ECDHE-RSA-DES-CBC3-SHA:ECDHE-ECDSA-DES-CBC3-SHA:AES128-GCM-SHA256:AES256-GCM-SHA384:AES128-SHA256:AES256-SHA256:AES128-SHA:AES256-SHA:AES:CAMELLIA:DES-CBC3-SHA:!aNULL:!eNULL:!EXPORT:!DES:!RC4:!MD5:!PSK:!aECDH:!EDH-DSS-DES-CBC3-SHA:!EDH-RSA-DES-CBC3-SHA:!KRB5-DES-CBC3-SHA"; +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'; +{% endif %} +{% if nginx_ssl_level == 'modern' %} +ssl_session_tickets off; +# modern configuration. tweak to your needs. +ssl_protocols TLSv1.2; +ssl_ciphers 'ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA384:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA256'; +{% endif %} ssl_prefer_server_ciphers on; {% if ansible_distribution_version | version_compare('14.04', '>=') %} ssl_stapling on; ssl_stapling_verify on; +{% if letsencrypt_acme_install is defined and letsencrypt_acme_install %} +ssl_trusted_certificate {{ letsencrypt_acme_certs_dir }}/fullchain; +{% else %} +ssl_trusted_certificate {{ nginx_ssl_fullchain_file | default('/etc/nginx/ssl/cacert.crt') }}; +{% endif %} add_header Strict-Transport-Security max-age=15768000; {% endif %} diff --git a/nginx/templates/nginx-virthost.j2 b/nginx/templates/nginx-virthost.j2 index 1349db06..0328527a 100644 --- a/nginx/templates/nginx-virthost.j2 +++ b/nginx/templates/nginx-virthost.j2 @@ -99,9 +99,9 @@ server { } -{% if item.ssl_enabled and item.ssl_only %} +{% if item.ssl_enabled %} server { - listen {{ https_port | default(443) }} ssl; + listen {{ https_port | default(443) }} {{ nginx_ssl_type }}; server_name {{ item.server_name }} {% if item.serveraliases is defined %}{{ item.serveraliases }}{% endif %}; {% if item.access_log is defined %} access_log {{ item.access_log }};