Вот какая ошибка у меня возникает:
Перезагрузка конфигурации nginx: nginx: [emerg] SSL_CTX_use_certificate_chain_file("/path/to/cert.pem") не удалось (SSL: ошибка:02001002:системная библиотека:fopen:Нет такого файла или каталога ошибка:20074002:процедуры BIO:FILE_CTRL:системная библиотека ошибка:140DC002:процедуры SSL:SSL_CTX_use_certificate_chain_file:системная библиотека) nginx: проверка файла конфигурации /etc/nginx/nginx.conf не удалась
Я на 100% уверен, что файл находится в этом месте, но Nginx, похоже, думает, что его там нет. Я объединил domain.crt
и intermediate.crt
вручную в таком порядке. Я ломал голову над этим целый день. Надеюсь, кто-то видел эту ошибку и знает решение. (и заметьте, что это не ошибка вставки, так как местоположение файла отображается только один раз и не отображается снова после «такой файл или каталог отсутствуют»).
решение1
Вы уверены, что пользователь Nginx имеет доступ к каталогу?
Также проверьте права доступа к файлу .pem
: если Nginx не может получить к нему доступ, он может отображаться как 'no such file or directory'
.
Если разрешения верны, вы можете проверить фактический путь еще раз. Как вы его вставили (я знаю, что вы удалили каталог), там нет начала, /
что может быть проблемой.
РЕДАКТИРОВАТЬ
Попробуйте перенести настройку SSL в следующую структуру (а также изменить ее nginx.conf
на соответствующую):
sudo mkdir /etc/nginx/ssl
sudo chown -R root:root /etc/nginx/ssl
sudo chmod -R 600 /etc/nginx/ssl
Nginx может давать сбой .pem
из-за слишком открытых прав доступа (нужен исходный код, чтобы убедиться, что Nginx это делает), но приведенная выше настройка должна работать нормально.
решение2
Я оставлю свой ответ на мою проблему, на случай, если кто-то столкнется с этой темой.
У меня запущен nginx внутри контейнера docker, и при попытке доступа к файлу закрытого ключа возникает та же ошибка. Почесав голову несколько часов, я пришел к выводу, что у моего docker nginx нет тома монтирования, содержащего мои данные.
Единственный вариант добавить том монтирования — удалить и заново создать контейнер с помощью -v
опции:
https://docs.docker.com/engine/tutorials/dockervolumes/
docker run -d -P --name docker-nginx -v /etc/ssl/certs:/etc/ssl/certs nginx
Иногда тривиальные вещи трудно увидеть. Надеюсь, это поможет.
решение3
Возможный сценарий:
Иногда может случиться так, что при настройке файлов SSL (закрытого ключа и сертификата) для настраиваемого виртуального хоста забывается указать абсолютный путь к этим файлам.
Например, если следовать этому официальному документу от Nginx:http://nginx.org/en/docs/http/configuring_https_servers.html
server {
listen 443 ssl;
server_name www.example.com;
ssl_certificate tdmssl.crt;
ssl_certificate_key tdmssl.key;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_ciphers HIGH:!aNULL:!MD5;
...
}
Предположим, что вы храните файлы SSL внутри "/etc/nginx/conf.d":
root@ilg40:/etc/nginx/conf.d# pwd
/etc/nginx/conf.d
root@ilg40:/etc/nginx/conf.d# ll
total 16
drwxr-xr-x 2 root root 4096 Jan 24 17:39 ./
drwxr-xr-x 5 root root 4096 Jan 24 21:15 ../
-rw-r--r-- 1 root root 1359 Jan 24 17:39 tdmssl.crt
-rw-r--r-- 1 root root 1675 Jan 24 17:39 tdmssl.key
Что происходит?
По умолчанию, если не указан абсолютный путь к обычному файлу, который используется Nginx, Nginx будет искать файлы в "/etc/nginx"
Из /var/log/nginx/error.log
2017/01/24 21:05:10 [emerg] 13113#0:
BIO_new_file("/etc/nginx/tdmssl.crt")
failed(SSL:error:02001002:system library:fopen:
No such file or directory:fopen('/etc/nginx/tdmssl.crt','r')
error:2006D080:BIO routines:BIO_new_file:no such file)
Что нужно сделать?
Указать абсолютный путь к дополнительным файлам, которые используются вашей конфигурацией Virtualhost.
Так:
root@ilg40:/etc/nginx/conf.d# cd
root@ilg40:~# cat /etc/nginx/sites-available/tdm
server {
listen 443 ssl;
server_name tjsdatamanager.redtjs.com;
ssl_certificate /etc/nginx/conf.d/tdmssl.crt;
ssl_certificate_key /etc/nginx/conf.d/tdmssl.key;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_ciphers HIGH:!aNULL:!MD5;
location / {
include proxy_params;
proxy_pass http://unix:/etc/tdm/flask/wsgi.sock;
}
}
решение4
Я столкнулся с той же проблемой.
[симптом]
Он не может запуститься с помощью "systemctl restart nginx".
Но команда ниже может запустить nginx.
"/usr/sbin/nginx"
[причина]
Я использовал файл сертификата, напрямую загруженный с провайдера.
[решено]
Я скопировал текст сертификата и вставил его в созданный мной файл (с помощью vim).