У меня проблема, из-за которой я создаю обратный прокси-сервер nginx для перенаправления на несколько микросервисов по разным URL-адресам.

Система полностью основана на докере, поэтому для разработки и производства используется одна и та же среда. Это вызвало у меня проблему при установке SSL, поскольку сертификаты SSL будут доступны только в производстве, поэтому, когда я настраиваю NGINX с SSL, среда разработки больше не работает, поскольку сертификаты ssl отсутствуют.

Вот соответствующая часть моего файла conf -

server {
 listen 80;
 listen 443 default_server ssl;

 server_name          atvcap.server.com;
 ssl_certificate      /etc/nginx/certs/atvcap_cabundle.crt;
 ssl_certificate_key  /etc/nginx/certs/atvcap.key;
 ...
}

Но это вызывает следующее при запуске моего приложения в режиме разработки:

nginx: [emerg] BIO_new_file ("/ etc / nginx / certs / atvcap_cabundle.crt") не удалось (SSL: ошибка: 02001002: системная библиотека: fopen: нет такого файла или каталога: fopen ('/ etc / nginx / certs / atvcap_cabundle .crt ',' r ') ошибка: 2006D080: подпрограммы BIO: BIO_new_file: такого файла нет)

Можно ли включить SSL, только если доступен "/etc/nginx/certs/atvcap_cabundle.crt"?

Я пробовал что-то вроде следующего -

if (-f /etc/nginx/certs/atvcap_cabundle.crt) {
  ssl_certificate      /etc/nginx/certs/atvcap_cabundle.crt;
  ssl_certificate_key  /etc/nginx/certs/atvcap.key;
}

Но это вызвало следующую ошибку -

nginx: [Emerg] директива ssl_certificate не разрешена здесь, в /etc/nginx/conf.d/default.conf:7

У кого-нибудь есть идеи о том, как достичь чего-то подобного?

Благодарность

27
sgpbyrne 30 Ноя 2017 в 17:06

2 ответа

Лучший ответ

Вы можете создать дополнительный файл ssl.conf и поместить сюда конфиги ssl:

ssl_certificate      /etc/nginx/certs/atvcap_cabundle.crt;
ssl_certificate_key  /etc/nginx/certs/atvcap.key;

Затем включите из основного конфига:

server_name          atvcap.server.com;

include /somepath/ssl.conf*;

Обязательно укажите символ * - он не сломается, если файл не существует в режиме разработки.

6
super_p 25 Июн 2018 в 12:23

Ответ @super_p правильный. Но чтобы ответить на комментарий @AbdolHosein, я добавляю сюда свой ответ, если он не ясен.

Вам необходимо включить директиву ssl_certificate во включенный файл.

# sample nginx config
http {
    server {
        listen 80 deferred;
        server_name _;

        include /ssl/ssl.conf*;

        client_body_timeout 5s;
        client_header_timeout 5s;

        root /code;
    }
}

Затем в своем /ssl/ssl.conf вы можете делать все, что хотите, например включать HTTPS:

# this is the /ssl/ssl.conf file
listen 443 ssl http2;
listen [::]:443 ssl http2;

ssl_certificate /ssl/cert.cer;
ssl_certificate_key /ssl/key.key;
ssl_session_timeout 1d;
ssl_session_cache shared:MozSSL:10m;
ssl_session_tickets off;
ssl_protocols TLSv1.2 TLSv1.3;
ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384;
ssl_prefer_server_ciphers off;

Хитрость в том, что мы не смотрим, существует ли сертификат, а проверяем, существует ли /ssl/ssl.conf. Это благодаря * в каталоге include /ssl/ssl.conf*;, как указано @super_p

2
Naramsim 22 Мар 2021 в 18:31