
  {%- from "nginx/files/headers/_strict_transport_security.conf" import strict_transport_security %}

  {%- if site.get('ssl', {'enabled': False}).get('enabled', False) %}

  {%- set ca_file=site.ssl.get('ca_file', '') %}
  {%- set key_file=site.ssl.get('key_file', '/etc/ssl/private/{0}.key'.format(site.host.name)) %}
  {%- set cert_file=site.ssl.get('cert_file', '/etc/ssl/certs/{0}.crt'.format(site.host.name)) %}
  {%- set chain_file=site.ssl.get('chain_file', '/etc/ssl/certs/{0}-with-chain.crt'.format(site.host.name)) %}

  ssi on;
  ssl on;
  ssl_session_cache {{ site.ssl.get('session_cache', 'shared:SSL:10m') }};
  ssl_session_timeout {{ site.ssl.get('session_timeout', '10m') }};
    {%- if site.ssl.engine is not defined %}

  ssl_certificate_key {{ key_file }};
      {%- if site.ssl.chain is defined or site.ssl.authority is defined %}
  ssl_certificate {{ chain_file }};
      {%- else %}
  ssl_certificate {{ cert_file }};
      {%- endif %}

    {%- elif site.ssl.engine == 'letsencrypt' %}

    {%- set cert = site.ssl.get("certificate", site.host.name) %}
  ssl_certificate         /etc/letsencrypt/live/{{ cert }}/fullchain.pem;
  ssl_certificate_key     /etc/letsencrypt/live/{{ cert }}/privkey.pem;
  ssl_trusted_certificate /etc/letsencrypt/live/{{ cert }}/fullchain.pem;
    {%- include "nginx/files/_letsencrypt.conf" %}

    {%- elif site.ssl.engine == 'salt' %}

  ssl_certificate_key {{ key_file }};
  ssl_certificate {{ chain_file }};

    {%- endif %}

    {%- if site.ssl.get('mode', 'secure') not in ["secure", "normal"] %}
      {%- if site.ssl.protocols is defined  %}
        {%- set _protocols = [] %}
          {%- for protocol_name, protocols in site.ssl.get('protocols', {}).iteritems() %}
            {%- if protocols.get('enabled', False) %}
              {%- do _protocols.append(protocols.name) %}
            {%- endif %}
          {%- endfor %}
  ssl_protocols {{ ' '.join(_protocols) }};
      {%- endif %}
      {%- if site.ssl.ciphers is defined %}
        {%- set _ciphers = [] %}
          {%- for cipher_name, ciphers in site.ssl.get('ciphers', {}).iteritems() %}
            {%- if ciphers.get('enabled', False) %}
              {%- do _ciphers.append(ciphers.name) %}
            {%- endif %}
          {%- endfor %}
  ssl_ciphers {{ ':'.join(_ciphers) }};
      {%- endif %}
      {%- if site.ssl.prefer_server_ciphers is defined %}
  ssl_prefer_server_ciphers {{ site.ssl.prefer_server_ciphers }};
      {%- endif %}
      {%- if site.ssl.buffer_size is defined %}
  ssl_buffer_size {{ site.ssl.buffer_size }};
      {%- endif %}
      {%- if site.ssl.get('crl', {'enabled': False}).enabled and site.ssl.crl.file is defined %}
  ssl_crl {{ site.ssl.crl.file }};
      {%- endif %}
      {%- if site.ssl.get('dhparam', {'enabled': False}).enabled %}
  ssl_dhparam /etc/ssl/dhparams_{{ site_name }}.pem;
      {%- endif %}
      {%- if site.ssl.ecdh_curve is defined %}
        {%- set _ecdh_curve = [] %}
          {%- for ecdh_curve_name, ecdh_curve in site.ssl.get('ecdh_curve', {}).iteritems() %}
            {%- if ecdh_curve.get('enabled', False) %}
              {%- do _ecdh_curve.append(ecdh_curve.name) %}
            {%- endif %}
          {%- endfor %}
  ssl_ecdh_curve {{ ':'.join(_ecdh_curve) }};
      {%- endif %}
      {%- if site.ssl.password_file is defined and site.ssl.get('password_file', {'enabled': False}).enabled %}
        {%- if site.ssl.password_file.content is defined and site.ssl.password_file.file is not defined %}
  ssl_password_file /etc/ssl/password_{{ site_name }}.key;
        {%- endif %}
        {%- if site.ssl.password_file.file is defined %}
  ssl_password_file {{ site.ssl.password_file.file }};
        {%- endif %}
      {%- endif %}
      {%- if site.ssl.get('ticket_key', {'enabled': False}).enabled %}
  ssl_session_ticket_key /etc/ssl/ticket_{{ site_name }}.key;
      {%- endif %}
      {%- if site.ssl.session_tickets is defined %}
  ssl_session_tickets {{ site.ssl.session_tickets }};
      {%- endif %}
      {%- if site.ssl.stapling is defined %}
  ssl_stapling {{ site.ssl.stapling }};
      {%- endif %}
      {%- if site.ssl.resolver is defined %}
        {%- if site.ssl.resolver.valid_seconds is defined %}
  resolver {{ site.ssl.resolver.address }} valid={{ site.ssl.resolver.valid_seconds }}s;
        {%- else %}
  resolver {{ site.ssl.resolver }};
        {%- endif %}
        {%- if site.ssl.resolver.timeout_seconds is defined %}
  resolver_timeout {{ site.ssl.resolver.timeout_seconds }}s;
        {%- endif %}
      {%- endif %}
      {%- if site.ssl.stapling_file is defined %}
  ssl_stapling_file {{ site.ssl.stapling_file }};
      {%- endif %}
      {%- if site.ssl.stapling_responder is defined %}
  ssl_stapling_responder {{ site.ssl.stapling_responder }};
      {%- endif %}
      {%- if site.ssl.stapling_verify is defined %}
  ssl_stapling_verify {{ site.ssl.stapling_verify }};
      {%- endif %}
      {%- if site.ssl.verify_client is defined %}
  ssl_verify_client {{ site.ssl.verify_client }};
      {%- endif %}
      {%- if site.ssl.get('client_certificate', {'enabled': False}).enabled and site.ssl.client_certificate.file is defined %}
  ssl_client_certificate {{ site.ssl.client_certificate.file }};
      {%- endif %}
      {%- if site.ssl.verify_depth is defined %}
  ssl_verify_depth {{ site.ssl.verify_depth }};
      {%- endif %}
  {{ strict_transport_security(site) | indent(2) }}
    {%- else %}
      {#- Using this file is deprecated, it may be silensly removed in future. All options are now set from _ssl.conf #}
      {#- Please check README about new option types #}
      {%- set ssl_mode = site.ssl.get('mode', 'secure') %}
      {%- include "nginx/files/_ssl_"+ssl_mode+".conf" %}

    {%- endif %}
  {%- endif %}
