1. 程式人生 > >Tomcat配置https與http自動跳轉和tomcat單雙向SSL配置及IE訪問HTTPS下載檔案失敗

Tomcat配置https與http自動跳轉和tomcat單雙向SSL配置及IE訪問HTTPS下載檔案失敗

Tomcat配置https與http自動跳轉

https介紹:
   HTTPS(全稱:Hypertext Transfer Protocol over Secure Socket Layer),是以安全為目標

的HTTP通道,簡單講是HTTP的安全版。即HTTP下加入SSL層,HTTPS的安全基礎是SSL,因此

加密的詳細內容就需要SSL。 它是一個URI scheme(抽象識別符號體系),句法類同http:體系

。用於安全的HTTP資料傳輸。https:URL表明它使用了HTTPS,但HTTPS存在不同於HTTP的默

認埠及一個加密/身份驗證層(在HTTP與TCP之間)。這個系統的最初研發由網景公司進行

,提供了身份驗證與加密通訊方法,現在它被廣泛用於全球資訊網上安全敏感的通訊,例如交易支

付方面

與http區別:
一、https協議需要到ca申請證書,一般免費證書很少,需要交費。
二、http是超文字傳輸協議,資訊是明文傳輸,https 則是具有安全性的ssl加密傳輸協議。
三、http和https使用的是完全不同的連線方式,用的埠也不一樣,前者是80,後者是443。
四、http的連線很簡單,是無狀態的;HTTPS協議是由SSL+HTTP協議構建的可進行加密傳輸

、身份認證的網路協議,比http協議安全。

SSL協議:
  SSL安全套接層協議(Secure Socket Layer)
  為Netscape所研發,用以保障在Internet上資料傳輸之安全,利用資料加密(Encryption)技

術,可確保資料在網路上之傳輸過程中不會被擷取及竊聽。目前一般通用之規格為40 bit之安

全標準,美國則已推出128 bit之更高安全標準,但限制出境。只要3.0版本以上之IE.或

Netscape瀏覽器即可支援SSL。

  當前版本為3.0。它已被廣泛地用於Web瀏覽器與伺服器之間的身份認證和加密資料傳輸

。SSL協議位於TCP/IP協議與各種應用層協議之間,是一種國際標準的加密及身份認證通訊協

議,為TCP提供一個可靠的端到端的安全服務,為兩個通訊個體之間提供保密性和完整性(身份

鑑別)。SSL協議可分為兩層:SSL記錄協議(SSL Record Protocol):它建立在可靠的傳輸協

議(如TCP)之上,為高層協議提供資料封裝、壓縮、加密等基本功能的支援。SSL握手協議

(SSL Handshake Protocol):它建立在SSL記錄協議之上,用於在實際的資料傳輸開始前,

通訊雙方進行身份認證、協商加密演算法、交換加密金鑰等。

如何配置:
1、生成伺服器端證書檔案
可以使用Windows系統或者Linux系統
(1)    Windows環境
條件:已經安裝JDK
步驟:
l  進入%JAVA_HOME%/bin目錄
l  執行命令
keytool -genkey -alias tomcat -keyalg RSA -keystore F:\tomcat.keystore -validity 36500
引數簡要說明:“F:\tomcat.keystore”含義是將證書檔案儲存在F盤,證書檔名稱是

tomcat.keystore ;“-validity 36500”含義是證書有效期,36500表示100年,預設值是90天
l  在命令列填寫必要的引數:
A、輸入keystore密碼:此處需要輸入大於6個字元的字串
B、“您的名字與姓氏是什麼?”這是必填項,並且必須是TOMCAT部署主機的域名或者IP[如:

gbcom.com 或者 10.1.25.251],就是你將來要在瀏覽器中輸入的訪問地址
C、 “你的組織單位名稱是什麼?”、“您的組織名稱是什麼?”、“您所在城市或區域名稱是什麼

