2014-09-02 95 views
0

此刻我试图改进我的tomcat知道如何。我试图用SSL建立tomcat。 这个想法是,我得到了/ app不需要任何授权的路径,以及需要基本身份验证的路径/ admin。我想它只是缺乏关于SSL的一般知识,我不知道会发生什么。Tomcat SSL https端口问题

当我使用url 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

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

看一看:
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元件。可以使用用户数据约束来要求在安全 约束中指定的受约束的URL模式和HTTP方法的所有 受保护传输层(例如HTTPS(基于SSL的HTTP))的层连接。运输保证的选项包括CONFIDENTIAL, INTEGRAL或NONE。如果指定CONFIDENTIAL或者INTEGRAL作为 安全约束,这通常意味着使用SSL需要 ,以及该类型的安全约束适用于Web资源集合在匹配URL模式的所有请求 而不是 只是登录对话框。

此外,我想端口8443不可用,因为你没有Tomcat配置为使用SSL。
在下面的链接,你可以找到一个很好的如何对关于在Tomcat配置SSL支持:

Apache Tomcat 7. SSL/TLS Configuration HOW-TO

--- EDIT(服务器。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会自动将请求重定向到此处指定的端口号 。

+0

端口8443可用时,我添加它。但是,我可以配置它在IM上使用https时自动切换端口吗? – NDY 2014-09-02 13:11:08

+0

@Andy我不确定我是否正确理解你的问题。更改为https时,您重定向到的端口是在连接器的redirectPort属性中配置的端口。你应该得到这样的网址:https:// localhost:8443/myapp/admin你可以发布你的server.xml配置吗? – 2014-09-02 13:24:42

+0

Ty为您提供帮助。我添加了server.xml。我猜你确实明白我的意思。当我添加8443到我的网址,它的作品。但是当我在将URL更改为/ admin后重定向到https://时,端口不会更改为8443. – NDY 2014-09-02 13:41:28