ProxyRemote приводит к «AH00898: Ошибка при обмене данными SSL с удаленным сервером …», работает на другом сервере

#apache #proxy #openssl #mod-proxy #mod-ssl

Вопрос:

Цель

Настройте виртуальный хост в качестве Обратного прокси-сервера, который также действует как Перенаправляющий прокси на другой «Удаленный» прокси для определенного шаблона URL-адреса.

Вопрос

У меня есть 2 сервера (на самом деле 2 отдельные машины), оба с одинаковой конфигурацией, но только один сервер может пересылать запросы.

Я обыскал весь Интернет и провел еще больше экспериментов, чем описано ниже (но, похоже, упоминать здесь неуместно), так что я очень, очень благодарен за любую идею/эксперимент, который вам придет в голову!

Конфигурация

Свалка

apache2ctl -DDUMP_CONFIG | grep -vE "^[ ]*#[ ]*[0-9] :$" > apache_dump.conf В соответствии с конфигурацией apache оба сервера идентичны.

Виртуальный Хост

 <VirtualHost *:80>

[...]

SSLProxyEngine on
ProxyRemote "https://booking-service.com/" "http://remote-proxy:3128"

<Location /booking>
    ProxyPass https://booking-service.com/api
    ProxyPassReverse https://booking-service.com/api
    ProxyPreserveHost Off
    RequestHeader set X-Api-Key "..."
    RequestHeader unset Cookie
    RequestHeader unset Authorization
</Location>

</VirtualHost>
 

Модули

Вот выдержка из активированных модулей, которая, ИМХО, может иметь отношение:

 [...]
http_module (static)
[...]
ssl_module (shared)
[...]
proxy_module (shared)
proxy_http_module (shared)
proxy_ftp_module (shared)
proxy_ajp_module (shared)
proxy_wstunnel_module (shared)
proxy_balancer_module (shared)
[...]
 

Регулярные Журналы Ошибок

(IPs and host names obfuscated)

 [proxy:trace2] [pid 21616:tid 140692231767808] proxy_util.c(3016): HTTPS: fam 2 socket created to connect to booking-service.com
[proxy:debug] [pid 21616:tid 140692231767808] proxy_util.c(3050): AH02824: HTTPS: connection established with 192.18.191.131:3128 (booking-service.com)
[proxy:debug] [pid 21616:tid 140692231767808] proxy_util.c(2677): AH00948: CONNECT: sending the CONNECT request for booking-service.com:443 to the remote proxy 192.18.191.131:3128 (remote-proxy.net)
[proxy:debug] [pid 21616:tid 140692231767808] proxy_util.c(2731): AH00949: send_http_connect: response from the forward proxy: HTTP/1.1 200 Connection establishedrnrn
[proxy:debug] [pid 21616:tid 140692231767808] proxy_util.c(3218): AH00962: HTTPS: connection complete to 192.18.191.131:3128 (remote-proxy.net)
[proxy:error] [pid 21616:tid 140692231767808] (20014)Internal error (specific information not available): [client 111.222.33.444:20435] AH01084: pass request body failed to 192.18.191.131:3128 (remote-proxy.net)
[proxy:error] [pid 21616:tid 140692231767808] [client 111.222.33.444:20435] AH00898: Error during SSL Handshake with remote server returned by /booking/test-request
[proxy_http:error] [pid 21616:tid 140692231767808] [client 111.222.33.444:20435] AH01097: pass request body failed to 192.18.191.131:3128 (remote-proxy.net) from 111.222.33.444 ()
[proxy:debug] [pid 21616:tid 140692231767808] proxy_util.c(2334): AH00943: HTTPS: has released connection for (booking-service.com)
 

Error Logs With ssl:trace7

I get the following for both web servers:

 [ssl:trace3] [pid 25298:tid 140395937773312] ssl_engine_kernel.c(2180): [remote 192.18.191.131:3128] OpenSSL: Handshake: start
