關於Tomcat 7.0 SSL配置的問題


以前一直在用Tomcat 6.0.29版本,今下載了apache-tomcat-7.0.33-windows-x86.zip試試,結果在配置SSL時遇到一些問題。

Tomcat 6版本配置SSL過程有兩步:

1、用JDK自帶的keytool.exe來生成私有密鑰和自簽發的證書,如下:

keytool -genkey -keyalg RSA -alias tomcat

按提示輸入相關內容后,這條命令將在默認密鑰庫文件里新增一個別名為tomcat的私有密鑰項及其自簽發的證書。默認密鑰庫文件為:

%USERPROFILE%\.keystore

2、修改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" />

這里的${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)
2012-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="..." />

 

我又查看了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" />

 重新啟動,一切正常。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM