在項目開發過程中,嘗嘗會遇到Tomcat需要SSL通信的需求。尤其是在需要安全Web應用時,需要HTTPS協定的通信。由于Tomcat預設情況下沒有提供SSL通信設定,是以必須明白如何在Tomcat下配置SSL。更糟糕的是,Tomcat的不同版本,其SSL配置有所不同。是以,本文将講述如何在Tomcat的主要版本(即6和7)下,配置SSL通信。
SSL、HTTPS和證書是任何Java程式員都應該了解的基礎知識,尤其是對那些開發金融和安全敏感類的網際網路應用的開發者。SSL、HTTPS和證書三者的協同工作,保證了用戶端和伺服器的安全通信。
開發使用HTTP協定通路的Web應用,安全是主要關心的問題。由于HTTP協定是以純文字格式傳輸資料的,它在傳輸敏感資訊(如使用者名、密碼、社保号、信用卡資訊等)時,是很不安全的。HTTP協定不能保證網站的可靠性,URL的重定向可以使得假冒網站代替真正的網站,HTTP是不會阻止這一切的,也不會提醒使用者。
HTTPS和SSL就是解決上述問題的。HTTPS是HTTP之上的SSL,SSL代表安全套接字層,它提供了網站的加密和驗證。是以,那些商務網站、銀行都在使用HTTPS協定。當使用HTTPS協定進行資料傳輸時,在用戶端和伺服器端之間傳輸前,資料是加密了的。是以,任何人都可以攔截或捕獲HTTPS,但是看不到真實的内容。SSL還利用第三方發行機構(如VeriSign、godaddy,thwate等)發行的證書來驗證網站的真實可靠性。
證書是怎樣工作的呢?當用戶端浏覽器使用HTTPS連接配接到伺服器,伺服器傳回第三方機構發行的證書。如果證書是Java程式,能通路到證書keystore和truststore的存根,浏覽器端也有存儲的可信證書,可驗證伺服器提供的證書。如果浏覽器或任何Java用戶端,沒有找到這些證書,它會警告說證書不可識别,推薦你不通路此網站。你也可以手動信任任何網站,請求浏覽器相信伺服器提供的證書。
在開發的情況下,Tomcat傳回自簽名的證書或測試證書。對于Java程式員,JDK自帶了一個keytool工具,他能用于建立自簽名的證書,并存儲到keystore和truststore供使用。
你可以從Windows的支援團隊請求證書,或者使用工具如IBM IkeyMan或keytool指令産生證書,并放入truststore和keystore中。
一旦證書已經準備好,打開Tomcat/conf目錄下的server.xml配置檔案,查找Connector标簽,它定義HTTPS通信,通常它被注釋掉了,是以可以查找“Define a SSL HTTP/1.1 Connector on port 8443”,一旦找到,使用下面的配置進行替換。
在Tomcat6中定義SSL通信:
Connector protocol="org.apache.coyote.http11.Http11Protocol"
port="8443" minSpareThreads="5" maxSpareThreads="75"
enableLookups="true" disableUploadTimout="true"
acceptCount="100" maxThreads="200"
scheme="https" secure="true" SSLEnabled="true"
clientAuth="false" sslProtocol="TLS"
keystoreFile="${catalina.home}/conf/server.jks"
keystoreType="JKS" keystorePass="changeit" />
還需修改這個:
Listener className="org.apache.catalina.core.AprLifecycleListener" SSLEngine="off" />
在Tomcat7中配置SSL通信:
Connector port="8443" protocol="HTTP/1.1" SSLEnabled="true"
maxThreads="150" scheme="https" secure="true"
怎樣配置Java Web程式使用HTTPS
如果想要你的JavaEE Web程式使用HTTPS協定實作SSL通信,你需要在web.xml配置檔案中添加:
security-constraint>
web-resource-collection>
web-resource-name>HelloSSLweb-resource-name>
url-pattern>/*url-pattern>
user-data-constraint>
transport-guarantee>CONFIDENTIALtransport-guarantee>