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

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 admin@example.com
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?»

ProxyPass        /  https://127.0.0.1

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

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

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

Примечание. Apache httpd версии 2.5 имеет экспериментальный поддержка HTTP / 2 https://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"

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

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

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

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

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

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

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