Jenkins Windows节点Selenium测试IWA认证失败问题求助
问题分析与解决方案
可能导致Jenkins机器无法通过IWA的原因
- 代理配置拦截内网请求:Jenkins机器的注册表代理没有排除内网域名(
corp-name.com),Chrome会通过代理访问内网认证服务,而代理通常不会转发NTLM/Kerberos这类Windows认证凭证,直接导致IWA失败。本地机器无代理,请求直接走内网,所以正常。 - Chrome启动参数不完整:你只加了
--auth-server-whitelist,但IWA还需要其他关键参数,而且如果是通过Selenium启动Chrome,单独用命令行启动的参数不会被Selenium的Chrome实例继承,等于没生效。 - Jenkins服务账号权限不足:Jenkins默认可能用本地系统账号运行,这个账号没有域认证的权限,也没有访问内网认证服务的凭证缓存;而你本地是用自己的域账号登录,系统自动缓存了凭证,所以能自动过IWA。
- 凭证缓存缺失:本地机器有你的域登录凭证缓存,但Jenkins服务运行的账号没有对应的凭证,无法自动提交给认证服务。
可落地的解决方案
1. 排除内网域名的代理配置
不管是系统代理还是Chrome的代理,都要把*.corp-name.com加入代理例外列表:
- 如果是通过注册表配置的系统代理,找到对应的代理设置项(通常在
HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Internet Settings),修改ProxyOverride值,添加*.corp-name.com;。 - 或者在Chrome启动参数里添加
--proxy-bypass-list="*.corp-name.com",确保内网请求不走代理。
2. 给Selenium的Chrome实例配置完整的IWA参数
不要单独用命令行启动Chrome,而是在你的Selenium代码里把IWA相关参数加到ChromeOptions中,示例代码(Java为例):
ChromeOptions chromeOptions = new ChromeOptions(); // 允许指定域名使用IWA chromeOptions.addArguments("--auth-server-whitelist=*.corp-name.com"); // 允许Kerberos凭证委托(对域环境的IWA很关键) chromeOptions.addArguments("--auth-negotiate-delegate-whitelist=*.corp-name.com"); // 内网域名不走代理 chromeOptions.addArguments("--proxy-bypass-list=*.corp-name.com"); // 初始化驱动 WebDriver driver = new ChromeDriver(chromeOptions);
3. 修改Jenkins服务的运行账号
把Jenkins服务的运行账号换成有域权限的账号(能访问认证服务的域账号):
- 打开Windows服务管理器,找到Jenkins服务。
- 右键选择「属性」,切换到「登录」标签页。
- 选择「此账户」,输入你的域账号(格式
DOMAIN\username)和密码,点击确定。 - 重启Jenkins服务,这样Chrome会以这个域账号的身份运行,自动使用域凭证过IWA。
4. 预存认证凭证(备选方案)
如果上面的方法都不行,可以在Jenkins机器上用cmdkey命令预存认证服务的凭证:
cmdkey /add:auth-service-name.corp-name.com /user:DOMAIN\your-account /pass:your-password
注意:密码明文输入有安全风险,建议用Jenkins的凭证管理功能存储密码,再通过构建参数传递执行这个命令。
5. 通过组策略/注册表强制配置Chrome的IWA参数
如果Jenkins机器在企业域内,可以通过组策略或者注册表直接配置Chrome的IWA白名单:
- 注册表路径:
HKEY_LOCAL_MACHINE\SOFTWARE\Policies\Google\Chrome - 添加两个字符串值:
AuthServerWhitelist:值为*.corp-name.comAuthNegotiateDelegateWhitelist:值为*.corp-name.com
配置后重启Chrome生效。
内容的提问来源于stack exchange,提问作者Andrei
相关产品推荐
相关产品推荐