?”、“您所在的州或者省份名稱是什麼?”、“該單位的兩字母國家程式碼是什麼?”可以按照需要

填寫也可以不填寫直接回車,在系統詢問“正確嗎?”時,對照輸入資訊,如果符合要求則使用

鍵盤輸入字母“y”,否則輸入“n”重新填寫上面的資訊
D、輸入<tomcat>的主密碼,這項較為重要,會在tomcat配置檔案中使用,建議輸入與

keystore的密碼一致,設定其它密碼也可以
l  完成上述輸入後,直接回車則在你在第二步中定義的位置找到生成的檔案
(2)    Linux環境
條件:安裝了JDK
步驟:
l  進入$JAVA_HOME/bin目錄
l  執行命令
./keytool -genkey -alias tomcat -keyalg RSA -keystore /usr/local/ac/web/tomcat.keystore -

validity 36500
引數簡要說明:“/etc/tomcat.keystore”含義是將證書檔案儲存在路徑/usr/local/ac/web/下,證

書檔名稱是tomcat.keystore ;“-validity 36500”含義是證書有效期,36500表示100年,預設

值是90天

說明:
A、Enter keystore password:此處需要輸入大於6個字元的字串
B、“What is your first and last name?”這是必填項,並且必須是TOMCAT部署主機的域名或者

IP[如:gbcom.com 或者 10.1.25.251],就是你將來要在瀏覽器中輸入的訪問地址
C、“What is the name of your organizational unit?”、“What is the name of your

organization?”、“What is the name of your City or Locality?”、“What is the name of your

State or Province?”、“What is the two-letter country code for this unit?”可以按照需要填寫也

可以不填寫直接回車,在系統詢問“correct?”時,對照輸入資訊,如果符合要求則使用鍵盤輸

入字母“y”,否則輸入“n”重新填寫上面的資訊
D、Enter key password for <tomcat>,這項較為重要,會在tomcat配置檔案中使用,建議輸

入與keystore的密碼一致,設定其它密碼也可以
l  完成上述輸入後,直接回車則在你在第二步中定義的位置找到生成的檔案
2、配置TOMCAT伺服器
(1)    如果你是在Windows環境中生成證書檔案,則需要將生成的證書tomcat.keystore拷貝

到Tomcat將要引用的位置,假設tomcat的應用證書的路徑是“/etc/tomcat.keystore”,則需要

將證書檔案拷貝到“etc/”下;如果是在Linux環境按照上述介紹的步驟生成證書檔案的話,此時

證書檔案已經在“etc/”下。
(2)    配置Tomcat,開啟$CATALINA_HOME/conf/server.xml,修改如下,
<Connector port="8080" protocol="HTTP/1.1"
               connectionTimeout="20000"
               redirectPort="8443" />
修改引數=>
<Connector port="80" protocol="HTTP/1.1"
               connectionTimeout="20000"
               redirectPort="443" />
 
<!--
<Connector port="8443" protocol="HTTP/1.1" SSLEnabled="true"
              maxThreads="150" scheme="https" secure="true"
              clientAuth="false" sslProtocol="TLS"/>
 -->
去掉註釋且修改引數=>
<Connector port="443" protocol="HTTP/1.1" SSLEnabled="true"
               maxThreads="150" scheme="https" secure="true"
               clientAuth="false" sslProtocol="TLS" keystoreFile="/etc/tomcat.keystore"

keystorePass="www.gbcom.com.cn"/>
註釋:標識為淡藍色的兩個引數,分別是證書檔案的位置和<tomcat>的主密碼,在證書檔案

生成過程中做了設定
<!--
   <Connector port="8009" enableLookups="false" protocol="AJP/1.3" redirectPort="8443"

/>
-->
修改引數=>
<Connector port="8009" enableLookups="false" protocol="AJP/1.3" redirectPort="443" />
(3) 開啟$CATALINA_HOME/conf/web.xml,在該檔案末尾增加:
2.強制https訪問

