?
以前一直在用Tomcat 6.0.29版本,今下載了apache-tomcat-7.0.33-windows-x86.zip試試,結果在配置SSL時遇到一些問題。
Tomcat 6版本配置SSL過程有兩步:
1、用JDK自帶的keytool.exe來生成私有密鑰和自簽發的證書,如下:
設置好就能正常啟動Tomcat了。
可是按同樣的方法來配置Tomcat 7卻啟動不起來,報如下錯誤:
Tomcat提供了兩個SSL實現,一個是JSSE實現,另一個是APR實現。
Tomcat將自動選擇使用哪個實現,即如果安裝了APR則自動選擇APR,否則選擇JSSE。
如果不希望讓Tomcat自動選擇,而是我們自己指定一個實現則可通過protocol定義,如下:
以前只聽說過APR但沒弄過。APR是什么文件?后來才發現APR文件名為tcnative-1.dll。進一步檢查6.0和7.0的安裝目錄,結果發現6.0里沒這個dll文件,而7.0里有。換句話說,6.0默認使用JSSE實現,而7.0默認使用APR實現。
弄明白緣由就好辦了。由于習慣使用6.0的配置方式(即JSEE實現),因此只要把上面conf\server.xml里的protocol修改一下就行了:
應用程序HTTP自動跳轉到HTTPS,解決如下,打開 項目的web.xml ,添加如下配置
Tomcat 6版本配置SSL過程有兩步:
1、用JDK自帶的keytool.exe來生成私有密鑰和自簽發的證書,如下:
- keytool -genkey -keyalg RSA -alias tomcat??
keytool -genkey -keyalg RSA -alias tomcat按提示輸入相關內容后,這條命令將在默認密鑰庫文件里新增一個別名為tomcat的私有密鑰項及其自簽發的證書。默認密鑰庫文件為:
- %USERPROFILE%\.keystore???
%USERPROFILE%\.keystore2、修改Tomcat的conf\server.xml文件,即增加下面一段:
- <Connector port= "8443" protocol= "HTTP/1.1" SSLEnabled= "true" ??????????? maxThreads= "150" scheme= "https" secure= "true" ??????????? clientAuth= "false" sslProtocol= "TLS" ??????????? keystoreFile= "${user.home}/.keystore" ??????????? keystorePass= "changeit" />??
<Connector port="8443" protocol="HTTP/1.1" SSLEnabled="true" maxThreads="150" scheme="https" secure="true" clientAuth="false" sslProtocol="TLS" keystoreFile="${user.home}/.keystore" keystorePass="changeit" />這里的${user.home}就是上面的%USERPROFILE%,只是一個是Java語法,另一個是Windows語法。
設置好就能正常啟動Tomcat了。
可是按同樣的方法來配置Tomcat 7卻啟動不起來,報如下錯誤:
- 嚴重: Failed to initialize end point associated with ProtocolHandler [ "http-apr-8443" ]? java.lang.Exception: Connector attribute SSLCertificateFile must be defined when using SSL with APR????????? at org.apache.tomcat.util.net.AprEndpoint.bind(AprEndpoint.java: 494 )????????? at org.apache.tomcat.util.net.AbstractEndpoint.init(AbstractEndpoint.java: 610 )????????? at org.apache.coyote.AbstractProtocol.init(AbstractProtocol.java: 429 )????????? at org.apache.catalina.connector.Connector.initInternal(Connector.java: 981 )????????? at org.apache.catalina.util.LifecycleBase.init(LifecycleBase.java: 102 )????????? at org.apache.catalina.core.StandardService.initInternal(StandardService.java: 559 )????????? at org.apache.catalina.util.LifecycleBase.init(LifecycleBase.java: 102 )????????? at org.apache.catalina.core.StandardServer.initInternal(StandardServer.java: 814 )????????? at org.apache.catalina.util.LifecycleBase.init(LifecycleBase.java: 102 )????????? at org.apache.catalina.startup.Catalina.load(Catalina.java: 633 )????????? at org.apache.catalina.startup.Catalina.load(Catalina.java: 658 )????????? at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)????????? at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java: 39 )????????? at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java: 25 )????????? at java.lang.reflect.Method.invoke(Method.java: 597 )????????? at org.apache.catalina.startup.Bootstrap.load(Bootstrap.java: 281 )????????? at org.apache.catalina.startup.Bootstrap.main(Bootstrap.java: 450 )? - 12 - 2 12 : 01 : 16 org.apache.catalina.core.StandardService initInternal? 嚴重: Failed to initialize connector [Connector[HTTP/ 1.1 - 8443 ]]? org.apache.catalina.LifecycleException: Failed to initialize component [Connector[HTTP/ 1.1 - 8443 ]]????????? at org.apache.catalina.util.LifecycleBase.init(LifecycleBase.java: 106 )????????? at org.apache.catalina.core.StandardService.initInternal(StandardService.java: 559 )????????? at org.apache.catalina.util.LifecycleBase.init(LifecycleBase.java: 102 )????????? at org.apache.catalina.core.StandardServer.initInternal(StandardServer.java: 814 )????????? at org.apache.catalina.util.LifecycleBase.init(LifecycleBase.java: 102 )????????? at org.apache.catalina.startup.Catalina.load(Catalina.java: 633 )????????? at org.apache.catalina.startup.Catalina.load(Catalina.java: 658 )????????? at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)????????? at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java: 39 )????????? at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java: 25 )????????? at java.lang.reflect.Method.invoke(Method.java: 597 )????????? at org.apache.catalina.startup.Bootstrap.load(Bootstrap.java: 281 )????????? at org.apache.catalina.startup.Bootstrap.main(Bootstrap.java: 450 )? Caused by: org.apache.catalina.LifecycleException: Protocol handler initialization failed????????? at org.apache.catalina.connector.Connector.initInternal(Connector.java: 983 )????????? at org.apache.catalina.util.LifecycleBase.init(LifecycleBase.java: 102 )????????? ... 12 more? Caused by: java.lang.Exception: Connector attribute SSLCertificateFile must be defined when using SSL with APR????????? at org.apache.tomcat.util.net.AprEndpoint.bind(AprEndpoint.java: 494 )????????? at org.apache.tomcat.util.net.AbstractEndpoint.init(AbstractEndpoint.java: 610 )????????? at org.apache.coyote.AbstractProtocol.init(AbstractProtocol.java: 429 )????????? at org.apache.catalina.connector.Connector.initInternal(Connector.java: 981 )????????? ... 13 more?
嚴重: Failed to initialize end point associated with ProtocolHandler ["http-apr-8443"] java.lang.Exception: Connector attribute SSLCertificateFile must be defined when using SSL with APR at org.apache.tomcat.util.net.AprEndpoint.bind(AprEndpoint.java:494) at org.apache.tomcat.util.net.AbstractEndpoint.init(AbstractEndpoint.java:610) at org.apache.coyote.AbstractProtocol.init(AbstractProtocol.java:429) at org.apache.catalina.connector.Connector.initInternal(Connector.java:981) at org.apache.catalina.util.LifecycleBase.init(LifecycleBase.java:102) at org.apache.catalina.core.StandardService.initInternal(StandardService.java:559) at org.apache.catalina.util.LifecycleBase.init(LifecycleBase.java:102) at org.apache.catalina.core.StandardServer.initInternal(StandardServer.java:814) at org.apache.catalina.util.LifecycleBase.init(LifecycleBase.java:102) at org.apache.catalina.startup.Catalina.load(Catalina.java:633) at org.apache.catalina.startup.Catalina.load(Catalina.java:658) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) at java.lang.reflect.Method.invoke(Method.java:597) at org.apache.catalina.startup.Bootstrap.load(Bootstrap.java:281) at org.apache.catalina.startup.Bootstrap.main(Bootstrap.java:450) -12-2 12:01:16 org.apache.catalina.core.StandardService initInternal 嚴重: Failed to initialize connector [Connector[HTTP/1.1-8443]] org.apache.catalina.LifecycleException: Failed to initialize component [Connector[HTTP/1.1-8443]] at org.apache.catalina.util.LifecycleBase.init(LifecycleBase.java:106) at org.apache.catalina.core.StandardService.initInternal(StandardService.java:559) at org.apache.catalina.util.LifecycleBase.init(LifecycleBase.java:102) at org.apache.catalina.core.StandardServer.initInternal(StandardServer.java:814) at org.apache.catalina.util.LifecycleBase.init(LifecycleBase.java:102) at org.apache.catalina.startup.Catalina.load(Catalina.java:633) at org.apache.catalina.startup.Catalina.load(Catalina.java:658) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) at java.lang.reflect.Method.invoke(Method.java:597) at org.apache.catalina.startup.Bootstrap.load(Bootstrap.java:281) at org.apache.catalina.startup.Bootstrap.main(Bootstrap.java:450) Caused by: org.apache.catalina.LifecycleException: Protocol handler initialization failed at org.apache.catalina.connector.Connector.initInternal(Connector.java:983) at org.apache.catalina.util.LifecycleBase.init(LifecycleBase.java:102) ... 12 more Caused by: java.lang.Exception: Connector attribute SSLCertificateFile must be defined when using SSL with APR at org.apache.tomcat.util.net.AprEndpoint.bind(AprEndpoint.java:494) at org.apache.tomcat.util.net.AbstractEndpoint.init(AbstractEndpoint.java:610) at org.apache.coyote.AbstractProtocol.init(AbstractProtocol.java:429) at org.apache.catalina.connector.Connector.initInternal(Connector.java:981) ... 13 more仔細看上面的異常信息發現這是APR報的錯誤。Tomcat 6也有APR包但我從來都沒用過。為此查看了Tomcat的ssl-how,在“Edit the Tomcat Configuration File”一節中說到:
Tomcat提供了兩個SSL實現,一個是JSSE實現,另一個是APR實現。
Tomcat將自動選擇使用哪個實現,即如果安裝了APR則自動選擇APR,否則選擇JSSE。
如果不希望讓Tomcat自動選擇,而是我們自己指定一個實現則可通過protocol定義,如下:
- <Connector protocol= "..." />??
<Connector protocol="..." />我又查看了6.0的相同說明,里面與7.0的說明一模一樣。因此問題只可能是:是否安裝了APR包。
以前只聽說過APR但沒弄過。APR是什么文件?后來才發現APR文件名為tcnative-1.dll。進一步檢查6.0和7.0的安裝目錄,結果發現6.0里沒這個dll文件,而7.0里有。換句話說,6.0默認使用JSSE實現,而7.0默認使用APR實現。
弄明白緣由就好辦了。由于習慣使用6.0的配置方式(即JSEE實現),因此只要把上面conf\server.xml里的protocol修改一下就行了:
- <Connector port= "8443" protocol= "org.apache.coyote.http11.Http11Protocol" SSLEnabled= "true" ??????????? maxThreads= "150" scheme= "https" secure= "true" ??????????? clientAuth= "false" sslProtocol= "TLS" ??????????? keystoreFile= "${user.home}/.keystore" ??????????? keystorePass= "changeit" />??
<Connector port="8443" protocol="org.apache.coyote.http11.Http11Protocol" SSLEnabled="true" maxThreads="150" scheme="https" secure="true" clientAuth="false" sslProtocol="TLS" keystoreFile="${user.home}/.keystore" keystorePass="changeit" />重新啟動,一切正常。
應用程序HTTP自動跳轉到HTTPS,解決如下,打開 項目的web.xml ,添加如下配置
- <security-constraint>???
- ?????? <web-resource-collection >???
- ????????????? <web-resource-name >eqm</web-resource-name>? ?
- ????????????? <url-pattern>/*</url-pattern>? ?
- ?????? </web-resource-collection>??
- ???????????????????????????????
- ?????? <user-data-constraint>???
- ????????????? <transport-guarantee>CONFIDENTIAL</transport-guarantee>? ?
- ?????? </user-data-constraint>???
- </security-constraint>?
<security-constraint> <web-resource-collection > <web-resource-name >eqm</web-resource-name> <url-pattern>/*</url-pattern> </web-resource-collection> <user-data-constraint> <transport-guarantee>CONFIDENTIAL</transport-guarantee> </user-data-constraint> </security-constraint>
?
更多文章、技術交流、商務合作、聯系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號聯系: 360901061
您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元
