我jenkins.war部署在Tomcat 9(Linux)上,并将其配置为超文本传输协议和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。但在部署詹金斯之后。war将http重定向到https不起作用。
对于jenkins,将http重定向到https还需要其他配置更改吗?
根据马克·托马斯的回答,我尝试了两种不同的方法,这两种方法都对我有效。
这两种方法还需要您在问题中已经描述的更改。
接近一号
编辑JenkinsWAR中的安全约束。
为此,我让Tomcat在< code>webapps目录中展开WAR,然后在< code > WEB apps/Jenkins/we b-INF/WEB . XML 中编辑该文件。我注释掉了下面的部分:
<!-- commented out this part...
<security-constraint>
<web-resource-collection>
<web-resource-name>other</web-resource-name>
<url-pattern>/*</url-pattern>
</web-resource-collection>
-->
<!-- no security constraint -->
<!-- ...and this part </security-constraint> -->
方法二
我创建了一个Tomcat阀门,我将其创建为JAR文件,然后将其放置在Tomcat的mainlib
目录中。
我在Tomcat中添加了一个阀门元素来激活阀门。
具体步骤:
>
我使用了最新版本的Jenkins LTS(长期支持)-版本2.346.3。因为这个版本的Jerkins不支持jakarta
包,所以我在Tomcat 9上安装了它(用于javax
包)。
我创建了一个标准的Java库项目,一个打包到JAR(而不是WAR)中的项目。The Maven POM:
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>org.ajames.tomcathttpsvalve</groupId>
<artifactId>TomcatHttpsValve</artifactId>
<version>1.0-SNAPSHOT</version>
<packaging>jar</packaging>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<maven.compiler.source>17</maven.compiler.source>
<maven.compiler.target>17</maven.compiler.target>
<exec.mainClass>org.ajames.tomcathttpsvalve.TomcatHttpsValve</exec.mainClass>
</properties>
<dependencies>
<dependency>
<groupId>org.apache.tomcat</groupId>
<artifactId>tomcat-catalina</artifactId>
<version>9.0.65</version>
</dependency>
</dependencies>
</project>
您可能需要针对您的Java版本调整编译器设置。
package org.ajames.tomcathttpsvalve;
import java.io.IOException;
import javax.servlet.ServletException;
import org.apache.catalina.connector.Request;
import org.apache.catalina.connector.Response;
import org.apache.catalina.valves.ValveBase;
// In server.xml:
// <Valve className="org.ajames.tomcathttpsvalve.TomcatHttpsValve"
// fromPort="8080" toPort="8443" />
//
// This class is packaged as a JAR & placed in Tomcat's /lib
public class TomcatHttpsValve extends ValveBase {
private final String fromScheme = "http";
private final String toScheme = "https";
private final int httpsDefaultPort = 443;
private int fromPort; // see valve config for value
private int toPort; // see valve config for value
public TomcatHttpsValve() {
super(true); // async supported
}
@Override
public void invoke(Request req, Response resp) throws IOException, ServletException {
if (req.getScheme().toLowerCase().equals(toScheme)) {
// already using https:
getNext().invoke(req, resp);
} else {
// need to redirect to https:
resp.sendRedirect(buildNewReqUrl(req));
}
}
private String buildNewReqUrl(Request req) {
String scheme = req.getScheme();
int port = req.getServerPort();
if (scheme.toLowerCase().equals(fromScheme)) {
scheme = toScheme;
}
if (port == fromPort) {
port = toPort;
}
// build the new URL
// assumes no userinfo (...//john.doe@...)
StringBuilder sb = new StringBuilder();
sb.append(scheme).append("://").append(req.getServerName());
if (port != httpsDefaultPort) { // 443 is implicit with https
sb.append(":").append(port);
}
sb.append(req.getRequestURI()); // (e.g. /foo/bar)
if (req.getQueryString() != null) {
sb.append("?").append(req.getQueryString());
}
return sb.toString();
}
public int getFromPort() {
return fromPort;
}
public void setFromPort(String fromPort) {
this.fromPort = Integer.parseInt(fromPort);
}
public int getToPort() {
return toPort;
}
public void setToPort(String toPort) {
this.toPort = Integer.parseInt(toPort);
}
}
这会拦截请求URL并(如果需要)重定向到修改后的URL。
我将包含此类的JAR文件放在Tomcat lib
主目录中。
<Valve className="org.ajames.tomcathttpsvalve.TomcatHttpsValve"
fromPort="8080" toPort="8443" />
在我的例子中,我选择将其添加到
您也可以将其放在
(您也可以将其放在特定的
使用Tomcat阀门会使您将Tomcat用作Jenkins应用程序的容器。但您不需要对Jenkins进行任何更改。
当然,在升级Tomcat时,您确实需要记住重新应用这些定制。如果升级到Tomcat 10,您还需要使用
jakarta
包而不是javax
包(带有
dependency的相关版本)重新构建阀门。
如果向$CATALINA_BASE/conf/web.xml添加安全约束,则该约束将使用Servlet规范中定义的约束组合规则与Web应用程序中定义的任何约束组合。
Jenkins默认定义了以下安全约束:
<security-constraint>
<web-resource-collection>
<web-resource-name>other</web-resource-name>
<url-pattern>/*</url-pattern>
</web-resource-collection>
<!-- no security constraint -->
</security-constraint>
Servlet规范中的相关规则是:
The combination of user-data-constraints that apply to a common url-
pattern and http-method shall yield the union of connection types accepted by
the individual constraints as acceptable connection types. A security constraint that
does not contain a user-data-constraint shall combine with other user-data-
constraint to cause the unprotected connection type to be an accepted connection
type.
因此,Jenkins规则与您的规则相结合,结果是允许未受保护的(超文本传输协议)连接。
可能的解决方案包括:
环境Centos与apache 正在尝试设置从http到https的自动重定向 我试图添加以下内容到我的httpd.conf但它不工作 有什么想法吗?
我有一个正在运行的tomcat应用程序,它已经具有以下从HTTP到HTTPs的重定向规则: 是否可以添加一个例外/规则,将特定的http request(http://www . example . com)重定向到另一个特定的地址,并指定一个端口(比如https://www . example . com:8443/test),而不更改/删除上述连接器?
我创建了一个简单的应用程序,该应用程序由keyclope服务器进行身份验证。我已经在同一台机器上测试了应用程序和keydropage服务器,该应用程序运行良好,并将我重定向到keydropage进行相应的领域客户端身份验证。现在我已经为我的Keyclope保留了一个单独的服务器(https://192.162.10.11:8443)我的Spring Boot正在本地主机上运行。但一旦我尝试访问该服
我试图使用Eclipse(MARS)、TOmcat 8.x和Jersey 2.2.2构建一个Rest服务 我已经创建了这么多链接,或者我已经导入了项目本身。但是当我在服务器上运行项目时,我总是得到404找不到。 Apache.catalina.core.ApplicationContext日志信息:将servlet jersey-serlvet标记为不可用Apache.catalina.core.
我使用的是 Java 7、Spring靴 1.1.7 和一个带有嵌入式的 Tomcat 7。 过去,当我使用独立Tomcat时,我会添加一个http连接器,将请求重定向到HTTPS端口: 当我使用嵌入的Tomcat(我没有服务器.xml文件)时,我该怎么做?
我们使用拉维5。要将http连接重定向到https,请使用中间件HttpsProtocol。 在我们的4个测试用例中,只有1个正确工作(最后一个重定向)。其他3种情况的中间件添加了url extra index.php。 http://www.aqualink.az/index.php ---