{{tag>nginx server triks ssl certificate}}

====== Настройка ssl (https) в nginx ======

===== Автоматическая настройка =====

  * [[server:ssl]]

===== Ручная настройка =====


Чтобы защитить передаваемый трафик между сервером и клиентом можно использоваться механизм SSL шифрования.
Так как nginx часто выступает в роли фронтенда перед апачем, то лучше возложить шифрование на него.
Использование массового самоподписанного сертификата
Настроим использование одного самоподписанного сертификата для нескольких сайтов.

Создадим общий файл конфигурации SSL:

/etc/nginx/ssl.conf
<code nginx>
  # Подключение самоподписанного сертификата
  # генерация сертификата:
  # openssl req -new -x509 -days 9999 -nodes -out cert.pem -keyout cert.key
  
  ssl    	on;
  ssl_protocols		SSLv3 TLSv1;
  ssl_certificate		/etc/nginx/ssl/cert.pem;
  ssl_certificate_key	/etc/nginx/ssl/cert.key;
</code>

Создадим папку где будем хранить сертификаты:

<code bash>$ mkdir /etc/nginx/ssl</code>
  
Для большей безопасности ограничиваем доступ к сертификатам:

  chown nginx:nginx /etc/nginx/ssl
  chmod 700 /etc/nginx/ssl
  
Перейдем в эту папку и сгенерируем сертификат:

  cd /etc/nginx/ssl
  openssl req -new -x509 -days 9999 -nodes -out cert.pem -keyout cert.key
  
При генерации вас попросят указать некоторые данные, так как мы создаём сертификат для себя то заполнять их не обязательно.

Теперь для включения шифрования нужных сайтов будум использовать следующий шаблон:

в конфигурации сайтов nginx:
<code nginx>
  server {
          listen          *:443;       # порт https
          server_name     my.site.com; # ваш сайт
  
          include	/etc/nginx/ssl.conf; # подключение конфигурации ssl
  
          ...
  }
</code>

Пример с принудительным перенаправлением с http на https:
в конфигурации сайтов nginx:

<code nginx>
  server {
          listen          *:443;       # порт https
          listen		*:80;        # порт http
          server_name     my.site.com; # ваш сайт
  
          include	/etc/nginx/ssl.conf; # подключение конфигурации ssl
  
          if ( $scheme = "http" ) {
  	      rewrite ^/(.*)$	https://$host/$1 permanent;
          }
  
          ...
  }
</code>

После настройки необходимо перезагрузить nginx:

  /etc/init.d/nginx reload
  
Всё готово, для доступа к сайту следует использовать https протокол - https://my.site.com
Так как сертификат самоподписанный браузер попросит подтвердить исключение на его использование.

====== Дополнительные опции создания SSL-сертификата ======

Создание сертификата командой:

<code bash>$ openssl req -new -x509 -days 9999 -nodes -out cert.pem -keyout cert.key</code>
запрашивает некоторую информацию для создания сертификата, заполнение которой можно пропустить.

Но если интересно вот описание параметров:

^ Значение      ^ Описание                                                                                            |  Обязательный параметр  |
| С             | Двухсимвольный код страны (Country)                                                                 | нет                     |
| ST            | Название региона/области/края/республики/… (State Name)                                             | нет                     |
| L             | Название города/поселка/… (Locality Name)                                                           | нет                     |
| O             | Название организации (Organization Name)                                                            | нет                     |
| OU            | Название отдела (Organization Unit)                                                                 | нет                     |
| CN            | Имя сертификата, при создании серверных сертификатов используется доменное имя сайта (Common Name)  | да                      |
| emailAddress  | Почтовый адрес (E-mail address)                                                                     | нет                     |
Чтобы не вводить эти параметры интерактивное можно использовать опцию -subj:

<code bash>$ openssl req -new -x509 -days 9999 -nodes -subj /C=RU/O=My\ site/CN=my.site.com/emailAddress=admin@site.com -out cert.pem -keyout cert.key</code>

====== Перенаправление с http на https ======

Для принудительного перенаправления с http на https необходимо сзоздать секцию server и добавить в нее **ssi on** и **return 301**

<code nginx>
server {
                                listen [IP]:80;
                                server_name site.com;
                                index index.php;
                                access_log /home/site.com/logs/access.log;
                                error_log  /home/site.com/logs/error.log error;
                                charset utf-8;
                                #charset        windows-1251;

                                ssi on;
                                return 301 https://$host:443$request_uri;
}  
</code>

===== Ссылки =====

{{topic>[ssl certificate]}}