Мне удалось создать свои сертификаты с LE без ошибок, мне также удалось перенаправить мой трафик с порта 80 на порт 443. Но когда я перезагружаю свой сервер nginx, я не могу получить доступ к своему веб-сайту. Журналы ошибок Ngnix показывают эту строку:
4 no "ssl_certificate" is defined in server listening on SSL port while SSL handshaking, client: 192.168.0.104, server: 0.0.0.0:443
Я думаю, это означает, что он не может найти сертификаты, которые я затем перешел к пути сертификатов, и они оба там, в чем может быть проблема? Вот как выглядит моя конфигурация Ngnix:
server {
listen 80;
server_name pumaportal.com www.pumaportal.com;
return 301 https://$server_name$request_uri;
}
server {
listen 443 ssl;
server_name pumaportal.com www.pumaportal.com;
add_header Strict-Transport-Security "max-age=31536000";
ssl_certificate /etc/letsencrypt/live/pumaportal.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/pumaportal.com/privkey.pem;
ssl_stapling on;
ssl_stapling_verify on;
access_log /var/log/nginx/sub.log combined;
location /.well-known {
alias /[MY PATH]/.well-known;
}
location / {
proxy_pass http://localhost:2000;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection 'upgrade';
proxy_set_header Host $host;
proxy_cache_bypass $http_upgrade;
proxy_set_header X-Forwarded-For $remote_addr;
}
}
Все кажется довольно простым, я не понимаю, в чем может быть проблема.
После запуска nginx -t все выглядит нормально:
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful
Я предполагаю, что у вас есть другой сервер, прослушивающий порт 443. Для этого сервера не определен ssl_certificate, и он выбирается автоматически (SNI). Попробуйте удалить все символические ссылки из / etc / nginx / sites-enabled, кроме этого одного сервера, который вы хотите заставить работать (если это возможно, в противном случае проверьте все свои серверы на прослушивание 443 без правильной настройки).
Я исправил ту же проблему сегодня утром, поэтому я здесь, чтобы прояснить точку зрения C.A (которая, теперь, когда я понимаю проблему, была хорошо сделана), у вас, скорее всего, есть два серверных блока:
# default server { listen 443 default_server; # Note the lack of `ssl` server_name _; #... } #real site server { listen 443 ssl; server_name ; #... }
SNI будет только совпадать с теми, которые помечены ssl
слушатель. Однако сервер по умолчанию захватит все входящий трафик на 443 вне зависимости от SSL или нет. Следовательно, это фактически препятствует тому, чтобы SNI вообще работал, с места в карьер, собирая весь трафик для себя.
Симптомы:
nginx -t
и перезагрузка сервиса)Решения:
Сегодня утром я исправил проблему, удалив серверный блок по умолчанию, что позволило сопоставить SNI с прослушивателями SSL.
Альтернативным решением было бы добавить ssl
слушатель и ssl_certificate
строк к блоку сервера, чтобы SNI был включен на вашем хосте по умолчанию. Вы по-прежнему будете получать ошибки SSL, так что это не лучшее решение, но позволит вашему SNI работать :)
Вам нужно определить единый
default_server
параметр в конфигурации nginx.
Подать заявление default_server
на example.com или www.example.com. Не оба.
Следовательно, это будет работать:
server {
listen 443 ssl;
listen 80;
server_name example.com;
return 301 https://www.example.com$request_uri;
}
server {
listen 80 default_server;
server_name www.example.com;
return 301 https://www.example.com$request_uri;
}
server {
listen 443 ssl default_server;
server_name www.example.com;
root /var/www/example.com/public;
index index.php index.html index.nginx-debian.html;
ssl on;
ssl_certificate /etc/ssl/chain.crt;
ssl_certificate_key /etc/ssl/examplecom.key;
(rest of your nginx config goes here....)
}
Примечание о виртуальных хостах: убедитесь, что default_server
параметр больше нигде не определен - если у вас несколько хостов на сервере.
Поздно к игре, как обычно, но поскольку это помогло мне ... Проверьте, не поврежден ли сертификат. При построении «единой» CRT (crt + intermediate), выполняя
$cat server.crt provider.intermediate > unified.crt
Я как-то потерял LF и получил такую строку:
-----END CERTIFICATE----------BEGIN CERTIFICATE-----
вместо того
-----END CERTIFICATE-----
-----BEGIN CERTIFICATE-----
и nginx не принял бы сертификат и завершился ошибкой, указанной выше.
Делать
# openssl x509 -in unified.cert -text -out
дал мне подсказку, что openssl выйдет из строя.
Проверьте правильность прав доступа к файлам для сертификатов. Пожалуйста, опубликуйте список каталогов (ls -la
)