Apache и Golang (или nodejs, или springboot и т. д.) с SSLPROXYpass и HTTP2

Apache и Golang (или nodejs, или springboot и т. д.) с SSLPROXYpass и HTTP2

Мой вопрос касается «безопасности». Я полагаю, что этот вопрос также касается nodejs, springboot или чего-то еще, работающего на другом порту с Apache в качестве основного сервера.

Я пробую кое-что с приложением golang и http2/push

http2 нужен https

мое приложение golang включеноhttps://127.0.0.1:7072/ и http2 работает хорошо в этом плане

после многочисленных поисков вот мой виртуальный хост (локальный WAMP, все прокси-модули и http2 загружены), который РАБОТАЕТ, НО:

<VirtualHost mygolang:443>

DocumentRoot "c:/wamp64/www"
ServerName mygolang:443
ServerAdmin [email protected]
ErrorLog "c:/wamp64/bin/apache/apache2.4.27/logs/ssl_error.log"
TransferLog "c:/wamp64/bin/apache/apache2.4.27/logs/access.log"


SSLEngine on
SSLProxyEngine on
SSLProxyVerify none 
SSLProxyCheckPeerCN off
SSLProxyCheckPeerName off
SSLProxyCheckPeerExpire off


SSLCertificateFile "C:\wamp64\bin\apache\apache2.4.27\conf\cert\certificate.crt"
SSLCertificateKeyFile "C:\wamp64\bin\apache\apache2.4.27\conf\key/private.key"

<FilesMatch "\.(cgi|shtml|phtml|php)$">
    SSLOptions +StdEnvVars
</FilesMatch>
<Directory "c:/wamp64/www">
    SSLOptions +StdEnvVars
</Directory>


BrowserMatch "MSIE [2-5]" \
     nokeepalive ssl-unclean-shutdown \
     downgrade-1.0 force-response-1.0

CustomLog "C:\wamp64\bin\apache\apache2.4.27\logs\ssl_request.log" \
      "%t %h %{SSL_PROTOCOL}x %{SSL_CIPHER}x \"%r\" %b"

ProxyRequests On
ProxyPreserveHost On
ProxyVia full
<proxy>
    Order deny,allow
    Allow from all
  </proxy>

  ProxyPass        /  https://127.0.0.1:7072/
  ProxyPassReverse /  https://127.0.0.1:7072/
</VirtualHost> 

НО мой контрольный вопрос касается

SSLProxyVerify none 
SSLProxyCheckPeerCN off
SSLProxyCheckPeerName off
SSLProxyCheckPeerExpire off

если я его удалю, то в браузере будет 500:

Proxy Error
The proxy server could not handle the request GET /.

Reason: Error during SSL Handshake with remote server

Apache/2.4.27 (Win64) OpenSSL/1.1.0f PHP/7.1.9 Server at mygolang Port 443

Итак, что вы думаете? Удаление sslcheck - это проблема? Это еще одно элегантное решение для "у меня есть Apache, и я хочу сделать полное перенаправление, но сохранить домен на одном аккаунте на http2?"

решение1

ProxyPass        /  https://127.0.0.1

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

В дополнение: Насколько мне известно, ни Apache 2.4, ниnginxдаже поддержка HTTP/2 для обратных прокси-соединений ProxyPass в любом случае.

HTTP/2 требует TLS, но преимущества проявляются в основном в соединении между клиентом и сервером, а не в соединениях LAN с низкой задержкой или соединениях FastCGI/ProxyPass внутри самой системы, и обычно достаточно завершить HTTP/2 на вашем внешнем интерфейсе и взаимодействовать с вашими внутренними интерфейсами по протоколу HTTP/1.1.

Примечание: Apache httpd версии 2.5 имеетэкспериментальныйподдержка HTTP/2https://httpd.apache.org/docs/trunk/mod/mod_proxy_http2.html

HTTP/2 (TLS)

ProxyPass "/app" "h2://app.example.com"
ProxyPassReverse "/app" "https://app.example.com"

HTTP/2 (открытый текст)

ProxyPass "/app" "h2c://app.example.com"
ProxyPassReverse "/app" "http://app.example.com"

решение2

Несколько слов, которые можно добавить к ответу @HBruijn.

Вы проксируете на IP-адрес:

ProxyPass        /  https://127.0.0.1:7072/
ProxyPassReverse /  https://127.0.0.1:7072/

Редко (хотя и не невозможно), что сертификат содержит IP-адрес. Вот почему вы получаете ошибку сертификата и почему вам пришлось удалить проверки ошибок, чтобы это работало.

Я полностью согласен с @HBruijn, что использование HTTPS для прокси-соединения, особенно если оно находится на локальном хосте, не является необходимым.

Кроме того, это соединение осуществляется по протоколу HTTP/1.1, поскольку оно использует httpsпротокол mod_proxy_http. Apache (2.5/багажник и 2.4) позволяет Proxy Pass через HTTP/2, используя его с ( h2) или с HTTPS ( h2c). HTTP/2 не нуждается в HTTPS - он нужен только при использовании с браузером. Поэтому его можно использовать без HTTPS для соединений proxy pass. Однако даже h2 и h2c тогдане разрешать HTTP/2 Push на прокси-соединенияхтак что нет особой выгоды от использования этого вообще (тем более, что это все еще отмечено как экспериментальное). Рекомендуемый способ push из бэкэнда — использовать заголовки Link HTTP, что также можно сделать через соединения HTTP/1.1.

Итак, подведем итог: просто подключитесь по HTTP/1.1 без HTTPS, чтобы избежать необходимости отключать эти проверки. Вы по-прежнему можете push с внутреннего сервера, используя заголовки Link.

Связанный контент