Tomcat SSL https端口问题

时间:2014-09-02 11:42:19

标签: tomcat ssl https basic-authentication

目前我试图改善我的tomcat知道如何。我试图用SSL设置tomcat。 我的想法是,我得到了/ app不需要任何授权的路径,以及路径/管理员,需要进行基础认证。我想它只是缺乏关于SSL的一般知识,我无法理解会发生什么。

当我使用网址http://localhost:8080/myapp/app/时,它可以正常显示我的网页。现在我将/ app更改为/ admin。之后,我的网址为https://localhost/myapp/admin并且它无法正常工作,因为缺少8443端口。我不明白为什么它会自动更改为https,但之后端口丢失了?我的问题是什么?如何解决?

非常感谢任何帮助:)

我的server.xml:

<Listener className="org.apache.catalina.core.AprLifecycleListener" SSLEngine="on"/>

<Listener className="org.apache.catalina.core.JasperListener"/>
<Listener className="org.apache.catalina.core.JreMemoryLeakPreventionListener"/>
<Listener className="org.apache.catalina.mbeans.GlobalResourcesLifecycleListener"/>
<Listener className="org.apache.catalina.core.ThreadLocalLeakPreventionListener"/>

<Service name="Catalina">

    <Connector port="8080" protocol="HTTP/1.1"
               connectionTimeout="20000"
            />

    <Connector port="8443" protocol="HTTP/1.1" SSLEnabled="true"
               maxThreads="150" scheme="https" secure="true"
               clientAuth="false" sslProtocol="TLS"
               keystoreFile="${catalina.home}/myapp.keystore"
               keystorePass="histackoverflow"/>

    <Connector port="8009" protocol="AJP/1.3" redirectPort="8443"/>

    <Engine name="Catalina" defaultHost="localhost">

        <Realm className="org.apache.catalina.realm.MemoryRealm" />

        <Host name="localhost" appBase="webapps"
              unpackWARs="true" autoDeploy="true">

            <Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs"
                   prefix="localhost_access_log." suffix=".txt"
                   pattern="%h %l %u %t &quot;%r&quot; %s %b"/>

        </Host>
    </Engine>
</Service>

我的web.xml看起来像这样:

<servlet>
    <servlet-name>MyApp REST Service</servlet-name>
    <servlet-class>com.sun.jersey.spi.container.servlet.ServletContainer</servlet-class>
    <init-param>
        <param-name>com.sun.jersey.config.property.packages</param-name>
        <param-value>main.ch.myapp.resource.app</param-value>
    </init-param>
    <init-param>
        <param-name>com.sun.jersey.api.json.POJOMappingFeature</param-name>
        <param-value>true</param-value>
    </init-param>
    <load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
    <servlet-name>Myapp REST Service</servlet-name>
    <url-pattern>/app-api/*</url-pattern>
</servlet-mapping>


<servlet>
    <servlet-name>MyApp Admin REST Service</servlet-name>
    <servlet-class>com.sun.jersey.spi.container.servlet.ServletContainer</servlet-class>
    <init-param>
        <param-name>com.sun.jersey.config.property.packages</param-name>
        <param-value>main.ch.myapp.resource.admin</param-value>
    </init-param>
    <init-param>
        <param-name>com.sun.jersey.api.json.POJOMappingFeature</param-name>
        <param-value>true</param-value>
    </init-param>

    <load-on-startup>1</load-on-startup>
</servlet>

<servlet-mapping>
    <servlet-name>MyApp Admin REST Service</servlet-name>
    <url-pattern>/admin-api/*</url-pattern>
</servlet-mapping>

<security-constraint>
    <web-resource-collection>
        <web-resource-name>MyApp Admin</web-resource-name>
        <url-pattern>/admin/*</url-pattern>
        <url-pattern>/admin-api/*</url-pattern>
    </web-resource-collection>
    <auth-constraint>
        <role-name>admin</role-name>
    </auth-constraint>
    <user-data-constraint>
        <transport-guarantee>CONFIDENTIAL</transport-guarantee>
    </user-data-constraint>
</security-constraint>
<login-config>
    <auth-method>BASIC</auth-method>
</login-config>

1 个答案:

答案 0 :(得分:1)

由于<transport-guarantee>CONFIDENTIAL</transport-guarantee>中包含<security-constraint>,因此对https的更改已完成。

看看:
The Java EE 6 Tutorial, Volume I. Specifying Security Constraints
The Java EE 6 Tutorial, Volume I. Specifying a Secure Connection

  

指定安全连接

     

用户数据约束(TutorialUser-data-constraint   部署描述符)包含transport-guarantee元素。一个   用户数据约束可用于要求受保护的传输   所有人都可以使用HTTPS连接(HTTP over SSL)等层连接   受约束的URL模式和安全性中指定的HTTP方法   约束。运输保障的选择包括CONFIDENTIAL,   INTEGRAL,或无。如果指定CONFIDENTIAL或INTEGRAL作为   安全约束,它通常意味着使用SSL   必需,并且该类型的安全约束适用于所有请求   是否匹配Web资源集合中的URL模式   只是登录对话框。

此外,我认为端口8443不可用,因为您没有将Tomcat配置为使用SSL。
在以下链接中,您可以找到有关在Tomcat上配置SSL支持的精彩方法:

Apache Tomcat 7. SSL/TLS Configuration HOW-TO

---编辑(server.xml配置已发布)---

要重定向到端口8443,您需要更改连接器配置,如下所示:

<Connector port="8080" protocol="HTTP/1.1"
    connectionTimeout="20000"
    redirectPort="8443" />

Apache Tomcat 7. The AJP Connector

  

redirectPort

     

如果此连接器支持非SSL请求,并且请求是   已收到匹配的security-constraint需要SSL   运输时,Catalina会自动将请求重定向到   这里指定的端口号。