Я использовал openssl для создания следующих сертификатов:
openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout server.key -out server.crt -subj "/C=IT/ST=Mi/L=Milan/O=MyOrg/OU=RnD/CN=localhost/emailAddress=info@myorg.com"
openssl rsa -in server.key -out server.insicure.key
cat server.insicure.key > certificate.pem
cat server.crt >> certificate.pem
Затем я настраиваю nginx для защиты сайта от клиента:
server {
listen 80 ssl;
root /var/www/site;
index index.html;
ssl_certificate /root/server.crt;
ssl_certificate_key /root/server.key;
ssl_client_certificate /root/certificate.pem;
ssl_verify_client on;
ssl_verify_depth 2;
location / {
try_files $uri $uri/ =404;
}
}
Однако, когда я пытаюсь получить сайт с помощью curl, он работает не так, как ожидалось:
curl --cacert certificate.pem https://localhost:80
и я получаю следующую страницу с ошибкой от nginx:
<html>
<head><title>400 No required SSL certificate was sent</title></head>
<body bgcolor="white">
<center><h1>400 Bad Request</h1></center>
<center>No required SSL certificate was sent</center>
<hr><center>nginx/1.14.0 (Ubuntu)</center>
</body>
</html>
Что я делаю не так? Спасибо
Вы даете Nginx указание запросить сертификат клиента с помощью:
ssl_verify_client on;
ssl_verify_depth 2;
Однако вы не сказали curl
использовать один (--cacert
только говорит curl
где находится сертификат ЦС, используемый для проверки сертификата сервера). Таким образом, Nginx правильно сообщает вам, что вы не отправили сертификат клиента.
Если вы хотите, чтобы сервер только отправлял сертификат TLS, чтобы заставить работать HTTPS, просто закомментируйте или удалите две строки выше.
Если вы действительно хотите, чтобы клиент отправлял сертификат, вам следует создать центр сертификации и использовать его для выдачи сертификата клиента. Дайте клиентский сертификат и закрытый ключ curl
(используйте --cert
и --key
соответственно) и настройте сертификат CA в Nginx с помощью ssl_client_certificate
(без закрытого ключа !!).
это вопрос ответ показывает, как создать сертификат клиента с помощью OpenSSL.