Назад | Перейти на главную страницу

nginx proxy + ssl + clr ошибка «400 неверный запрос»

Вот такая ситуация - существует прозрачный прокси-сервер nginx, который обрабатывает сертификаты SSL и делает это хорошо, пока мы не решим добавить управление списком отзыва, необходимое по соображениям безопасности. Это когда в игру вступает строка "ssl_crl" и все портит.

server {
    listen  80;
    rewrite ^ https://$host$request_uri permanent;
}


server {
    listen 443 ssl;
    server_name example.com;
    ssl on;
    ssl_certificate /home/netadmin/keys/tid.crt;
    ssl_certificate_key /home/netadmin/keys/tid.key;
    ssl_session_cache shared:SSL:10m;
    ssl_client_certificate /home/netadmin/keys/personchain.pem;
    ssl_crl /home/netadmin/keys/personlist.crl;
    ssl_verify_client on;
    ssl_verify_depth 2;
    error_log /var/log/nginx/debug.log debug;

    location / {
            proxy_pass      http://111.111.111.111:80;
    }

Сервер всегда выдает ошибку «400 Bad Request» всякий раз, когда пользователь пытается аутентифицироваться с помощью SSL. Обратите внимание, что точно такая же (не такая же из-за синтаксиса) конфигурация отлично работает в Apache. Теперь сертификаты безупречны, что неоднократно подтверждалось, вот проверка, например

openssl crl -CAfile personchain.pem -inform PEM -in personlist.crl -lastupdate -nextupdate -noout
verify OK
lastUpdate=Apr 22 14:59:18 2013 GMT 
nextUpdate=Apr 29 14:59:18 2013 GMT 

Ссылки CRL работают, и все в порядке, вот часть журнала ошибок.

2013/04/23 15:47:42 [info] 3612#0: *1 client SSL certificate verify error: (3:unable to get certificate CRL) while reading client request headers, client: 192.168.122.1, server: example.com, request: "GET / HTTP/1.1", host: "example.com"

По сути, это единственная ошибка, и, как я сказал ранее, те же сертификаты работают с Apache. Я подумал, что это может быть ошибка, но последнее уведомление о подобной ошибке датировано 2011 годом, поэтому я сомневаюсь, что никто еще не решил эту загадку.

Тот же ответ, что и здесь: https://serverfault.com/a/676498/277052: Если у вас несколько центров сертификации, вам необходимо объединить все списки отзыва сертификатов.

Вам необходимо объединить все списки отзыва сертификатов в цепочку: корневой центр сертификации и промежуточный центр сертификации.

С помощью openssl crl -in crl_list.crl -noout -text читать только первые crl, но nginx читает их правильно и проверяет сертификат пользователя.

Вдохновленный: https://www.ruby-forum.com/topic/6874370

Есть ли у процесса nginx доступ для чтения к этому crl? Также он в правильном формате pem и подписан тем же CA, что и root crt?

Пример:

$ openssl crl -text -noout -in personlist.crl

Ссылка: http://www.apacheweek.com/features/crl