我们可以访问需要客户端证书才能访问的远程 Web API(它是 PKI)。我想允许网络中的特定服务器/IP 访问此 API,而无需它们将客户端证书导入密钥库,并允许它们使用 http 而不是 https。我们不能使用反向代理方法,原因有几个,我不想深入讨论。
有没有办法从客户端到代理使用 http 通信,然后从那里使用 https(使用客户端证书)连接到服务器?我见过使用 SslBump 在 squid 中实现此目的的方法,但仅限于从客户端使用 https 时。我见过一些类似 Apache 的问题,但它们都使用 ProxyPass,根据这里Apache 模块 mod_proxy | apache.org仅适用于反向代理。
为了显示:
客户端配置为使用代理
mylocalproxy:8999
并调用http://pki.globalpki123.com/rest/代理 mylocalproxy 连接到https://pki.globalpki123.com/rest/并提供客户证书。
我愿意使用 squid、apache 或任何提供真正正向代理功能的 Web 服务器。
答案1
配置为正向代理的 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