在tomcat\conf\web.xml中的</welcome-file-list>後面加上這樣一段:

    <login-config>
     <!-- Authorization setting for SSL -->
     <auth-method>CLIENT-CERT</auth-method>
     <realm-name>Client Cert Users-only Area</realm-name>
    </login-config>
    <security-constraint>
     <!-- Authorization setting for SSL -->
     <web-resource-collection >
      <web-resource-name >SSL</web-resource-name>
      <url-pattern>/*</url-pattern>
     </web-resource-collection>
     <user-data-constraint>
      <transport-guarantee>CONFIDENTIAL</transport-guarantee>
     </user-data-constraint>
    </security-constraint>


3、上述配置完成後,重啟TOMCAT後即可以使用SSL。IE位址列中可以直接輸入地址不必輸入

“http://” 或者 “https://” ;也可以輸入 “http:// ” 會跳轉成為 “https://” 來登入
4、注意事項:
(1)    生成證書的時間,如果IE客戶端所在機器的時間早於證書生效時間,或者晚於有效時

間,IE會提示“該安全證書已到期或還未生效”
(2)    如果IE提示“安全證書上的名稱無效或者與站點名稱不匹配”,則是由生成證書時填寫

的伺服器所在主機的域名“您的名字與姓氏是什麼?”/“What is your first and last name?”不正

確引起的

5、遺留問題:
(1)如果AC主機不能通過域名查詢,必須使用IP,但是這個IP只有在配置後才能確定,這樣

證書就必須在AC確定IP地址後才能生成
(2)證書檔案只能繫結一個IP地址,假設有10.1.25.250 和 192.168.1.250 兩個IP地址,在證

書生成檔案時,如使用了10.1.25.250,通過IE就只能使用10.1.25.250 來訪問AC-WEB,

192.168.1.250是無法訪問AC-WEB的。


https跳轉到http session丟失問題

解決之前首先我們要明白,服務端跟蹤客戶端的會話是通過 瀏覽器每次提交的一個cookie表示

這個cookie的key是JSESSIONID,value是session的id,瀏覽器請求時候就會帶上這個,服務端

就可以成功跟蹤客戶端了。

使用者直接訪問https的登入頁面,在登入action成功(呼叫業務層服務驗證使用者和密碼成功後)

後增加如下程式碼
Java程式碼
HttpServletRequest request = ServletActionContext.getRequest();
request.getSession(false).invalidate();
request.getSession(true);

HttpServletResponse response = ServletActionContext.getResponse();
Cookie cookie = newCookie("JSESSIONID",request.getSession().getId());
response.addCookie(cookie);

即保證服務端與傳送到客戶端Cookie中的JSESSIONID值一致就行了。



tomcat單向SSL配置

1、通過keytools生成keystore
keytool -genkey -alias tomcat -keyalg RSA -keypass changeit -storepass changeit -keystore

d:\server.keystore
注意CN必須域名
比如以後通過https://localhost:8443/path/ 訪問網站
這時候CN = localhost
2、tomcat 開啟SSL配置
server.xml配置 
<Connector port="8443" protocol="HTTP/1.1" SSLEnabled="true"    
maxThreads="150" scheme="https" secure="true"    
clientAuth="false" sslProtocol="TLS"    
keystoreFile="d:/server.eystore"  keystorePass="changeit"/>  

<Connector port="8443" protocol="HTTP/1.1" SSLEnabled="true" 
maxThreads="150" scheme="https" secure="true" 
clientAuth="false" sslProtocol="TLS" 
keystoreFile="d:/server.eystore"  keystorePass="changeit"/>

安全證書有問題。
4、匯出x509證書
keytool -export -alias tomcat -file d:\server.cer -keystore d:\server.keystore.
先匯出一個x509證書
5、新建client信任的keystore.
keytool -genkey -alias trust -keyalg RSA -keypass changeit -storepass changeit -keystore

d:\trust.keystore
6、新增伺服器端證書進入本地信任keystore
keytool -import -v -alias tomcat -file d:\server.cer -keystore d:\trust.keystore
7、java 測試程式碼
import java.io.IOException;
import java.net.MalformedURLException;
import java.net.URL;

import javax.net.ssl.HttpsURLConnection;


public class TClient {
 public static void main(String[] args) throws Exception {
        System.setProperty("javax.net.ssl.trustStore", "d:/trust.keystore" );
        new TClient().test();
    }

    private void test() {
        String https_url = "https://localhost:8443/path/login.jsp";
        URL url;
        try {
            url = new URL(https_url);
            HttpsURLConnection connection = (HttpsURLConnection) url.openConnection();
            connection.setDoOutput(true);
            connection.setRequestMethod("POST");
            connection.getOutputStream().flush();
            connection.getOutputStream().close();
            System.out.println( connection.getPeerPrincipal().toString() );
        } catch (MalformedURLException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

tomcat 啟動ssl(雙向認證)

1、通過keytools生成serverkeystore
keytool -genkey -alias tomcat -keyalg RSA -keypass changeit -storepass changeit -keystore d:\server.keystore
注意CN必須域名
比如以後通過https://localhost:8443/path/ 訪問網站
這時候CN = localhost
2、匯出x509證書
keytool -export -alias tomcat -file d:\server.cer -keystore d:\server.keystore.
先匯出一個x509證書
3、新建client信任的trustclientkeystore.
keytool -genkey -alias trust -keyalg RSA -keypass changeit -storepass changeit -keystore d:\trust.keystore
4、新增伺服器端證書進入本地信任trustclientkeystore.
keytool -import -v -alias tomcat -file d:\server.cer -keystore d:\trust.keystore
前面不變
5、通過keytools生成clientkeystore
keytool -genkey -alias client -keyalg RSA -keypass changeit -storepass changeit -keystore d:\client.keystore
6、匯出x509證書
keytool -export -alias client -file d:\client.cer -keystore d:\client.keystore.
7、新建server信任的trustserverkeystore.
keytool -genkey -alias trustserver -keyalg RSA -keypass changeit -storepass changeit -keystore d:\trustserver.keystore
8、新增本地證書進入伺服器信任trustserverkeystore.
keytool -import -v -alias client -file d:\client.cer -keystore d:\trustserver.keystore
到目前為止就有2個keystore 2個trustkeystore
9、tomcat 配置
Xml程式碼 
<Connector port="8443" protocol="HTTP/1.1" SSLEnabled="true"    
maxThreads="150" scheme="https" secure="true"    
[color=red]clientAuth="true"[/color] sslProtocol="TLS"    
keystoreFile="d:/server.keystore"  keystorePass="changeit" 
truststoreFile="d:/trustserver.keystore" truststorePass="changeit" 
/>  

<Connector port="8443" protocol="HTTP/1.1" SSLEnabled="true" 
maxThreads="150" scheme="https" secure="true" 
[color=red]clientAuth="true"[/color] sslProtocol="TLS" 
keystoreFile="d:/server.keystore"  keystorePass="changeit"
truststoreFile="d:/trustserver.keystore" truststorePass="changeit"
/>

clientAuth 設定為 true

10、javacode
Java程式碼 
import java.io.File;  
import java.io.FileInputStream;  
import java.security.KeyStore;  
import org.apache.http.HttpResponse;  
import org.apache.http.client.HttpClient;  
import org.apache.http.client.methods.HttpPost;  
import org.apache.http.conn.scheme.Scheme;  
import org.apache.http.conn.ssl.SSLSocketFactory;  
import org.apache.http.impl.client.DefaultHttpClient;  
 
public class Client {  
    /** 
     * @param args 
     * @throws Exception 
     */ 
    public static void main(String[] args) throws Exception {  
        HttpClient httpclient = new DefaultHttpClient();  
        KeyStore keyStore = KeyStore.getInstance(KeyStore.getDefaultType());  
        KeyStore trustStore = KeyStore.getInstance(KeyStore.getDefaultType());  
        FileInputStream keyStoreIn = new FileInputStream(new File("d:/client.keystore"));  
        FileInputStream trustStoreIn = new FileInputStream(new File("d:/trust.keystore"));  
          
        try {  
            keyStore.load(keyStoreIn, "123456".toCharArray());  
            trustStore.load(trustStoreIn, "123456".toCharArray());  
        } finally {  
            keyStoreIn.close();  
            trustStoreIn.close();  
        }  
        SSLSocketFactory socketFactory = new SSLSocketFactory(keyStore, "123456", trustStore);  
        httpclient.getConnectionManager().getSchemeRegistry().register(new Scheme("https",socketFactory, 8443));  
        HttpPost httpget = new HttpPost("https://localhost:8443/SSOClient/login.html");  
        System.out.println("Request:" + httpget.getRequestLine());  
        HttpResponse response = httpclient.execute(httpget);  
        System.out.println(response.getStatusLine());  
        httpclient.getConnectionManager().shutdown();  
    }  

