Вот такая ситуация - существует прозрачный прокси-сервер 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