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:
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:
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
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?
Tags proxy mod-ssl apache-2.4