天天看點

Tomcat中配置https安全連結

SSL簡介

SSL, 或者Secure Socket Layer,是一種允許web浏覽器和web伺服器通過一個安全的連接配接進行交流的技術。這意味着将被發送的資料在一端被翻譯成密碼,傳送出去,然後在另一端解開密碼,再進行處理。這是一個雙向的過程,也就是浏覽器和伺服器都需要在發送資料之前對它們進行加密。

SSL協定的另一個重要方面是認證(Authentication)。這就是說,在你開始試圖通過一個安全連接配接與一個web伺服器交流的時候,這個伺服器會要求你的浏覽器出示一組證件,通過“鑒定”的方式來證明這就是你所聲明的網站。

在某些情況下,伺服器還會要求你的web浏覽器的認證書,證明你就是你所說的那個人。這就是所知的“客戶認證”,盡管實際情況中,更多地用在商務-對-商務(B2B)交易,而不是對個人使用者。

但大多數有SSL功能的web伺服器不要求客戶認證(Client Authentication)。

證書

為了能實施SSL,一個web伺服器對每個接受安全連接配接的外部接口(IP 位址)必須要有相應的證書(Certificate)。關于這個設計的理論是一個伺服器必須提供某種合理的保證以證明這個伺服器的主人就是你所認為的那個人。這個證書要陳述與這個網站相關聯的公司,以及這個網站的所有者或系統管理者的一些基本聯系資訊。

這個證書由所有人以密碼方式簽字,其他人非常難僞造。對于進行電子商務(e-commerce)的網站,或其他身份認證至關重要的任何商業交易,認證書要向大家所熟知的認證權威(Certificate Authority (CA))如VeriSign或Thawte來購買。這樣的證書可用電子技術證明屬實。實際上,認證權威機關會擔保它發出的認證書的真實性,如果你信任發出認證書的認證權威機關的話,你就可以相信這個認證書是有效的。

在許多情況下,認證并不是真正使人擔憂的事。系統管理者或許隻想要保證被伺服器傳送和接收的資料是秘密的,不會被連接配接線上的偷竊者盜竊到。慶幸的是,Java提供相對簡單的被稱為keytool的指令行工具,可以簡單地産生“自己簽名”的證書。自己簽名的證書隻是使用者産生的證書,沒有正式在大家所熟知的認證權威那裡注冊過,是以不能確定它的真實性。但卻能保證資料傳輸的安全性。

認證也許很重要,也許不重要,完全決定于網站的需要。

用Tomcat來配置SSL主要有下面這麼兩大步驟:

一、生成證書

1、 在指令行下執行:

%Java_home%\bin\keytool -genkey -alias tomcat -keyalg RSA

在此指令中,keytool是JDK自帶的産生證書的工具。把RSA運算法則作為主要安全運算法則,這保證了與其它伺服器群組件的相容性。

這個指令會在使用者的home directory産生一個叫做" .keystore " 的新檔案。在執行後,你首先被要求出示keystore密碼。Tomcat使用的預設密碼是" changeit "(全都是小寫字母),如果你願意,你可以指定你自己的密碼。你還需要在server.xml配置檔案裡指定自己的密碼,這在以後會有描述。

2、你會被要求出示關于這個認證書的一般性資訊,如公司,聯系人名稱,等等。這些資訊會顯示給那些試圖通路你程式裡安全網頁的使用者,以確定這裡提供的資訊與他們期望的相對應。

3、你會被要求出示密鑰(key)密碼,也就是這個認證書所特有的密碼(與其它的儲存在同一個keystore檔案裡的認證書不同)。你必須在這裡使用與keystore密碼相同的密碼。(目前,keytool會提示你按ENTER鍵會自動幫你做這些)。

如果一切順利,你現在就擁有了一個可以被你的伺服器使用的有認證書的keystore檔案。

二、配置tomcat

第二個大步驟是把secure socket配置在$CATALINA_HOME/conf/server.xml檔案裡。$CATALINA_HOME代表安裝Tomcat的目錄。一個例子是SSL連接配接器的<Connector>元素被包括在和Tomcat一起安裝的預設server.xml檔案裡。它看起來象是這樣:  

$CATALINA_HOME/conf/server.xml

<-- Define a SSL Coyote HTTP/1.1 Connector on port 8443 -->

<!--

<Connector

           port="8443" minProcessors="5" maxProcessors="75"

           enableLookups="true" disableUploadTimeout="true"

           acceptCount="100" debug="0" scheme="https" secure="true";

           clientAuth="false" sslProtocol="TLS"/>

-->

        Connector元素本身,其預設形式是被注釋掉的(commented out),是以需要把它周圍的注釋标志删除掉。然後,可以根據需要客戶化(自己設定)特定的屬性。一般需要增加一下keystoreFile和keystorePass兩個屬性,指定你存放證書的路徑(如:keystoreFile="C:/.keystore")和剛才設定的密碼(如:keystorePass="123456")。關于其它各種選項的詳細資訊,可查閱Server Configuration Reference。

在完成這些配置更改後,必須象重新啟動Tomcat,然後你就可以通過SSL通路Tomcat支援的任何web應用程式。隻不過指令需要像下面這樣:

[url]https://localhost:8443[/url]

啟動SSL方法

cd %CATALINA_HOME%

生成keystore

keytool -genkey -alias tomcat -keyalg RSA -keypass changeit -storepass changeit -keystore server.keystore -validity 3600

導出證書

keytool -export -trustcacerts -alias tomcat -file server.cer -keystore server.keystore -storepass changeit

将證書導入到信任庫

keytool -import -trustcacerts -alias tomcat -file server.cer -keystore %JAVA_HOME%/jre/lib/security/cacerts -storepass changeit

浏覽已存在證書

keytool -list -v -keystore %JAVA_HOME%/jre/lib/security/cacerts

删除已存在證書

keytool -delete -trustcacerts -alias tomcat -keystore %JAVA_HOME%/jre/lib/security/cacerts -storepass changeit

在server.xml中添加如下代碼:

Tomcat4.1.34配置:   

<Connector className="org.apache.coyote.tomcat4.CoyoteConnector" port="8443" enableLookups="true" scheme="https" secure="true" acceptCount="100" useURIValidationHack="false" disableUploadTimeout="true" clientAuth="false" sslProtocol="TLS" keystoreFile="server.keystore" keystorePass="changeit"/>

Tomcat5.5.9配置:  

<Connector port="8443" maxHttpHeaderSize="8192" maxThreads="150" minSpareThreads="25" maxSpareThreads="75" enableLookups="false" disableUploadTimeout="true" acceptCount="100" scheme="https" secure="true" clientAuth="false" sslProtocol="TLS" keystoreFile="server.keystore" keystorePass="changeit"/>   

Tomcat5.5.20配置(此配置同樣可用于Tomcat6.0):

<Connector protocol="org.apache.coyote.http11.Http11Protocol" port="8443" maxHttpHeaderSize="8192" maxThreads="150" minSpareThreads="25" maxSpareThreads="75" enableLookups="false" disableUploadTimeout="true" acceptCount="100" scheme="https" secure="true" clientAuth="false" sslProtocol="TLS" keystoreFile="server.keystore" keystorePass="changeit"/>