Tomcat6配置SSL雙向驗證

第一步:為服務端生成證書

一、建立證書keystore
建立證書keystore的過程。

操作步驟使用JDK自帶的命令keytool建立“keystore”檔案,其中包含了金鑰。在命令列視窗中輸入以下命令: keytool -genkey -alias tbb -keyalg RSA -keystore d:\tbb.keystore
根據系統提示輸入“keystore”的密碼,例如:“password”根據系統提示,輸入其他資料。輸入完成後,系統將詢問使用者輸入的資訊是否正確,如果正確,請輸入“y”,否則請輸入“n”

注:此項要輸入本機ip

輸入私鑰的密碼,如“password”輸入私鑰的密碼。系統將在當前路徑下生成一個“keystore”檔案。

二、建立自簽名的證書建立自簽名的證書的過程。

操作步驟使用JDK自帶的命令keytool建立自簽名證書。 
keytool -selfcert -alias tbb -keystore d:\tbb.keystore

這句話可能出現錯誤,應該是jdk版本問題。我沒有執行這句話,而直接匯出證書。

輸入建立keystore時輸入的密碼。keystore進行驗證。 
keytool -selfcert -alias tbb -keystore d:\tbb.keystore

驗證成功後,將證書匯出。 
keytool -export -alias tbb -keystore d:\tbb.keystore -storepass password -rfc -file d:\tbb.cer

