当前位置: 首页 > 知识库问答 >
问题:

将 HTTP 重定向到 HTTPS for Jenkins 托管在 Tomcat 服务器上?

危钱明
2023-03-14

我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还需要其他配置更改吗?

共有2个答案

冯开诚
2023-03-14

根据马克·托马斯的回答,我尝试了两种不同的方法,这两种方法都对我有效。

这两种方法还需要您在问题中已经描述的更改。

接近一号

编辑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的相关版本)重新构建阀门。

  • 孙胜泫
    2023-03-14

    如果向$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规则与您的规则相结合,结果是允许未受保护的(超文本传输协议)连接。

    可能的解决方案包括:

    • 从jenkins.war打包的web.xml文件中移除安全约束
    • 从jenkins.war打包的web.xml文件中编辑安全约束
    • 部署自定义Valve或Filter以强制重定向
     类似资料:
    • 环境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 ---