Мне нужно настроить прокси-сервер с двусторонней проверкой SSL. Я довольно далеко продвинулся в использовании Apache 2.4.10 в Debian, но это не удалось, потому что сертификат CN сравнивается с неправильным именем. Я искал и читал каждую страницу, на которой удаленно упоминается что-то подобное, но я не могу найти решение.
Настроить:
Я установил виртуальный хост в Apache 2.4.10 для каждого виртуального хоста tomcat со следующей конфигурацией:
<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>
Когда я начинаю запрос (http://domain1.example.com/external/someuri) Я вижу, что происходит рукопожатие SSL, но не удается из-за следующей ошибки
SSL Proxy: Peer certificate CN mismatch: Certificate CN: EXTERNALSERVER.COM Requested hostname: domain1.example.com
Затем соединение закрывается.
При добавлении ProxyPerserveHost off
рукопожатие прекращается даже до выполнения этой проверки.
Что нужно сделать, чтобы сертификат прошел успешную проверку?
ОБНОВИТЬ
Мне удалось заставить это работать, изменив конфигурацию на:
<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>
Обновление 2
Все еще что-то не так:
SSLRequire %{SSL_SERVER_S_DN_CN} in {"externalserver.com"}
к
SSLRequire %{SSL_SERVER_S_DN_CN} in {"somethingelse.com"}
У меня все еще есть связь. Даже при добавлении SSLOptions +StrictRequire
SSLProxyCheckPeerName on
Сертификат сервера (externalserver.com) соответствует domain1.example.com. Я ожидал, что он будет соответствовать "externalserver.com"
Я что-то делаю не так или наткнулся на ошибку?