我有一个 Jenkins 2.371 实例。为了安全起见,我已申请并实施了 SSL 证书。Jenkins UI 现在运行良好https://servername.domain.com/
问题出在代理上。我已经jks
使用 keytool 将证书链导入 jdk,因此证书完全没有问题。当我启动代理时,出现错误:
严重的:https://服务器名称.domain.com/tcpSlaveAgentListener/似乎正在发布无效的 X-Instance-Identity。java.io.IOException:https://服务器名称.domain.com/tcpSlaveAgentListener/似乎正在发布无效的 X-Instance-Identity。位于 org.jenkinsci.remoting.engine.JnlpAgentEndpointResolver.resolve(JnlpAgentEndpointResolver.java:284) 位于 hudson.remoting.Engine.innerRun(Engine.java:744) 位于 hudson.remoting.Engine.run(Engine.java:543)
因此,看起来服务器公布的 URL 不是代理所期望的。
出于参考目的(但不相关),将 jks 添加到 cacerts 存储区的 keytool 命令如下:
keytool -import -alias /tmp/jenkins.jks -cacerts -keypass 'Password' -file servername_domain_com.cer -storepass 'changeit'
至于代理启动。我agent.jar
再次下载了,因为移动到了https
通常的位置:
java -jar agent.jar -jnlpUrl https://servername.domain.com/computer/agenthostname/jenkins-agent.jnlp -secret @secret-file -workDir "/opt/jenkins"
代理启动包括jnlp
。我这样说是因为,我发现的有关类似错误的唯一文章指出jnlp
应该排除该路径,但遗憾的是,这没有什么意义,但我确实尝试了,但是代理现在只是重试连接,因为它没有得到预期的响应。
我没有任何反向代理设置,所以这也不是问题。
PS!! 我确实提取了该war
文件并查看了java
出现此错误的文件,但不幸的是,找到有用的帮助相当困难。
答案1
问题解决了。
我反编译了jenkins.war
导致错误的相关 java 文件,以帮助我调试原因。错误是由 java 文件JnlpAgentEndpointResolver.java
第 284 行生成的,如下所示。
try {
identity = getIdentity(idHeader);
if (identity == null) {
firstError = chain(firstError, new IOException( // The Error gets generated here
salURL + " appears to be publishing an invalid X-Instance-Identity."));
continue;
}
因此,我发现标题中没有该身份。
维护 RSA 公钥/私钥对至关重要。
因此,简单的解决方法是简单地安装为此提供的插件,称为Instance Identity