代理用户名和密码验证:如何连接并避免错误
采用用户名和密码验证时,应用程序会向代理发送服务商提供的凭据。代理核验后,允许你使用服务。在不同设备和网络中工作时,这种方式很有用:如果服务不同时要求 IP 授权,将脚本迁移到另一台服务器,无须修改获准 IP 地址。
要让连接正常工作,仅有用户名和密码还不够。还需要正确的代理地址、端口和协议,且应用程序必须支持所需的身份验证方式。因此,身份验证错误不一定表示密码有误。
关于访问方式的比较和选择,请参阅代理身份验证。本文介绍如何通过用户名和密码连接,从填写设置到排查运行中脚本的问题。
用户名和密码验证的含义
用户名用于标识账户或特定服务的访问身份,密码则用于确认你有权使用。检查通过后,代理会在已授予的权限范围内处理连接,包括可用地址列表、已购买的配额及适用限制。
不要把代理凭据与控制面板密码混为一谈。应用程序使用的凭据,可能不同于登录服务商网站的凭据。API 密钥用于向服务 API 发送请求,目标网站的密码则用于登录该网站。只有服务商明确规定相应连接方式时,才能将它们用作代理密码。
代理身份验证成功,不会让你自动登录目标网站。如果网站要求自己的账户、Cookie 或令牌,应用程序仍须另行提供。
这种方法何时有用
用户名和密码访问可供多个地点的应用程序使用,无论这些地点固定还是变化。没有 IP 限制时,每个应用程序只需凭据和代理连接设置,无须为其所在网络单独添加允许访问条目。
例如,一个团队分别在两个办公室和家中工作,每处的公网 IP 都不同。如果服务允许这些应用程序在不绑定 IP 的情况下共享凭据,它们就可以使用相同的代理凭据。每个应用程序保留各自的连接设置;代理检查它们各自发送的凭据。
这种方式也适用于多台长期使用的服务器。不过,设备数量、并发连接数和可用资源都取决于套餐。一个密码并不会赋予无限访问权限。
应用程序如何发送代理凭据
总体过程很简单:应用程序联系代理,通过访问检查,再通过代理访问所请求的资源。具体细节取决于协议。
HTTP 代理可能先返回 407 Proxy Authentication Required,并说明它接受的身份验证方式。应用程序通过 Proxy-Authorization 请求头发送身份验证信息。有些客户端会立即发送这些信息,因此日志中可能不会出现最初的质询。
通过普通 HTTP 代理打开 HTTPS 网站时,身份验证可以在建立隧道的 CONNECT 请求期间完成。随后,应用程序与网站建立安全连接。通过已建立的隧道继续向网站发送请求时,不会重复打开隧道时使用的代理登录。
对于 SOCKS5,用户名和密码在连接开始时、请求连接目标之前进行检查。如果检查失败,应用程序就无法通过代理获得所请求的连接。原生 SOCKS5 身份验证失败并不是 HTTP 407 响应。
应选择服务支持的协议和身份验证方式。SOCKS4 有用户 ID 字段,但并未定义 SOCKS5 的用户名和密码交换方式。填写该字段,不能让 SOCKS4 客户端执行 SOCKS5 密码验证。
在应用程序中应填写哪些设置
先查看你所用具体服务的连接详情。如果应用程序提供独立字段,应将每个值填入对应字段:
| 设置项 | 填写内容 | 检查事项 |
|---|---|---|
| 协议 | 按照服务说明选择 HTTP、HTTPS 或 SOCKS5。 | 应用程序中选择的协议必须与到代理的连接相匹配。 |
| 代理地址 | 所提供代理或网关的 IP 地址或主机名。 | 使用代理地址,而不是你自己的 IP 或目标网站的地址。 |
| 端口 | 连接详情中提供的端口号。 | 不要擅自换成你熟悉的数字:不同协议或访问模式可能使用不同端口。 |
| 用户名 | 该服务的用户名。 | 保留提供字符串中的大小写、分隔符和所有附加参数。 |
| 密码 | 代理访问密码。 | 完整复制,不要添加空格、换行或引号。 |
有些应用程序接受格式为 protocol://username:password@host:port 的单个字符串。例如,在 http://client01:River%[email protected]:8080 中,用户名为 client01,密码为 River@2026,主机为 proxy.example,端口为 8080。密码中的 @ 写为 %40,以免与主机前的分隔符混淆。
例如,curl 支持以这种方式解析代理 URL。单独的密码字段通常要求输入密码本身,而不进行 URL 编码。在检查格式之前,不要将 URL 中已编码的值复制到单独字段中:应用程序可能会把它当作另一个密码。对于含有 %、冒号或其他特殊字符的字符串,应遵循客户端本身的格式要求。
只对凭据中需要编码的字符编码一次;对整个字符串编码会破坏分隔符。为命令参数加引号不能代替 URL 编码。身份验证方式本身也可能有限制:例如,HTTP Basic 允许密码包含冒号,但不允许用户名包含冒号。
导入格式也不尽相同。host:port:username:password 与 username:password@host:port 不能互换。如果导入工具要求另一种排列方式,即使各项值正确,顺序错误也无法使用。
代理 URL 中的 http:// 前缀描述客户端如何连接代理本身。它不会阻止访问 HTTPS 网站:客户端可以为其建立隧道。仅将前缀改为 https://,不会使服务器增加安全代理连接支持。
有些服务会在用户名中包含国家、出口组或会话参数。应复制整个字符串。这些参数按照服务商规则控制路由;不要自行编造语法,也不要借用其他服务的语法。
为什么要检查应用程序的身份验证支持
支持代理与支持代理身份验证是不同的能力。提供主机和端口字段,并不一定意味着客户端能够发送用户名和密码。
检查代理协议、身份验证方式和应用程序这一具体组合。例如,Chrome 内置的 SOCKS5 实现不支持 SOCKS5 代理身份验证。仅有正确凭据无法解决该限制。用于选择代理的扩展程序,也不一定能补上缺少的验证方式。
在脚本中,支持情况可能取决于所用库、可选组件及设置的传入方式。应用程序不一定会使用系统代理设置,也不一定会使用已经能够连接的浏览器设置。
启动大规模任务前,应在实际执行任务的应用程序中测试一个请求。确认应用程序使用了指定代理,并且失败后没有继续改用直连。页面成功加载,本身不能证明设置正确。
你的 IP 变化后会怎样
使用动态 IP 的 ADSL 连接,在路由器重启或重新连接后,互联网服务商可能分配新地址。如果代理只检查用户名和密码,应用程序仍使用原有凭据连接,无须在控制面板中添加新 IP。从办公室转到家庭网络时也一样。
不过,更换网络可能中断现有连接。客户端需要重新连接,尚未完成的请求可能需要重试。从 Wi-Fi 切换到移动网络后立即出现错误,不应自动认定为密码问题。
有些服务同时检查凭据和源地址。正确密码不能绕过这种网络限制:新 IP 必须与获准地址或范围匹配。迁移脚本前,应确定服务是否接受来自任意网络的连接,还是执行组合检查。
传输中的密码是否受到保护?
身份验证决定谁被允许访问。加密决定传输路径上的人能否读取传送的数据。仅有密码,本身并不会让连接加密。
HTTP Basic 使用 Base64 对用户名和密码编码。这是一种可逆表示方式,不是加密。如果到代理的连接没有保护,监视该网络路径的人就可能获取凭据。标准 SOCKS5 用户名和密码验证也不会加密凭据的传输。
目标网站的 HTTPS 保护的是应用程序与该网站之间的连接。使用 HTTP 代理时,隧道建立过程中的身份验证发生得更早;网站的 TLS 无法保护已经发送的代理凭据。同样,通过 SOCKS5 发送 HTTPS 请求,也不会加密此前进行的代理密码检查。
要保护这段路径,就必须保护应用程序与代理之间的连接,例如在服务和客户端都支持时,使用通过 TLS 连接的 HTTPS 代理。应用程序必须验证代理证书。有些销售列表中的“HTTPS 代理”仅表示能够访问 HTTPS 网站,因此要确认 TLS 实际保护的是哪一段。
如果包含有效密码的完整连接字符串泄露,其他人可能在服务规则允许的范围内使用服务,消耗配额或占用连接。如果代理凭据与控制面板凭据独立,这不等于对方获得了控制面板密码。身份验证方式也不能保证地址不会被识别为代理:外部可访问的身份验证质询可能暴露该服务。
多个应用程序能否使用相同凭据?
从技术上讲,多个客户端可以发送相同用户名和密码。是否允许这样做,以及共享条件、活动连接数上限、购买配额和其他附加限制,都由服务商决定。
例如,两个脚本可以使用同一个账户,却打开不同数量的连接。一个密码不等于一个连接。同样,启动十个进程,也不会让服务的总连接配额变成十倍。
凭据组数也不同于出口 IP 数量。一组用户名和密码可能允许访问静态代理列表,或由 IP 地址池提供出口的网关。网站看到的 IP,取决于选择的代理和服务的路由规则。
如果服务为不同应用程序或团队成员提供独立凭据,可以禁用其中一组而不更改其他凭据。如果共享一个密码,修改后就须更新所有使用它的应用程序。独立凭据也不意味着连接数或流量配额独立:应检查它们共享哪些限制。
代理为什么会拒绝用户名和密码
首先确定错误是谁返回的。HTTP 407 涉及代理身份验证;目标网站返回的 401 涉及该网站的访问权限。没有其他证据时,403 消息或超时不能确定代理密码是否正确。
| 现象 | 可能原因 | 检查事项 |
|---|---|---|
| 应用程序反复要求输入密码 | 凭据有误、保存了旧密码,或不支持相应身份验证方式。 | 检查该服务的凭据、所选方式,以及客户端保存的设置。首次 HTTP 407 可能只是正常的身份验证质询;关键在于下一次尝试的结果。 |
| 分别填写字段能用,导入字符串失败 | 字段顺序不同、包含特殊字符,或存在多余空格。 | 检查要求的导入格式,以及它如何处理用户名和密码中的字符。 |
| 一个应用程序能用,另一个不能用 | 第二个客户端缺少所需的协议或身份验证支持,或未使用提供的设置。 | 检查具体组合的支持情况和实际连接方式。在等同网络条件下比较测试结果。 |
| 迁移到服务器后无法访问 | 源 IP 变化、仍存在 IP 限制,或设置未一并迁移。 | 检查组合访问限制、新源地址,以及运行中进程的配置。 |
| 连接失败或立即关闭 | 主机或端口不可用、协议有误、连接被阻止,或服务拒绝连接。 | 检查提供的主机、端口、协议,以及客户端的准确消息。仅凭连接关闭,无法判断是否已经进入身份验证阶段。 |
| 以前能用,现在所有客户端都失败 | 密码变化、访问被禁用、服务到期,或配额耗尽。 | 检查服务状态和近期变更。服务商不一定将所有这些情况都报告为密码错误。 |
| 单个请求正常,负载上升后出现失败 | 连接数或请求限制,或客户端、服务过载。 | 检查并发量、适用限制和准确响应。修改凭据前,先降低负载并比较结果。 |
检查服务状态和剩余配额,然后在实际应用程序中使用提供的设置测试一个请求。如果失败,参照表格检查客户端支持、凭据格式和源 IP 限制,每次只改变一项设置。请求能够稳定成功后,再增加工作量,观察是否出现只有负载升高才会触发的限制。
如何在运行中的脚本里保存和更改凭据
将凭据与代码分开,存放在有访问控制的配置或运行环境的机密信息存储中。应用程序可以通过环境变量接收凭据,但环境变量本身不是加密。不要把正在使用的密码放入代码仓库或与他人共享的模板中。
日志通常需要记录代理主机和端口、连接结果以及错误码。完整连接字符串包含密码,写入日志前应将其隐去。使用命令行工具时,还要考虑:根据应用程序和系统的不同,机密信息可能留在命令历史中,或显示在进程参数里。
修改密码前,找出所有使用方:本地应用程序、服务器进程、定时任务和构建系统。修改后,更新它们的设置,并通过建立新连接进行测试。确认长期运行的进程也已读取新值;有些进程需要重启。
如果旧密码应当失效,应测试使用旧密码建立的新连接是否被拒绝。现有连接遵循服务本身的规则:修改密码不一定会立即关闭它们。需要紧急撤销访问时,应使用服务商支持的禁用访问方式。
组合验证:IP 和密码
采用组合验证时,代理检查两个条件:凭据,以及应用程序连接时的源地址。两者必须同时通过。仅有正确密码不能绕过 IP 限制。
ProxyCompass 静态套餐的组合模式使用 /24 子网。如果你有多个位于同一子网的公网 IPv4 地址,只需将其中一个添加到允许访问列表。该子网内的其他地址便可使用正确用户名和密码连接,无须为每个地址单独添加条目。
图中,应用程序的公网 IP 与白名单地址的前三段数字相同,因此能够凭有效凭据连接;子网外的地址无法通过网络检查,密码错误则即使在子网内也无法通过。相同子网中的其他客户端 IP 也能使用该条目。这适用于必须填写用户名和密码的应用程序。规则针对的是应用程序的公网 IP,而不是购买的代理出口 IP。
