下面描述使用的變量$CATALINA_HOME指的是Tomcat 5的安裝目錄,大部分目錄都基于它來解析。不過,如果你通過使用CATALINA_BASE目錄來運行Tomcat 5的多個實例,則應(yīng)該使用$CATALINA_BASE替代這些引用。
要在Tomcat 5上安裝、配置SSL,請按以下步驟做,如果需要更多信息,請看文檔的剩下部分。
1.如果你運行的是JVM 1.3,請從http://java.sun.com/products/jsse/下載JSSE 1.0.3(或更新版),然后擴展安裝,或設(shè)置一個環(huán)境變量JSSE_HOME指向安裝的目錄。
2.執(zhí)行下面的命令創(chuàng)建一個證書keystore:
Windows:
%JAVA_HOME%\bin\keytool -genkey -alias tomcat -keyalg RSA |
$JAVA_HOME/bin/keytool -genkey -alias tomcat -keyalg RSA |
SSL(Secure Socket Layer)是一種能讓web瀏覽器和服務(wù)器在建立一個安全連接的基礎(chǔ)上進(jìn)行通信的技術(shù)。這意味著一端將數(shù)據(jù)加密后發(fā)送、傳輸,在另一端處理前解密。這是一個雙向過程,服務(wù)端和客戶端對所有要發(fā)出的數(shù)據(jù)都進(jìn)行加密。
另一個重要的方面是鑒權(quán)。這意味著你的最初和web服務(wù)器的通信是建立在安全連接基礎(chǔ)上的。服務(wù)器將給你的web瀏覽器一套證書形式的信任狀,來證明這個站點是它所聲稱的那一個站點。在某種情況下服務(wù)器也會向你的瀏覽器請求一個證書,要求證明你是你所聲稱的那個人。這就是"客戶身份認(rèn)證",盡管在實際應(yīng)用中是business-to-business交易而不是個人用戶。大部分使用了SSL的web服務(wù)器不要求客戶認(rèn)證。
注意,只有當(dāng)Tomcat以獨立模式運行時,才通常需要利用安全sockets來配置它。當(dāng)Tomcat主要是作為運行在其它web服務(wù)器(如Apache或Microsoft IIS)后的Servlet/JSP容器時,通常需要配置主web服務(wù)器來處理從用戶來的SSL連接。典型的,這個服務(wù)器將處理所有SSL有關(guān)的功能,然后在解密那些請求后再把以Tomcat為目的的請求轉(zhuǎn)發(fā)給Tomcat。同樣的,Tomcat將返回沒經(jīng)過加密的響應(yīng),由主服務(wù)器加密后發(fā)給用戶瀏覽器。在這種情況下,Tomcat知道主服務(wù)器和客戶端的通信是建立在安全連接上的(因為你的應(yīng)用需要能夠知道這個),但本身不參與加密或解密。
為了實現(xiàn)SSL,web服務(wù)器必須有一個針對每個接口(IP地址)的接受安全連接的相關(guān)證書。在這個設(shè)計背后的理論是服務(wù)器應(yīng)該提供某種‘你覺得它的所有者是誰'的擔(dān)保,特別是在接受任何敏感信息前。然而對證書更深的解釋超過了本文檔的范圍,可以把證書看作一個對Internet地址的"digital driver's license"。它聲明了這個站點是什么公司的和一些關(guān)于站點所有者或管理員的基本聯(lián)系信息。
"driver's license"是被所有者加密簽名的,因此對任何其它人來說,偽造都是極端困難的。對和電子商務(wù)或其它任何商業(yè)交易有關(guān)的網(wǎng)站來說,身份驗證是一個重要問題。證書通常從一個著名的認(rèn)證授權(quán)機構(gòu)(Certificate Authority)比如VeriSign或Thawte處購買。CA將為它承認(rèn)的證書擔(dān)保,這些證書都能有效的被電子驗證。因此如果你信任CA承認(rèn)的證書,那么你就可以相信證書的有效性。
然而在很多情況下,身份鑒定不是真正所關(guān)心的。管理員可能只不過想確保連接中的服務(wù)器傳輸和接收的數(shù)據(jù)是秘密的且不被網(wǎng)上其它任何想偷聽的人所竊聽。幸運的是,Java提供了一個叫keytool的相對簡單的命令行工具,它能方便的創(chuàng)建一個"自簽名"的證書。自簽名證書只是用戶生成的證書,它不會被任何著名的CA所官方注冊,因此并不是真正可信的擔(dān)保。這對你來說可能重要也可能不,取決于你的需要。
當(dāng)一個用戶第一次訪問你的網(wǎng)站的安全頁面時,通常會給他一個包含證書詳細(xì)信息(比如公司和聯(lián)系名稱)的對話框,并問他是否原意接受證書有效且繼續(xù)交易。一些瀏覽器會提供一個永久接受該證書的選項,這樣用戶就不必為每次訪問你的網(wǎng)站被提示而煩惱了。一旦被用戶認(rèn)可,證書將在整個瀏覽器的會話期間內(nèi)被認(rèn)為有效。
雖然SSL協(xié)議被設(shè)計為有足夠有效的安全性,但加密/解密從性能上考慮是一個昂貴的計算處理。并不是整個web應(yīng)用都必需嚴(yán)格的在SSL上運行,開發(fā)者能夠挑選哪些頁面需要安全連接,哪些不需要。對一個適度繁忙的站點,僅僅將某些可能交換敏感信息的頁面運行在SSL下是一種慣例。這通常包括登錄頁面、個人信息頁面和購物車檢查頁面(信用卡信息可能會被發(fā)送)。一個應(yīng)用里的任何頁面都可以通過一個安全socket請求,只要在地址前用前綴"https:"替代"http:"。任何完全要求安全連接的頁面應(yīng)該檢查和請求的協(xié)議類型,并采取https沒有指定的適當(dāng)?shù)膭幼鳌?/p>
在安全連接上使用基于名字的虛擬主機會有問題,這是SSL協(xié)議本身的設(shè)計局限。SSL的握手,就是客戶瀏覽器接受服務(wù)器證書的過程,必須發(fā)生在HTTP請求達(dá)到之前。結(jié)果,包含性能主機名的請求信息不能在認(rèn)證前確定,因此不可能分配多個證書給一個IP地址。如果在一個IP上的所有虛擬主機都需要依靠相同的證書鑒別,那么附加的虛擬主機不應(yīng)干擾服務(wù)器上SSL的正常操作。然而,大部分客戶瀏覽器會依靠證書的域名列表比較服務(wù)器的域名(即便是正式的、CA簽名的證書)。如果域名不匹配,則瀏覽器會向用戶顯示一條警告。通常,只有基于地址的虛擬主機普遍在正式場合下使用SSL。
6.1下載并安裝JSSE
從http://java.sun.com/products/jsse/上下載版本1.0.3以上的Java Secure Socket Extensions (JSSE)包。如果你是從源代碼安裝的Tomcat,那么可能已經(jīng)下載了這個包。如果你運行的是JDK 1.4.x,這些類已經(jīng)直接集成到JDK中了,可以跳過這一步。
解壓后,有兩種方法讓它對Tomcat可用(選擇一種):
1.通過復(fù)制三個JAR文件(jcert.jar、jnet.jar和jsse.jar)到$JAVA_HOME/jre/lib/ext目錄將JSSE作為擴展安裝。
2.創(chuàng)建一個新的環(huán)境變量JSSE_HOME,將其指向你解壓的JSSE目錄的絕對路徑。
6.2準(zhǔn)備證書Keystore
Tomcat通常只在JKS或PKCS12格式的keystores上執(zhí)行。JKS是Java的標(biāo)準(zhǔn)"Java KeyStore"格式,并且是命令行工具創(chuàng)建的格式,此工具在JDK中。PKCS12是一個internet標(biāo)準(zhǔn),且能夠通過OpenSSL和Microsoft's Key-Manager操縱。不過通常對PKCS12的支持有些限制。
要導(dǎo)入一個存在的證書到JKS keystore,請閱讀關(guān)于keytool的文檔(在JDK文檔包中)。
要導(dǎo)入一個存在的被你自己的CA簽名的證書到使用OpenSSL的PKCS12 keystore,要執(zhí)行一條象下面這樣的命令:
openssl pkcs12 -export -infile mycert.crt -inkey mykey.key \ -outfile mycert.p12 -name tomcat -CAfile myCA.crt \ -caname root -chain |
要創(chuàng)建一個臨時的,包含單獨的自簽名的證書,在終端上執(zhí)行下面的命令:
Windows:
%JAVA_HOME%\bin\keytool -genkey -alias tomcat -keyalg RSA |
$JAVA_HOME/bin/keytool -genkey -alias tomcat -keyalg RSA |
(RSA算法是首選的安全算法,并且確保了和其它服務(wù)器、組件的兼容性。)
此命令將在你運行的目錄下創(chuàng)建一個新文件,文件名為".keystore"。要指定文件的地址,在-keystore參數(shù)后跟文件的全路徑。你需要在后面描述的server.xml配置文件中反映出這一變化。例:
Windows:
%JAVA_HOME%\bin\keytool -genkey -alias tomcat -keyalg RSA \ -keystore \path\to\my\keystore |
$JAVA_HOME/bin/keytool -genkey -alias tomcat -keyalg RSA \ -keystore /path/to/my/keystore |
執(zhí)行此命令后,會提示你輸入keystore的密碼。Tomcat使用的缺省密碼是"changeit"(全小寫),你也可以自己指定。同時也需要在后面描述的server.xml中指定自定義的密碼。
接下來會提示你關(guān)于此證書的說明,比如公司、聯(lián)系名等等。此信息會顯示給要訪問你的安全頁面的用戶,因此請確保此處提供的信息和用戶期望的匹配。
最后,會提示你輸入key password,這個password是這個證書特有的(區(qū)別于任何其它存儲在同一個keystore文件中的證書)。你必須使用和keystore相同的密碼。(通常keytool的提示會告訴你直接回車會自動完成此項。)
如果所有的都完成了,你現(xiàn)在就有一個能給服務(wù)器使用的包含證書的keystore文件了。
6.3編輯Tomcat配置文件
最后一步是在$CATALINA_HOME/conf/server.xml中配置你的secure socket。在安裝好的Tomcat里缺省server.xml中已經(jīng)包含了一個SSL connector的元素樣本??雌饋砣缦拢?/p>
<-- Define a SSL Coyote HTTP/1.1 Connector on port 8443 --> |
你會注意到Connector元素缺省被注釋了,因此你需要刪除它周圍的注釋標(biāo)簽。接著你可以自定義一些屬性。要更多各種選項的信息,請參考Server Configuration Reference。下面的討論只覆蓋建立SSL通信時最感興趣的那些屬性。
port屬性(缺省為8443)是Tomcat監(jiān)聽安全連接的TCP/IP端口號。你可以將它改成任何你需要的端口號(如https通信的缺省端口443)。然而在許多操作系統(tǒng)上,Tomcat要使用一個1024以下的端口需要做一些特別的設(shè)置(這不在本文檔范圍內(nèi))。
如果改變了此處的端口號,應(yīng)該同時改變在non-SSL connector上redirectPort屬性的值。作為Servlet 2.4 Specification中所必需的,這允許Tomcat自動重定向用戶訪問有安全限制的頁面的請求,指出需要SSL。
還有一些其它的選項配置SSL協(xié)議。你可能需要增加或改變下面的屬性值,取決于你開始對keystore的配置:
clientAuth | 如果想要Tomcat為了使用這個socket而要求所有SSL客戶出示一個客戶證書,置該值為true。 |
keystoreFile | 如果創(chuàng)建的keystore文件不在Tomcat認(rèn)為的缺省位置(一個在Tomcat運行的home目錄下的叫.keystore的文件),則加上該屬性??梢灾付ㄒ粋€絕對路徑或依賴$CATALINA_BASE環(huán)境變量的相對路徑。 |
keystorePass | 如果使用了一個與Tomcat預(yù)期不同的keystore(和證書)密碼(changeit),則加入該屬性。 |
keystoreType | 如果使用了一個PKCS12 keystore,加入該屬性。有效值是JKS和PKCS12。 |
sslProtocol | socket使用的加密/解密協(xié)議。如果使用的是Sun的JVM,則不建議改變這個值。據(jù)說IBM的1.4.1版的TLS協(xié)議的實現(xiàn)和一些流行的瀏覽器不兼容。這種情況下,使用SSL。 |
ciphers | 此socket允許使用的被逗號分隔的密碼列表。缺省情況下,可以使用任何可用的密碼。 |
algorithm | 使用的X509算法。缺省為Sun的實現(xiàn)(SunX509)。對于IBM JVMS應(yīng)該使用ibmX509。對于其它JVM,參考JVM文檔取正確的值。 |
truststoreFile | 用來驗證客戶證書的TrustStore文件。 |
truststorePass | 訪問TrustStore使用的密碼。缺省值是keystorePass。 |
truststoreType | 如果使用一個不同于正在使用的KeyStore的TrustStore格式,加入該屬性。有效值是JKS和PKCS12。 |
如果創(chuàng)建的keystore文件不在Tomcat認(rèn)為的缺省位置(一個在Tomcat運行的home目錄下的叫.keystore的文件),則加上該屬性??梢灾付ㄒ粋€絕對路徑或依賴$CATALINA_BASE環(huán)境變量的相對路徑。