SSLPROXYpass 및 HTTP2를 사용하는 Apache 및 Golang(또는 nodejs 또는 springboot 등)

SSLPROXYpass 및 HTTP2를 사용하는 Apache 및 Golang(또는 nodejs 또는 springboot 등)

내 질문은 "보안"에 관한 것입니다. 이 질문은 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를 제거하는 것이 문제입니까? "아파치가 있고 전체 리디렉션을 원하지만 http2의 한 계정에 도메인을 유지하고 싶습니다"에 대한 또 다른 우아한 솔루션입니까?

답변1

ProxyPass        /  https://127.0.0.1

TLS를 사용하여 다시 연결하는 것은 전혀 필요하지 않으며 이점도 거의 없습니다.로컬호스트.
TLS는 통신 도청을 방지하기 위해 전송 보안을 추가합니다.~ 사이시스템을 떠나지 않는 트래픽에는 둘 다 필요하지 않은 (상호) 인증을 제공합니다.

추가 : 내가 아는 한 Apache 2.4도 아니고nginx어쨌든 ProxyPass 역방향 프록시 연결에서는 HTTP/2도 지원합니다.

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"

답변2

@HBruijn의 답변에 추가할 몇 가지 사항입니다.

IP 주소로 프록시를 사용하고 있습니다.

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

인증서에 IP 주소가 포함되는 경우는 거의 없습니다(불가능하지는 않지만). 이것이 바로 인증서 오류가 발생하는 이유이며 이것이 작동하도록 오류 검사를 제거한 이유입니다.

나는 프록시 패스 연결에 HTTPS를 사용하는 것(특히 로컬 호스트에 있는 경우)이 불필요하다는 @HBruijn의 의견에 전적으로 동의합니다.

또한 이 연결은 mod_proxy_http 프로토콜을 사용하므로 HTTP/1.1을 통해 이루어집니다 https. 아파치(2.5/트렁크 그리고 2.4h2)는 ( ) 또는 HTTPS ( )와 함께 사용하여 HTTP/2를 통한 프록시 패스를 허용합니다 h2c. HTTP/2에는 HTTPS가 필요하지 않습니다. 브라우저에서 사용할 때만 HTTPS가 필요합니다. 따라서 프록시 통과 연결을 위해 HTTPS 없이 사용할 수 있습니다. 그러나 h2와 h2c도 그렇다면프록시 연결에서 HTTP/2 푸시를 허용하지 않습니다.따라서 이것을 사용하는 것에는 전혀 이점이 없습니다(특히 아직 실험적인 것으로 표시되어 있기 때문에). 백엔드에서 푸시하는 데 권장되는 방법은 HTTP/1.1 연결을 통해서도 수행할 수 있는 Link HTTP 헤더를 사용하는 것입니다.

요약하자면, 확인 확인을 끄지 않으려면 HTTPS 없이 HTTP/1.1을 통해 연결하기만 하면 됩니다. 링크 헤더를 사용하여 백엔드 서버에서 푸시할 수 있습니다.

관련 정보