Авторизация пользователей с помощью SSL сертификата NGINX?
Стоит такая задача: есть сайт site.com на нем установлен ssl сертификат от godaddy , поднят суб домен simple.site.com , вот как раз для суб домена simple.site.com нужно сделать доступ только при наличии ssl сертификата который я генерирую на сервере (Пытался сделать по этой статье, все безуспешно https://habrahabr.ru/post/213741/).
Еще такой момент, много комментариев почитал , наткнулся на то что nginx не может так разруливать , в общем беда какая то второй день пытаюсь сделать такой доступ но при курле выдает ошибку : 400 Bad Request
No required SSL certificate was sent
- Вопрос задан более трёх лет назад
- 1178 просмотров
nginx проблемы с авторизацией по сертификату
nginx 1.6.2, самоподписанные сертификаты сервера и клиента, openssl проверку проходят:
$ openssl verify -CAfile server/server.crt client01.crt client01.crt: C = RU, ST = Moscow, L = Moscow, O = Companyname, OU = User, CN = etc, emailAddress = support@site.com error 18 at 0 depth lookup:self signed certificate OK
А при запросе nginx отвечает ошибкой 400 The SSL certificate error
В логах сервера:
2016/04/22 11:16:20 [info] 1465#0: *35 client SSL certificate verify error: (18:self signed certificate) wh ile reading client request headers, client: 192.168.2.11, server: _, request: "GET /test HTTP/1.1", host: " 192.168.2.6" 2016/04/22 11:16:20 [debug] 1465#0: *35 http finalize request: 495, "/test?" a:1, c:1 2016/04/22 11:16:20 [debug] 1465#0: *35 event timer del: 8: 1461313040230 2016/04/22 11:16:20 [debug] 1465#0: *35 http special response: 495, "/test?" 2016/04/22 11:16:20 [debug] 1465#0: *35 http set discard body 2016/04/22 11:16:20 [debug] 1465#0: *35 echo header filter, uri "/test?" 2016/04/22 11:16:20 [debug] 1465#0: *35 xslt filter header 2016/04/22 11:16:20 [debug] 1465#0: *35 posix_memalign: 0000000001F02580:4096 @16 2016/04/22 11:16:20 [debug] 1465#0: *35 HTTP/1.1 400 Bad Request
server < listen 443 ssl; listen [::]:443 ssl; ssl on; ssl_certificate /etc/nginx/ssl/server.crt; ssl_certificate_key /etc/nginx/ssl/server.nopass.key; ssl_client_certificate /etc/nginx/ssl/ca.crt; ssl_verify_client on; location < proxy_pass http://192.168.2.6:9080; >>
Я правильно понимаю, что серверу не нравится то, что сертификат самоподписанный? Как разрешить?
vvn_black ★★★★★
22.04.16 11:39:47 MSK
Вот это результата не дало:
ssl_trusted_certificate /etc/nginx/ssl/ca.crt;
Работает с ssl_verify_client optional_no_ca; , но результат не тот, что хотелось бы $ssl_client_verify=’FAILED’
vvn_black ★★★★★
( 22.04.16 13:02:08 MSK ) автор топика

Есть возможность получить сертификат от LetsEncrypt?
nite2kk8
( 24.04.16 07:14:44 MSK )

Перепроверь сертификаты: клиентский должен быть подписан ключом CA:
$ openssl verify -CAfile ca.crt client1.crt client1.crt: OK
Если считаешь, что всё ок — покажи их.
d2 ★
( 25.04.16 19:26:14 MSK )
Ответ на: комментарий от d2 25.04.16 19:26:14 MSK
Раньше не мог ответить. Решил проблему еще в пятницу, пересоздав сертифкаты.
vvn_black ★★★★★
( 25.04.16 21:06:55 MSK ) автор топика
23 января 2017 г.
Может кому пригодится
До этого момента подразумевается, что у вас уже есть nginx с fast cgi и mod ssl и вам нужно исправить (400 Bad Request No required SSL certificate was sent) и ошибки подобные (error 18 at 0 depth lookup:self signed certificate OK ) и ошибок с не достоверным сертификатом без доступа к ресурсу (NET::ERR_CERT_INVALID).
Начнем с сертификатов. Изначально для понимания ошибка (NET::ERR_CERT_INVALID) связана с тем что при создании CA и подписи сертификатов не верное указано значение CN, если настроен DNS указывайте ваш адресс CN=www.linux.org.ru, если не настроен внешний ip например CN=136.243.142.156 это значение CN должно быть одинаково для всех дальнейших действий с сертификатами (примеры с пробросом рассматривать не будем). Рассмотрим решение ошибки (error 18 at 0 depth lookup:self signed certificate OK) Изначально openssl настроен таким образом, что значаения OU eA должны быть уникальными ( настройки которая позволяет использовать одинаковые значения мы рассматривать не будем) Созданим CA с уникальными значениями, кроме CN OU=Admin/CN=136.243.142.156/emailAddress=support@site.com и все последующие значения будут OU=Server/CN=136.243.142.156/emailAddress=server@site.com OU=Client1/CN=136.243.142.156/emailAddress=client1@site.com OU=Client2/CN=136.243.142.156/emailAddress=client2@site.com
openssl req -new -newkey rsa:1024 -nodes -keyout ca.key -x509 -days 500 -subj /C=RU/ST=Moscow/L=Moscow/O=Companyname/OU=Admin/CN=136.243.142.156/emailAddress=support@site.com -out ca.crt
Создаем сетртификат для nginx и запрос для него, указав уникаьные OU eA OU=Server/CN=136.243.142.156/emailAddress=server@site.com
openssl genrsa -des3 -out server.key 1024 openssl req -new -key server.key -out server.csr
Безпарольная копия для запуска nginx
openssl rsa -in server.key -out server.nopass.key
Создаем ca.config (перед первыми символами не должно быть помежутков)
[ ca ] default_ca = CA_CLIENT [ CA_CLIENT ] dir = ./db certs = $dir/certs new_certs_dir = $dir/newcerts database = $dir/index.txt serial = $dir/serial certificate = ./ca.crt private_key = ./ca.key default_days = 365 default_crl_days = 7 default_md = md5 policy = policy_anything [ policy_anything ] countryName = optional stateOrProvinceName = optional localityName = optional organizationName = optional organizationalUnitName = optional commonName = optional emailAddress = optional
В каталоге с ca.config создает структуру указанную выше
mkdir db mkdir db/certs mkdir db/newcerts touch db/index.txt echo "01" > db/serial
Создаем запрос и выполняем на создание клиентов
openssl req -new -newkey rsa:1024 -nodes -keyout client2.key -subj /C=RU/ST=Moscow/L=Moscow/O=Companyname/OU=Client2/CN=136.243.142.156/emailAddress=client2@site.com -out client2.csr openssl ca -config ca.config -in client2.csr -out client2.crt -batch
Если вернутся выше у вас уже должен быть nginx+fast cgi, тогда конфиг будет примерно таким При настройке в nginx в разделе server отключаем http порт #listen 80; для корректной работы при ssl_verify_client on; Пример nginx конфига для
server < #listen :80; #server_name 136.243.142.156; access_log /var/log/nginx/default.access.log; listen 136.243.142.156:443 ssl; server_name 136.243.142.156; ssl on; ssl_certificate /etc/nginx/config/ssl/server.crt; ssl_certificate_key /etc/nginx/config/ssl/server.nopass.key; ssl_client_certificate /etc/nginx/config/ssl/ca.crt; ssl_verify_client on; keepalive_timeout 70; fastcgi_param SSL_VERIFIED $ssl_client_verify; fastcgi_param SSL_CLIENT_SERIAL $ssl_client_serial; fastcgi_param SSL_CLIENT_CERT $ssl_client_cert; fastcgi_param SSL_DN $ssl_client_s_dn; location / < root /var/www/default; fastcgi_pass 127.0.0.1:9000; include /etc/nginx/fastcgi_params; >
Проверяем работоспособность в curl (у вас не должно быть ошибки 400)
curl -k --key client2.key --cert client2.crt --url "https://136.243.142.156"
Пакуем для браузеров.
openssl pkcs12 -export -in client2.crt -inkey client2.key -out cert.p12
ssl_verify_client и ошибка 400: Bad request. No required SSL certificate was sent
Есть проблема с передачей клиентского сертификата серверу nginx.
Я настроил самозаверенный CA, серверный и клиентский сертификаты, но при попытках соединения всегда получаю ошибку 400: Bad request. No required SSL certificate was sent. Проверка сертификата сеервера проходит успешно, Но ни Firefox, ни curl и wget с соответствующими ключами даже не пытаются послать клиентский сертификат серверу. В логах nginx на уровне debug — только записи вида:
2011/03/13 13:44:00 [info] 20172#0: *2 client sent no required SSL certificate while reading client request headers
Сервер: GNU/Linux, nginx-0.8.54. Клиент: GNU/Linux.
Как понять, что происходит и почему? Могу прислать все необходимые логи, которые могут помочь при диагностике. И если нужно — то и сертификаты.
С уважением,
—
Андрей Коробков