2014-09-02 144 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