Configurando um proxy de encaminhamento do Apache com SSL bidirecional com falha na verificação CN do certificado

2

Eu preciso configurar um proxy de encaminhamento com verificação SSL de 2 vias. Cheguei muito longe usando o Apache 2.4.10 no Debian, mas ele falha porque o certificado CN é comparado ao nome errado. Eu pesquisei e li todas as páginas que mencionam remotamente algo semelhante, mas não consigo encontrar a solução.

Configuração:

  • servidor tomcat sendo executado no link com hosts virtuais nomeados por nó
  • quando acionado cada um dos vhosts envia uma solicitação para o link
  • a conexão SSL deve fornecer o certificado que pertence ao vhost e verificar o certificado do servidor externo

Eu configurei um host virtual no Apache 2.4.10 para cada vhost do tomcat, com a seguinte configuração:

<Virtualhost *:80>
  ServerName domain1.example.com

   SSLProxyEngine On
   ProxyVia On

   SSLProxyMachineCertificateFile /proxysetup/certs/domain1.example.certandkey.pem

   # server certificate verification

   SSLProxyCACertificatePath /proxysetup/ca
   SSLProxyCARevocationCheck leaf
   SSLProxyCARevocationPath /proxysetup/crl
   SSLProxyVerify require
   SSLProxyVerifyDepth 4
   SSLProxyCheckPeerName off
   SSLProxyCheckPeerCN on
   SSLProxyCheckPeerExpire on

  ProxyPass /external https://externalserver.com/ 
  ProxyPassReverse /external https://externalserver.com/

    <Proxy "*">
        Order deny,allow
        Allow from all
    </Proxy>

   LogLevel Debug

   ErrorLog  /proxysetup/logs/domain1.example-error-80.log
   CustomLog /proxysetup/logs/domain1.example-access-80.log combined

</VirtualHost>

Quando inicio um pedido ( link ) vejo o handshake SSL a decorrer, mas falha com o seguinte erro

SSL Proxy: Peer certificate CN mismatch: Certificate CN: EXTERNALSERVER.COM Requested hostname: domain1.example.com

A conexão é então fechada.

Ao adicionar ProxyPerserveHost off , o handshake para mesmo antes de essa verificação ser realizada.

O que precisa ser feito para que o certificado seja verificado com sucesso?

UPDATE

Consegui fazer isso funcionar alterando a configuração para:

<Virtualhost *:80>
  ServerName domain1.example.com

   SSLProxyEngine On

   SSLProxyMachineCertificateFile /proxysetup/certs/domain1.example.certandkey.pem

   # server certificate verification

   SSLProxyCACertificatePath /proxysetup/ca
   SSLProxyCARevocationCheck leaf
   SSLProxyCARevocationPath /proxysetup/crl
   SSLProxyVerify require
   SSLProxyVerifyDepth 4
   SSLProxyCheckPeerName off
   SSLProxyCheckPeerCN off
   SSLProxyCheckPeerExpire on

  ProxyPass /external/ https://externalserver.com/ 
  ProxyPassReverse /external/ https://externalserver.com/

  ProxyPass / http://localhost:8080/
  ProxyPassReverse / http://localhost:8080/

    <Proxy "*">
        Require all granted
    </Proxy>

  <Proxy "*/external/">
  # only allow local requests 
  # and only if the server certificate contains the correct FQDN

  Require all denied
  Require local
  SSLRequire %{SSL_SERVER_S_DN_CN} in {"externalserver.com"}
  </Proxy>

   LogLevel Debug

   ErrorLog  /proxysetup/logs/domain1.example-error-80.log
   CustomLog /proxysetup/logs/domain1.example-access-80.log combined

</VirtualHost>

Atualização 2

Ainda há algo errado:

  1. Quando eu mudo
 SSLRequire %{SSL_SERVER_S_DN_CN} in {"externalserver.com"}

para

 SSLRequire %{SSL_SERVER_S_DN_CN} in {"somethingelse.com"}

Eu ainda recebo uma conexão. Mesmo quando adicionar SSLOptions +StrictRequire

  1. Quando eu defino SSLProxyCheckPeerName on

O certificado do servidor (externalserver.com) é correspondido a domain1.example.com. Eu esperaria que correspondesse ao 'externalserver.com'

Estou fazendo algo errado ou me deparei com um bug?

    
por hepabolu 26.03.2016 / 23:55

0 respostas