[...]
[ssl:trace3] [pid 25298:tid 140395937773312] ssl_engine_kernel.c(2189): [remote 192.18.191.131:3128] OpenSSL: Loop: before/connect initialization
[ssl:trace4] [pid 25298:tid 140395937773312] ssl_engine_io.c(2214): [remote 192.18.191.131:3128] OpenSSL: write 517/517 bytes to BIO#7fb05c009ba0 [mem: 7fb05c011070] (BIO dump follows)
[ssl:trace7] [pid 25298:tid 140395937773312] ssl_engine_io.c(2137): [remote 192.18.191.131:3128]  ------------------------------------------------------------------------- 
[ssl:trace7] [pid 25298:tid 140395937773312] ssl_engine_io.c(2175): [remote 192.18.191.131:3128] | 0000: 16 03 01 02 00 01 00 01-fc 03 03 c5 c2 b9 30 65  ..............0e |
[...]
[ssl:trace7] [pid 25298:tid 140395937773312] ssl_engine_io.c(2175): [remote 192.18.191.131:3128] | 0140: 03 00 0f 00 01 01 00 15-00 bb                    ..........       |
[ssl:trace7] [pid 25298:tid 140395937773312] ssl_engine_io.c(2179): [remote 192.18.191.131:3128] | 0517 - <SPACES/NULS>
[ssl:trace7] [pid 25298:tid 140395937773312] ssl_engine_io.c(2181): [remote 192.18.191.131:3128]  ------------------------------------------------------------------------- 
[ssl:trace3] [pid 25298:tid 140395937773312] ssl_engine_kernel.c(2189): [remote 192.18.191.131:3128] OpenSSL: Loop: SSLv2/v3 write client hello A
[ssl:trace4] [pid 25298:tid 140395937773312] ssl_engine_io.c(2214): [remote 192.18.191.131:3128] OpenSSL: read 7/7 bytes from BIO#7fb05c00cc70 [mem: 7fb05c0165d0] (BIO dump follows)
[ssl:trace7] [pid 25298:tid 140395937773312] ssl_engine_io.c(2137): [remote 192.18.191.131:3128]  ------------------------------------------------------------------------- 
[ssl:trace7] [pid 25298:tid 140395937773312] ssl_engine_io.c(2175): [remote 192.18.191.131:3128] | 0000: 16 03 03 00 41 02                                ....A.           |
[ssl:trace7] [pid 25298:tid 140395937773312] ssl_engine_io.c(2179): [remote 192.18.191.131:3128] | 0007 - <SPACES/NULS>
[ssl:trace7] [pid 25298:tid 140395937773312] ssl_engine_io.c(2181): [remote 192.18.191.131:3128]  ------------------------------------------------------------------------- 
[ssl:trace4] [pid 25298:tid 140395937773312] ssl_engine_io.c(2214): [remote 192.18.191.131:3128] OpenSSL: read 63/63 bytes from BIO#7fb05c00cc70 [mem: 7fb05c0165da] (BIO dump follows)
[ssl:trace7] [pid 25298:tid 140395937773312] ssl_engine_io.c(2137): [remote 192.18.191.131:3128]  ------------------------------------------------------------------------- 
[ssl:trace7] [pid 25298:tid 140395937773312] ssl_engine_io.c(2175): [remote 192.18.191.131:3128] | 0000: 00 3d 03 03 f8 86 f8 5b-c5 71 0e 3f d6 fb 37 1d  .=.....[.q.?..7. |
[...]
[ssl:trace7] [pid 25298:tid 140395937773312] ssl_engine_io.c(2175): [remote 192.18.191.131:3128] | 0030: 00 00 00 00 0b 00 04 03-00 01 02 00 23           ............#    |
[ssl:trace7] [pid 25298:tid 140395937773312] ssl_engine_io.c(2179): [remote 192.18.191.131:3128] | 0063 - <SPACES/NULS>
[ssl:trace7] [pid 25298:tid 140395937773312] ssl_engine_io.c(2181): [remote 192.18.191.131:3128]  ------------------------------------------------------------------------- 
[ssl:trace3] [pid 25298:tid 140395937773312] ssl_engine_kernel.c(2189): [remote 192.18.191.131:3128] OpenSSL: Loop: unknown state
[ssl:trace4] [pid 25298:tid 140395937773312] ssl_engine_io.c(2214): [remote 192.18.191.131:3128] OpenSSL: read 5/5 bytes from BIO#7fb05c00cc70 [mem: 7fb05c026da3] (BIO dump follows)
[ssl:trace7] [pid 25298:tid 140395937773312] ssl_engine_io.c(2137): [remote 192.18.191.131:3128]  ------------------------------------------------------------------------- 
[ssl:trace7] [pid 25298:tid 140395937773312] ssl_engine_io.c(2175): [remote 192.18.191.131:3128] | 0000: 16 03 03 0d ce                                   .....            |
[ssl:trace7] [pid 25298:tid 140395937773312] ssl_engine_io.c(2181): [remote 192.18.191.131:3128]  ------------------------------------------------------------------------- 
[ssl:trace4] [pid 25298:tid 140395937773312] ssl_engine_io.c(2214): [remote 192.18.191.131:3128] OpenSSL: read 3534/3534 bytes from BIO#7fb05c00cc70 [mem: 7fb05c026da8] (BIO dump follows)
[ssl:trace7] [pid 25298:tid 140395937773312] ssl_engine_io.c(2137): [remote 192.18.191.131:3128]  ------------------------------------------------------------------------- 
[ssl:trace7] [pid 25298:tid 140395937773312] ssl_engine_io.c(2175): [remote 192.18.191.131:3128] | 0000: 0b 00 0d ca 00 0d c7 00-07 12 30 82 07 0e 30 82  ..........0...0. |
[...]
[ssl:trace7] [pid 25298:tid 140395937773312] ssl_engine_io.c(2175): [remote 192.18.191.131:3128] | 0dc0: ca 5b e0 d5 f6 6c 23 9d-20 29 55 cd 3a c5        .[...l#. )U.:.   |
[ssl:trace7] [pid 25298:tid 140395937773312] ssl_engine_io.c(2181): [remote 192.18.191.131:3128]  ------------------------------------------------------------------------- 
 

The BAD web server does abruptly stop here, there is no «Certificate Verification» and no «Handshake: done», i.e. no further ssl:... log entries related to this client request.

In contrast, the GOOD web server does the following:

 [ssl:debug] [pid 9659:tid 140475999237888] ssl_engine_kernel.c(1738): [remote 192.18.191.131:3128] AH02275: Certificate Verification, depth 1, CRL checking mode: none (0) [subject: CN=...]
[ssl:debug] [pid 9659:tid 140475999237888] ssl_engine_kernel.c(1738): [remote 192.18.191.131:3128] AH02275: Certificate Verification, depth 0, CRL checking mode: none (0) [subject: CN=...]
[...]
[ssl:trace3] [pid 9659:tid 140475999237888] ssl_engine_kernel.c(2184): [remote 192.18.191.131:3128] OpenSSL: Handshake: done
[...]
 

Failed Experiments

Что я пробовал до сих пор:

  • Добавление следующих настроек (даже если другой веб-сервер работает без них, я знаю… Я в отчаянии :D):
 SSLProxyVerify none
SSLProxyCheckPeerCN off
SSLProxyCheckPeerName off
SSLProxyCheckPeerExpire off
SSLProxyProtocol all -SSLv2 -SSLv3 -TLSv1
SSLProxyCACertificateFile /etc/ssl/certs/<the-ca-cert>.crt [afaik should be considered anyway b/c in /etc/ssl/certs]
 
  • Перезапуск службы apache2.
  • Перезапуск всей машины Linux
  • Запрос с завитком: работает!
    • curl --request POST 'https://booking-service.com/api/test-request' --header 'Content-Type: application/json' --header 'X-Api-Key: ...' --proxy 'http://remote-proxy.net:3128' --data '@/tmp/request-body.txt' -iv
  • Отладка с помощью openssl: выглядит хорошо и одинаково для обоих серверов
    • openssl-1_1 s_client -connect booking-service.com -proxy remote-proxy.net:3128 -state -debug

Версии приложений (одинаковые на обоих серверах)

  • Linux: lsb_release -a :
 LSB Version:    n/a
Distributor ID: SUSE
Description:    SUSE Linux Enterprise Server 12 SP5
Release:        12.5
Codename:       n/a
 
  • Apache: httpd -v :
 Server version: Apache/2.4.38 (Linux/SUSE)
Server built:   2019-02-08 01:59:10.000000000  0000
 
  • OpenSSL: openssl version :
 OpenSSL 1.0.2p-fips  14 Aug 2018
 

Ответ №1:

Я бы проверил, что сертификаты TLS/SSL одинаковы на всех серверах.

По умолчанию httpd генерирует самозаверяющий сертификат при каждой установке.

Крайне важно, чтобы все серверы/хосты в кластере связи TLS имели одинаковые сертификаты, чтобы доверять друг другу.

Я предлагаю скопировать закрытый ключ и открытый сертификат с хоста №1 на другие хосты.

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

1. Спасибо за идею! Но сертификаты одинаковы на обоих серверах. Проверил соответствующие каталоги сертификатов, а также проанализировал/подтвердил с помощью curl amp; openssl (просто добавил эту информацию к вопросу). Так что, если curl работает, я предполагаю, что в apache есть определенная настройка, которая заставляет mod_ssl использовать openssl таким образом, чтобы curl этого не делал — но опять же я помню, что дампы конфигурации apache обоих веб-серверов равны, поэтому в настройках apache не должно быть никаких различий!?