Apt 代理设置未传输用户名/密码

Apt 代理设置未传输用户名/密码

在一台 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 配置将停止工作。

我希望这个解决方法对您有用(我无法自己测试),如果是这样,请记住在下次升级时撤消此操作。

相关内容