系統將根據前面的keystore檔案在當前目錄匯出一個cer檔案。

三、匯入證書到受信任的根證書頒發機構

四、配置tomcatserver.xmltomcat7.0

1.     <Connectorport="8443"protocol="HTTP/1.1"SSLEnabled="true"

2.     maxThreads="150"scheme="https"secure="true"

3.     clientAuth="false"sslProtocol="TLS"keystorePass="yourpasswd"keystoreFile="your keystore"/>

配置成功截圖

第二步:為客戶端生成證書下一步是為瀏覽器生成證書,以便讓伺服器來驗證它。為了能將證書順利匯入至IEFirefox,證書格式應該是PKCS12,因此,使用如下命令生成:d:\>keytool -genkey -alias MyKey -keyalg RSA -storetype PKCS12 -keystore d:\my.p12 -dname "CN=MyKey,OU=cn,L=cn,ST=cn,C=CN" -storepass password -keypass password

對應的證書庫存放在“d:\my.p12”,客戶端的CN可以是任意值。稍候,我們將把這個“my.p12”證書庫匯入到IEFirefox中。第三步:讓伺服器信任客戶端證書由於是雙向SSL認證,伺服器必須要信任客戶端證書,因此,必須把客戶端證書新增為伺服器的信任認證。由於不能直接將PKCS12格式的證書庫匯入,我們必須先把客戶端證書匯出為一個單獨的CER檔案,使用如下命令:d:\>keytool -export -alias MyKey -keystore d:\my.p12 -storetype PKCS12 -storepass password -rfc -file d:\my.cer

