Доступ по протоколу HTTPS через прокси-сервер Apache: нет допустимого пути сертификации

#java #apache #https #glassfish

#java #apache #https #glassfish

Вопрос:

Я пытаюсь настроить SSL-доступ с использованием интерфейса Apache (версии 2.4.6) в качестве сервера ReverseProxy для обслуживания нескольких приложений Java, развернутых на внутреннем сервере с glassfish (версия 3.1.2.2). Используя VirtualHost и ServerName, все отлично работает с протоколом HTTP:

 <VirtualHost *:80>
   ServerName ppd-cas.capeb.fr
   # redirect "/" "https://ppd-cas.capeb.fr/cas"
   ProxyPreserveHost On
   RedirectMatch "/$" "/cas"
   ProxyPass "/cas" "http://10.1.93.10:34674/cas" retry=0 timeout=300 Keepalive=On
   ProxyPassReverse "/cas" "http://10.1.93.10:34674/cas"
</VirtualHost>
  

Я настроил HTTPS (в ssl.conf) следующим образом:

 <VirtualHost *:443>
   ServerName ppd-cas.capeb.fr

   SSLEngine on
   SSLProxyEngine on
   SSLProxyVerify none
   SSLProxyCheckPeerCN off
   SSLProxyCheckPeerName off
   # SSLProxyCheckPeerExpire off
   SSLCertificateFile /etc/ssl/private/server.cert
   SSLCertificateKeyFile /etc/ssl/private/server.key

   ProxyRequests Off
   ProxyPreserveHost on
   RedirectMatch "/$" "/cas"
   ProxyPass "/cas" "https://10.1.93.10:56912/cas" retry=0 timeout=300 Keepalive=On
   ProxyPassReverse "/cas" "https://10.1.93.10:56912/cas"
</VirtualHost>
  

Сертификат самоподписан, сгенерирован и развернут на интерфейсном сервере. Я думал, что смогу использовать HTTPS между браузером и интерфейсом, а затем игнорировать сертификат между интерфейсом и серверной частью, таким образом, вышеуказанные параметры с параметрами «нет» или «выключено».

Приведенный пример (ppd-cas.capeb.fr ) отлично работает с использованием https, НО другое приложение, описанное ниже, с идентичными параметрами, не:

 <VirtualHost *:443>
   ServerName ppd-isabat.capeb.fr

   SSLEngine on
   SSLProxyEngine on
   SSLProxyVerify none
   SSLProxyCheckPeerCN off
   SSLProxyCheckPeerName off
   # SSLProxyCheckPeerExpire off
   SSLCertificateFile /etc/ssl/private/server.cert
   SSLCertificateKeyFile /etc/ssl/private/server.key

   ProxyRequests Off
   ProxyPreserveHost on
   RedirectMatch "/$" "/CAPEBWeb"
   ProxyPass "/CAPEBWeb" "https://10.1.93.10:8181/CAPEBWeb" retry=0 timeout=300 Keepalive=On
   ProxyPassReverse "/CAPEBWeb" "https://10.1.93.10:8181/CAPEBWeb"
</VirtualHost>
  

Ошибка, которую я получаю в журналах Glassfish:

 [#|2016-10-04T15:54:46.078 0200|WARNING|glassfish3.1.2|javax.enterprise.system.container.web.com.sun.enterprise.web|_ThreadID=19;_ThreadName=Thread-2;|StandardWrapperValve[action]: PWC1406: Servlet.service() for servlet action threw exception
java.lang.RuntimeException: javax.net.ssl.SSLHandshakeException: sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target
  

Сложность заключается в том, что приложение ppd-isabat.capeb.fr (тот, который не работает) развертывается в домене1 Glassfish и использует аутентификацию CAS, а CAS (тот, который работает) развертывается в домене2 того же Glassfish. Попытка доступа ppd-isabat.capeb.fr (https://ppd-isabat.capeb.fr ), я правильно перенаправляюсь на страницы аутентификации центров сертификации, ошибка возникает после проверки учетных данных. Для меня другой домен установки является частью проблемы, но это всего лишь догадка.

Является ли мой подход (отключение ограничений SSL между интерфейсом и серверной частью) неправильным? я упускаю что-то очевидное? Glassfish внедрил самозаверяющий сертификат, чтобы он мог идентифицировать себя?

Я тщательно ищу StackOverflow, но ни один из вопросов действительно не соответствует этой специфической конфигурации.

Любая помощь приветствуется 🙂

PS: Это мой 1-й пост, поэтому, пожалуйста, не будьте слишком суровыми. Я француз, поэтому, пожалуйста, не будьте слишком суровы!

Ответ №1:

В своем сообщении вы сказали, что хотите завершить SSL работу в самом Apache и связь между Apache и Glassfish должна быть HTTP ( non-ssl ), но все же вы передаете запросы на серверную часть с https URL-адресами:

 ProxyPass "/CAPEBWeb" "**https**://10.1.93.10:8181/CAPEBWeb" retry=0 timeout=300 Keepalive=On
ProxyPassReverse "/CAPEBWeb" "**https**://10.1.93.10:8181/CAPEBWeb"
  

Разве вы не должны использовать http:// вместо https://?
Вам также может потребоваться изменить порт с 8181 на что-то другое в зависимости от конфигурации вашего glassfish.

Комментарии:

1. Я попытался установить его как HTTP между Apache и Glassfish, но это не сработало. Итак, я настроил Apache на использование HTTPS, но игнорирую сертификат, используя: SSLProxyVerify none, SSLProxyCheckPeerCN off и SSLProxyCheckPeerName off. 8181 — это порт в Glassfish, который прослушивает трафик HTTPS для domain1.

2. Точнее, завершение https в Apache вызывает следующую ошибку: Исключение ValidatorException: ошибка построения пути PKIX: sun.security.provider.certpath. Исключение SunCertPathBuilderException: не удается найти допустимый путь сертификации к запрошенной цели. Похоже, CAS не доволен моим текущим conf.