LINUX.ORG.RU

nginx проблемы с авторизацией по сертификату

 ,


0

2

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

Настройки nginx:

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;
    }
}

Я правильно понимаю, что серверу не нравится то, что сертификат самоподписанный? Как разрешить?

★★★★★

Вот это результата не дало:

ssl_trusted_certificate /etc/nginx/ssl/ca.crt;

Работает с ssl_verify_client optional_no_ca;, но результат не тот, что хотелось бы $ssl_client_verify='FAILED'

vvn_black ★★★★★ ()

Есть возможность получить сертификат от LetsEncrypt?

nite2kk8 ()

openssl проверку проходят:

Перепроверь сертификаты: клиентский должен быть подписан ключом CA:

$ openssl verify -CAfile ca.crt client1.crt 
client1.crt: OK

Если считаешь, что всё ок - покажи их.

d2 ()
Ответ на: комментарий от d2

Раньше не мог ответить. Решил проблему еще в пятницу, пересоздав сертифкаты.

vvn_black ★★★★★ ()

Может кому пригодится

До этого момента подразумевается, что у вас уже есть 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
На этом этапе можно выполнить сверку подписей сертификатов ca, но мы ее пропустим. Передаем на клиент доверенный ca.crt для проверки клиентских сертификатов. Соединение будет защищенным но не авторизованным сертификат будет доверенный http://prntscr.com/dzajxs 400 Bad Request No required SSL certificate was sent http://prntscr.com/dzal4o Далее посылаем наш cert.p12 от клиента и делаем настройку в браузере http://prntscr.com/dzam77 Загруженный ключ должен обязательно быть в личном http://prntscr.com/dzan0t Далее нам придется полность закрыть браузер после установки сертификата! <- При открыии ресурса мы увидим диалоговое окно http://prntscr.com/dzaoa3 В котором нужно будет указать что мы хотим передать сертификат. http://prntscr.com/dzaowv Теперь мы имеем авторизацию по ssl сертификатам успехов.

thelegendary ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.