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