Colocando restrições em extensões de certificado ao fazer proxy de HTTPs com nginx

Colocando restrições em extensões de certificado ao fazer proxy de HTTPs com nginx

Estou usando o nginx como proxy reverso para lidar com HTTPS para um aplicativo que fala HTTP. Isso está funcionando muito bem até agora, mas agora preciso restringir os tipos de certificados que aceito do servidor upstream. Além das verificações usuais, preciso também ser capaz de rejeitar qualquer certificado com restrições de nome ou com mapeamento de política, bem como rejeitar o certificado se determinadas extensões estiverem marcadas como críticas.

No openssl, acredito que isso poderia ser alcançado com verify_callbackoSSL_CTX_set_verifyobtendo as extensões x509 e verificando o que está presente/crítico.

É possível:

a) Definir esse tipo de restrições nas extensões de certificado na configuração do nginx? Parece que ongx_http_ssl_moduletem uma ssl_conf_commanddiretiva usada para passar algumas opções de configuração para o openssl, mas não tenho certeza se isso é relevante para proxies reversos ou se é capaz de validações de certificado "personalizadas".

ou

b) Escreva um módulo personalizado que possa realizar verificações adicionais no certificado recebido do upstream e interromper a conexão se falharem? Não estou tão familiarizado com o funcionamento dos módulos, então qualquer conselho seria apreciado se esta for uma solução potencial.

ou

c) Modificar os arquivos de configuração do openssl para conseguir isso? Talvez seja possível definir essas restrições no nível do openssl e não exigir nenhuma alteração no nginx.

A parte relevante do meu arquivo de configuração é semelhante a:

http {

  keepalive_timeout  65;
  access_log  nginx_access.log;

  server {

    listen 12312;

    location / {
      ...
      proxy_pass https://<ip_address_of_upstream_server>;
      proxy_redirect https://<<ip_address_of_upstream_server>> http://localhost:12312;
      proxy_ssl_certificate certs/client-cert.pem;
      proxy_ssl_certificate_key certs/client-key.pem;
      proxy_ssl_trusted_certificate  certs/root.pem;
      proxy_ssl_verify on;
      ...
    }
  }
}

Obrigado!

informação relacionada