如何正确设置 squid3 作为 HTTPS 代理?

如何正确设置 squid3 作为 HTTPS 代理?

我正在尝试使用给出的教程将 squid3 设置为 HTTPS 代理这里。我已经在浏览器中正确设置了代理设置,当我尝试点击HTTP网站,我能够成功连接。但是,每当我点击HTTPS协议网站和我的以下错误/var/log/squid3/cache.log

2016/06/20 19:12:47|  NF getsockopt(SO_ORIGINAL_DST) failed on local=<local_ip_address>:3129 remote=<remote_ip_address>:55209 FD 8 flags=33: (92) Protocol not available

这是我的/etc/squid3/squid.conf文件(为简洁起见,删除了注释行):

auth_param basic program /usr/lib/squid3/basic_ncsa_auth /usr/etc/passwd
auth_param basic casesensitive off
auth_param basic credentialsttl 2 hours

acl user_auth proxy_auth REQUIRED

http_access allow user_auth

acl SSL_ports port 443
acl Safe_ports port 80          # http
acl Safe_ports port 21          # ftp
acl Safe_ports port 443         # https
acl Safe_ports port 70          # gopher
acl Safe_ports port 210         # wais
acl Safe_ports port 1025-65535  # unregistered ports
acl Safe_ports port 280         # http-mgmt
acl Safe_ports port 488         # gss-http
acl Safe_ports port 591         # filemaker
acl Safe_ports port 777         # multiling http
acl CONNECT method CONNECT

http_access allow localhost
http_access allow all
http_port 3127

https_port 3129 intercept ssl-bump generate-host-certificates=on dynamic_cert_mem_cache_size=4MB key=/etc/squid3/example.com.private cert=/etc/squid3/example.com.cert

ssl_bump server-first all
sslproxy_flags DONT_VERIFY_PEER
sslproxy_cert_error deny all
sslcrtd_program /usr/lib/squid3/ssl_crtd -s /var/lib/ssl_db -M 4MB sslcrtd_children 8 startup=1 idle=1
coredump_dir /var/spool/squid3

refresh_pattern ^ftp:           1440    20%     10080
refresh_pattern ^gopher:        1440    0%      1440
refresh_pattern -i (/cgi-bin/|\?) 0     0%      0
refresh_pattern (Release|Packages(.gz)*)$      0       20%     2880
refresh_pattern .               0       20%     4320

always_direct allow all

这是我的输出squid3 -v

Squid Cache: Version 3.3.8
 (Ubuntu)
configure options:  '--build=i686-linux-gnu' '--prefix=/usr' '--includedir=${prefix}/include' '--mandir=${prefix}/share/man' '--infodir=${prefix}/share/info' '--sysconfdir=/etc' '--localstatedir=/var' '--libexecdir=${prefix}/lib/squid3' '--srcdir=.' '--disable-maintainer-mode' '--disable-dependency-tracking' '--disable-silent-rules' '--datadir=/usr/share/squid3' '--sysconfdir=/etc/squid3' '--mandir=/usr/share/man' '--enable-inline' '--enable-async-io=8' '--enable-ssl' '--enable-ssl-crtd' '--enable-storeio=ufs,aufs,diskd,rock' '--enable-removal-policies=lru,heap' '--enable-delay-pools' '--enable-cache-digests' '--enable-underscores' '--enable-icap-client' '--enable-follow-x-forwarded-for' '--enable-auth-basic=DB,fake,getpwnam,LDAP,MSNT,MSNT-multi-domain,NCSA,NIS,PAM,POP3,RADIUS,SASL,SMB' '--enable-auth-digest=file,LDAP' '--enable-auth-negotiate=kerberos,wrapper' '--enable-auth-ntlm=fake,smb_lm' '--enable-external-acl-helpers=file_userip,kerberos_ldap_group,LDAP_group,session,SQL_session,unix_group,wbinfo_group' '--enable-url-rewrite-helpers=fake' '--enable-eui' '--enable-esi' '--enable-icmp' '--enable-zph-qos' '--enable-ecap' '--disable-translation' '--with-swapdir=/var/spool/squid3' '--with-logdir=/var/log/squid3' '--with-pidfile=/var/run/squid3.pid' '--with-filedescriptors=65536' '--with-large-files' '--with-default-user=proxy' '--enable-linux-netfilter' 'build_alias=i686-linux-gnu' 'CFLAGS=-g -O2 -fPIE -fstack-protector --param=ssp-buffer-size=4 -Wformat -Werror=format-security -Wall' 'LDFLAGS=-Wl,-Bsymbolic-functions -fPIE -pie -Wl,-z,relro -Wl,-z,now' 'CPPFLAGS=-D_FORTIFY_SOURCE=2' 'CXXFLAGS=-g -O2 -fPIE -fstack-protector --param=ssp-buffer-size=4 -Wformat -Werror=format-security'

我花了很多时间在 Google 上搜索这个错误,但找不到将 squid 配置为 HTTP 代理的解决方案。我该如何让它工作?

答案1

可能需要考虑使用http_port指令ssl-bump而不是https_port,因为您的浏览器已配置了代理(CONNECT 方法)。

拦截模式适用于透明代理(不需要浏览器设置),当数据包使用 iptables 自动转发到代理时,https_port指令用于拦截和处理到达代理的此类流量。

SSL 撞击: http://www.squid-cache.org/Doc/config/ssl_bump/

当在 上收到 CONNECT 请求 http_port(或在 上拦截新连接 https_port)时,将参考此选项,前提是该端口配置了 ssl-bump 标志。连接上的后续数据要么被视为 HTTPS 并解密,要么在 TCP 级别进行隧道传输而不解密,具体取决于第一个匹配的碰撞“操作”。

对于 ssl-bump 示例: http://wiki.squid-cache.org/ConfigExamples/Intercept/SslBumpExplicit

答案2

错误“NF getsockopt(SO_ORIGINAL_DST)”是 NAT 错误。它与加密无关。

由于您已将浏览器配置为明确使用代理:

  • 您没有拦截任何内容。使用“拦截”选项是错误的,会导致 NAT 错误。

  • 浏览器不会使用 TLS 连接代理。这就是 https_port 不合适的真正原因。

  • 浏览器将向代理的 3127 端口发送 CONNECT 消息。这些是需要“碰撞”的。

所以你需要做的就是移动将 ssl-bump 设置添加到您现有的 http_port 行。它应该变成这样:

http_port 3127 ssl-bump \
   生成主机证书=开启 \
   dynamic_cert_mem_cache_size=4MB \
   密钥=/etc/squid3/example.com.private \
   cert=/etc/squid3/example.com.cert

要正确设置 SSL-Bump,您还应该做以下几行:

sslproxy_flags DONT_VERIFY_PEER
 sslproxy_cert_error 全部拒绝

 always_direct 允许所有

它们弊大于利,甚至对于调试来说都毫无用处。

另外,请将您的代理升级到最新的上游版本。TLS 和 SSL-Bump 参与了一场快速变化的军备竞赛,以实现更好的安全性,并解密更好的安全性。使用比最新版本更旧的版本肯定会以某种方式遇到问题。Squid-3.3 特别存在与椭圆曲线和其他最新密码相关的问题,在使用 TLS 会话恢复时会中断,无法使用 SNI 绕过证书固定,生成 SHA-1 证书等。

相关内容