Jenkins请求报403错误:无有效crumb,已试两种方案仍未解决
解决Jenkins接口403 "No valid crumb was included in the request"问题
先帮你梳理下当前的问题:你通过脚本调用Jenkins构建接口时遇到403错误,虽然已经成功获取到了crumb,但提交请求时还是提示无效crumb,并且尝试了代理兼容模式和关闭CSRF防护两种方案都没解决。
你的脚本与执行输出
你的crumb.sh脚本内容:
crumb=$(curl -u "jenkins:pwd" -s 'http://yuvi_jenkins:8080/crumbIssuer/api/xml?xpath=concat(//crumbRequestField,":",//crumb)') echo $crumb curl -u "jenkins:pwd" -H "$crumb" -X POST http://yuvi_jenkins:8080/job/ansible-project/build?delay=0sec
执行后输出:
Jenkins-Crumb:d3950e9f61bc9dd88fba532c17dba1ce220be11b92d78e720464afd38021a3fb <html> <head> <meta http-equiv="Content-Type" content="text/html;charset=utf-8"/> <title>Error 403 No valid crumb was included in the request</title> </head> <body><h2>HTTP ERROR 403</h2> <p>Problem accessing /job/ansible-project/build. Reason: <pre> No valid crumb was included in the request</pre></p><hr><a href="http://eclipse.org/jetty">Powered by Jetty:// 9.4.z-SNAPSHOT</a><hr/> </body> </html>
已尝试的方案
- 开启Jenkins全局安全设置中的"代理兼容模式"并重启
- 关闭"Prevent Cross Site Request Forgery exploits"防护
可能的原因与针对性解决方案
1. Crumb与请求的Host头不匹配(最常见)
Jenkins的crumb是和请求的Host主机标识绑定的,如果你获取crumb时用的是内部主机名yuvi_jenkins,但实际请求经过代理后,Jenkins收到的Host头是代理的域名/IP,两者不匹配就会导致crumb验证失败。
解决方法:
获取crumb和发送请求时,使用完全一致的Jenkins访问地址(和你通过代理访问的公网地址一致),比如替换成代理对外暴露的域名或IP:
# 替换成你的Jenkins公网访问地址 JENKINS_URL="http://jenkins.yourdomain.com:8080" crumb=$(curl -u "jenkins:pwd" -s "$JENKINS_URL/crumbIssuer/api/xml?xpath=concat(//crumbRequestField,:,//crumb)") echo $crumb curl -u "jenkins:pwd" -H "$crumb" -X POST "$JENKINS_URL/job/ansible-project/build?delay=0sec"
如果没有公网地址,也可以尝试在脚本中指定Host头,确保获取crumb和请求时的Host一致:
# 获取crumb时指定Host头 crumb=$(curl -u "jenkins:pwd" -H "Host: yuvi_jenkins" -s 'http://yuvi_jenkins:8080/crumbIssuer/api/xml?xpath=concat(//crumbRequestField,:,//crumb)') echo $crumb # 请求时也指定相同的Host头 curl -u "jenkins:pwd" -H "$crumb" -H "Host: yuvi_jenkins" -X POST http://yuvi_jenkins:8080/job/ansible-project/build?delay=0sec
2. 代理服务器未正确传递Host头
如果你使用Nginx、Apache等反向代理,检查代理配置是否正确传递了Host头给Jenkins。比如Nginx需要添加:
proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
配置修改后重启代理服务,再测试脚本。
3. 验证关闭CSRF防护是否真正生效
如果你已经关闭了"Prevent Cross Site Request Forgery exploits",但还是报错,可能是Jenkins重启不彻底,或者代理缓存了旧的配置。尝试:
- 彻底重启Jenkins服务(不是仅刷新网页)
- 清空代理服务器的缓存
- 绕过代理,直接在Jenkins服务器上执行脚本(用
localhost:8080作为地址),看是否能正常构建,以此排查是否是代理的问题。
内容的提问来源于stack exchange,提问作者Yogendra Singh Rathore
相关产品推荐
相关产品推荐

