web-dev-qa-db-ja.com

フォワードプロキシはhttpをhttpsに変換します

アクセスするにはクライアント証明書を必要とするリモートWeb APIにアクセスできます(PKIです)。クライアント証明書をキーストアにインポートし、httpsではなくhttpを使用できるようにすることなく、ネットワーク内の特定のサーバー/ IPに対してこのAPIへのアクセスを許可します。私がやりたくない理由がいくつかあるため、リバースプロキシアプローチを使用できません。

クライアントからプロキシにhttpを話し、そこからhttps(クライアント証明書を使用)をサーバーに使用する方法はありますか? SslBumpを使用してSquidでこれを実現する方法を見てきましたが、クライアントからhttpsが使用されている場合のみです。私はApacheについてこのような質問をいくつか見ましたが、それらはすべてここでProxyPassを使用しています Apache Module mod_proxy | Apache.org はリバースプロキシ専用です。

説明する:

私はイカ、Apache、または実際のフォワードプロキシ機能を提供する任意のWebサーバーを使用できます。

2
dashambles

フォワードプロキシとして設定されたSquidサーバーは、クライアントからプレーンHTTPリクエストを受信し、HTTPSリクエストをアップストリームサーバーに透過的に転送できます。ただし、外部URL書き換えプログラムが必要です。

次のURL書き換えプログラムを/etc/squid/urlrewrite.plに書き込みます。

#!/usr/bin/Perl
select(STDOUT);
$| = 1;
while (<>) {
    if (/^(|\d+\s+)((\w+):\/+)([^\/:]+)(|:(\d+))(|\/\S*)(|\s.*)$/) {
        my $channel = $1;
        my $protocolClean = $3;
        my $domain = $4;
        my $port = $5;
        my $portClean = $6;
        my $urlPath = $7;
        if ($protocolClean eq 'http' && ($port eq '' || $portClean eq '80')) {
            print STDOUT "${channel}OK rewrite-url=\"https://${domain}${urlPath}\"\n";
        } else {
            print STDOUT "${channel}ERR\n";
        }
    }
}

次に、これらの構成パラメーターを/etc/squid/squid.confに追加します。

acl pkiRestDomain dstdomain -n pki.globalpki123.com
acl pkiRestUrlPath urlpath_regex ^/rest(|\/.*)$
url_rewrite_program /etc/squid/urlrewrite.pl
url_rewrite_access allow pkiRestDomain pkiRestUrlPath
sslproxy_client_certificate /etc/pki/squid/certs/mylocalproxy.crt
sslproxy_client_key /etc/pki/squid/private/mylocalproxy.key

Squidが使用するクライアント証明書の実際のパスに従って、sslproxy_client_certificateおよびsslproxy_client_keyを調整します。