SSLPROXYpass と HTTP2 を使用した Apache と Golang (または nodejs や springboot など)

SSLPROXYpass と HTTP2 を使用した Apache と Golang (または nodejs や springboot など)

私の質問は「セキュリティ」に関するものですが、この質問は、Apacheをプライマリサーバーとして別のポートで実行されているNode.jsやSpringbootなどにも当てはまると思います。

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

それで、どう思いますか? SSL チェックを削除すると問題になりますか? これは、「Apache を使用していて、完全なリダイレクトを行いながら、http2 の 1 つのアカウントでドメインを保持したい」という場合のもう 1 つのエレガントなソリューションですか?

答え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のサポート詳しくは、http://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。Apache (2.5/トランク そして 2.4h2) は、( ) または HTTPS ( ) と併用することで、HTTP/2 経由のプロキシ パスを許可しますh2c。HTTP/2 は HTTPS を必要としません。ブラウザーで使用する場合にのみ必要です。したがって、プロキシ パス接続では HTTPS なしで使用できます。ただし、h2 と h2c でもプロキシ接続でHTTP/2プッシュを許可しないしたがって、これを使用することによるメリットはあまりありません (特に、まだ実験的としてマークされているため)。バックエンドからプッシュするための推奨される方法は、Link HTTP ヘッダーを使用することです。これは、HTTP/1.1 接続でも実行できます。

まとめると、検証チェックをオフにする必要がないようにするには、HTTPS を使用せずに HTTP/1.1 経由で接続するだけです。Link ヘッダーを使用してバックエンド サーバーからプッシュすることもできます。

関連情報