我在tomcat9(Linux)上部署了jenkins.war,并将其配置为http和https。
server.xml上的配置
<Connector port="8080" protocol="HTTP/1.1"
connectionTimeout="20000"
redirectPort="8443" />
<Connector port="8443" protocol="org.apache.coyote.http11.Http11NioProtocol"
maxThreads="150" SSLEnabled="true">
<SSLHostConfig>
<Certificate certificateKeystoreFile="conf/ssl/test.keystore"
type="RSA" certificateKeystorePassword="changeit"/>
</SSLHostConfig>
</Connector>
web.xml上的配置
<security-constraint>
<web-resource-collection>
<web-resource-name>HTTPSOnly</web-resource-name>
<url-pattern>/*</url-pattern>
</web-resource-collection>
<user-data-constraint>
<transport-guarantee>CONFIDENTIAL</transport-guarantee>
</user-data-constraint>
</security-constraint>
当jenkins没有托管的时候,我可以用上面的tomcat配置将http重定向到https。但是在部署了jenkins.war之后,将http重定向到https就不起作用了。
对于jenkins,将http重定向到https还需要进行其他配置更改吗?
2条答案
按热度按时间3bygqnnd1#
如果您在'$ Catalina _BASE/conf/web.xml'中添加了一个安全约束,则该约束将使用Servlet规范中定义的约束组合规则与Web应用程序中定义的任何约束合并。
默认情况下,Jenkins定义了以下安全约束:
Servlet规范中的相关规则是:
因此,Jenkins规则与您的规则相结合,结果是允许无保护的(http)连接。
可能的解决方案包括:
9q78igpj2#
根据answer from Mark Thomas中的注解,我尝试了两种不同的方法,这两种方法都对我有效。
这两种方法还需要您在问题中描述的更改。
接近一号
编辑Jenkins WAR中的安全约束。
为此,我让Tomcat分解
webapps
目录中的WAR,然后编辑webapps/jenkins/WEB-INF/web.xml
目录中的文件。接近二号
我创建了一个Tomcat valve,并将其创建为JAR文件,然后将其放置在Tomcat的主
lib
目录中。我在Tomcat中添加了一个阀门元件,以激活阀门。
具体操作步骤:
1.我使用的是Jenkins LTS(长期支持)的最新版本-版本2.346.3。因为此版本的Jenkins不支持
jakarta
包,所以我将其安装在Tomcat 9上(用于javax
包)。1.我创建了一个标准的Java库项目,它被打包到一个JAR中(而不是WAR)。
您可能需要针对您的Java版本调整编译器设置。
1.我创建了以下阀门类:
这会拦截请求URL并(如果需要)重定向到修改后的URL。
我将包含该类的JAR文件放在Tomcat
lib
主目录中。1.我创建了一个新的阀元素:
在我的例子中,我选择将这个值添加到Tomcat的
server.xml
文件的<host>
部分,这意味着这个值适用于所有进入该主机的请求(在我的例子中,是localhost
)。如果您希望影响所有流量,也可以将其放置在
<engine>
部分中。(You如果您希望对特定的Web应用程序进行更细粒度的控制,也可以将其放置在特定的
<context>
部分中。但这需要您自定义Jenkins安装,类似于方法一。)使用Tomcat valve将您与使用Tomcat作为Jenkins应用程序的容器联系在一起。但是您不需要对Jenkins进行任何更改。
当然,在升级Tomcat时,您需要记住重新应用这些定制。如果升级到Tomcat 10+,您还需要使用
jakarta
包而不是javax
包(使用相关版本的tomcat-catalina
依赖项)重新构建valve。