通過以上命令,客戶端證書就被我們匯出到“d:\my.cer”檔案了。下一步,是將該檔案匯入到伺服器的證書庫,新增為一個信任證書:d:\>keytool -import -v -file d:\my.cer -keystore d:\tomcat.keystore -storepass password

通過list命令檢視伺服器的證書庫,我們可以看到兩個輸入,一個是伺服器證書,一個是受信任的客戶端證書:keytool -list -keystore tbb.keystore -storepass password


 
第四步:配置Tomcat伺服器開啟Tomcat根目錄下的/conf/server.xml,找到如下配置段,修改如下:

<Connector port="8443" protocol="HTTP/1.1" SSLEnabled="true"
    maxThreads="150" scheme="https" secure="true"
    clientAuth="
true" sslProtocol="TLS"
    keystoreFile="
d:/tomcat.keystore" keystorePass="password"
    truststoreFile="
d:/tomcat.keystore" truststorePass="password"
/>

其中,clientAuth指定是否需要驗證客戶端證書,如果該設定為“false”,則為單向SSL驗證,SSL配置可到此結束。如果clientAuth設定為“true”,表示強制雙向SSL驗證,必須驗證客戶端證書。如果clientAuth設定為“want”,則表示可以驗證客戶端證書,但如果客戶端沒有有效證書,也不強制驗證。第五步:匯入客戶端證書my.p12匯入到個人

開啟網頁會提示這個“確認證書”點選確定就可以開啟網頁了,這時就是雙向認證了

 
IE訪問HTTPS連結下載檔案,IE提示無法下載

原因:
(1) 在IE6/7下,使用HTTPS下載/開啟檔案時,通過抓包發現檔案已傳輸,但IE提示“Internet Explorer無法下載 *** (來自 ***)。Internet Explorer無法開啟該Internet站點。請求的站點不可用,或找不到。請以後再試。” ("Unable to download. Internet Explorer was unable to open this site. The requested site is either unavailable or cannot be found. Please try again later."),下載失敗。


(2) 如果下載目標有一個hyperlink,當右鍵選擇“目標另存為...”時,提示“Internet Explorer無法下載 *** (來自 ***)。無法將檔案寫入快取記憶體”("The file could not be written to the cache"),下載失敗。

解決方案:
//確保IE識別本次為下載檔案  
response.setHeader("Content-Transfer-Encoding","binary");
response.setHeader("Cache-Control", "must-revalidate, post-check=0, pre-check=0"); 
response.setHeader("Pragma", "public");   

現象:
(1) 在IE6/7下,使用HTTPS下載/開啟檔案時,通過抓包發現檔案已傳輸,但IE提示“Internet Explorer無法下載 *** (來自 ***)。Internet Explorer無法開啟該Internet站點。請求的站點不可用,或找不到。請以後再試。” ("Unable to download. Internet Explorer was unable to open this site. The requested site is either unavailable or cannot be found. Please try again later."),下載失敗。


(2) 如果下載目標有一個hyperlink,當右鍵選擇“目標另存為...”時,提示“Internet Explorer無法下載 *** (來自 ***)。無法將檔案寫入快取記憶體”("The file could not be written to the cache"),下載失敗。

原因:
參考Microsoft KB815313316431812935323308

解決方法:
(1) 參考上述MS KB,向client登錄檔增加下列DWORD條目BypassSSLNoCacheCheck,值設為1;
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Internet Settings\BypassSSLNoCacheCheck
【此方式經jackpk親測,IE8下有效】


(2) 如果不方便修改client端,檢查伺服器端相關程式(eg. httpd),看是否在HTTP response header中自動添加了“Pragma: no-cache”等內容。(參考 MS KB316431的“更多資訊”(More Information)部分)