Назад | Перейти на главную страницу

Не удается настроить прокси-сервер Apache с двусторонним SSL с проверкой CN сертификата

Мне нужно настроить прокси-сервер с двусторонней проверкой 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

Все еще что-то не так:

  1. Когда я меняю
 SSLRequire %{SSL_SERVER_S_DN_CN} in {"externalserver.com"}

к

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

У меня все еще есть связь. Даже при добавлении SSLOptions +StrictRequire

  1. Когда я установил SSLProxyCheckPeerName on

Сертификат сервера (externalserver.com) соответствует domain1.example.com. Я ожидал, что он будет соответствовать "externalserver.com"

Я что-то делаю не так или наткнулся на ошибку?