在一台 12.04 服务器机器上,我已将 Apt 配置为使用代理来获取其软件包。也就是说,在 中/etc/apt.conf.d/80proxy
,我有以下两行:
Acquire::http::Proxy "http://user:password@proxybox:8443/";
Acquire::https::Proxy "http://user:password@proxybox:8443/";
但是,当尝试执行时apt-get update
,我收到 HTTP 407(需要代理身份验证)。
进一步检查代理计算机上的日志和 TCP 转储,表明 URL 中配置的用户名和密码是未被传输。用户名和密码永远不会到达代理机器。
故障排除:
我已经验证这台机器可以通过执行 curl 来访问代理:
http_proxy='http://user:password@proxybox:8443/' curl google.com
我已确认我的密码不包含任何特殊字符。
我已经验证机器上没有其他代理设置。
grep -ri proxy /etc/profile*
不返回任何内容grep -ri proxy /etc/apt/*
只返回上述文件env | grep -i proxy
不返回任何内容
以下是使用 curl 尝试得到的 tcpdump 内容:
CONNECT apt.dockerproject.org:443 HTTP/1.1
Host: apt.dockerproject.org:443
Proxy-Authorization: Basic (redacted)
User-Agent: curl/7.22.0 (x86_64-pc-linux-gnu) libcurl/7.22.0 OpenSSL/1.0.1 zlib/1.2.3.4 libidn/1.23 librtmp/2.3
Proxy-Connection: Keep-Alive
并尝试使用 apt-get:
CONNECT apt.dockerproject.org:443 HTTP/1.1
Host: apt.dockerproject.org:443
User-Agent: Debian APT-CURL/1.0 (0.8.16~exp12ubuntu10.24)
Proxy-Connection: Keep-Alive
Cache-Control: max-age=0
请注意缺少 Proxy-Authorization 标头。
我如何才能遵守我在配置文件中定义的用户/密码设置?
答案1
据我所知,这是特定版本的 apt 的问题。我发现了这个错误报告https://bugs.launchpad.net/ubuntu/+source/apt/+bug/1087512. 原文作者提到
问题在于 https 传输在将代理字符串传递给 curl 之前会破坏代理字符串并剥离代理凭据。
我不确定您是否可以将 apt 升级到该报告中的修复版本(我无法判断它是否被移植到 12.04 及更早版本),但如果不行,您可以使用 rvolgers 的最后一条评论中的解决方法:
顺便说一下,在旧版本中有一个解决方法,允许代理身份验证与 https 一起工作,但不幸的是,一旦修复发布,它就会中断(这并不奇怪,因为它无耻地滥用了 apt 中过于宽容的 URI 解析器):
获取::http::proxy”http://用户名:密码@主机名:端口“;
获取::https::proxy”http://用户名:密码@用户名:密码@主机名:端口“;
(换句话说,仅为 https 代理复制用户名:密码@部分。)
再次强调,我不建议使用此功能,因为一旦此修复程序被反向移植,您的 apt 配置将停止工作。
我希望这个解决方法对您有用(我无法自己测试),如果是这样,请记住在下次升级时撤消此操作。