Aqui está a situação - há um proxy nginx transparente que lida com certificados SSL e o faz bem até que decidimos adicionar um gerenciamento de lista de revogação, necessário por motivos de segurança. É quando a linha "ssl_crl" entra em jogo e estraga tudo.
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;
}
O servidor sempre fornecerá o erro "400 Bad Request" sempre que um usuário tentar autenticar com SSL.
Note que exatamente a mesma configuração (não a mesma porque sintaxe) funciona perfeitamente no Apache.
Agora os certificados são impecáveis, o que foi comprovado muitas vezes; aqui está a verificação, por exemplo
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
Os links da CRL estão funcionando e não há nada que pareça errado, aqui está uma parte do log de erros.
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"
Este é basicamente o único erro que existe e, como afirmei anteriormente, os mesmos certificados funcionam com o Apache.
Eu pensei que isso poderia ser um bug, mas o último aviso de erro semelhante é datado de 2011, então eu duvido que ninguém tenha resolvido esse quebra-cabeça ainda.