HTTPS實(shí)際是SSL over HTTP, 該協(xié)議通過SSL在發(fā)送方把原始數(shù)據(jù)進(jìn)行加密,在接收方解密,因此,所傳送的數(shù)據(jù)不容易被網(wǎng)絡(luò)黑客截獲和破解。本文介紹HTTPS的三種實(shí)現(xiàn)方法。
方法一 靜態(tài)超鏈接
這是目前網(wǎng)站中使用得較多的方法,也最簡單。在要求使用SSL進(jìn)行傳輸?shù)腤eb網(wǎng)頁鏈接中直接標(biāo)明使用HTTPS協(xié)議,以下是指向需要使用SSL的網(wǎng)頁的超鏈接:
<a href=“HTTPS://192.168.100.100/ok/securePage.jsp”>SSL例子</a>
需要說明的是,在網(wǎng)頁里的超鏈接如果使用相對路徑的話,其默認(rèn)啟用協(xié)議與引用該超鏈接的網(wǎng)頁或資源的傳輸協(xié)議相同,例如在某超鏈接“HTTPS://192.168.100.100/ok/login.jps”的網(wǎng)頁中包含如下兩個超鏈接:
<a href=“./bessl/exam.jsp”>SSL鏈接</a>
<a href=“HTTP://192.168.100.100/notssl/index.jsp”>非SSL鏈接</a>
那么,第一個鏈接使用與“HTTPS://192.168.100.100/ok/login.jsp”相同的傳輸協(xié)議HTTPS,第二個鏈接使用本身所標(biāo)識的協(xié)議HTTP。
使用靜態(tài)超鏈接的好處是容易實(shí)現(xiàn),不需要額外開發(fā)。然而,它卻不容易維護(hù)管理; 因?yàn)樵谝粋€完全使用HTTP協(xié)議訪問的Web應(yīng)用里,每個資源都存放在該應(yīng)用特定根目錄下的各個子目錄里,資源的鏈接路徑都使用相對路徑,這樣做是為了方 便應(yīng)用的遷移并且易于管理。但假如該應(yīng)用的某些資源要用到HTTPS協(xié)議,引用的鏈接就必須使用完整的路徑,所以當(dāng)應(yīng)用遷移或需要更改URL中所涉及的任 何部分如:域名、目錄、文件名等,維護(hù)者都需要對每個超鏈接修改,工作量之大可想而知。再者,如果客戶在瀏覽器地址欄里手工輸入HTTPS協(xié)議的資源,那 么所有敏感機(jī)密數(shù)據(jù)在傳輸中就得不到保護(hù),很容易被黑客截獲和篡改!
方法二 資源訪問限制
為了保護(hù)Web應(yīng)用中的敏感數(shù)據(jù),防止資源的非法訪問和保證傳輸?shù)陌踩裕琂ava Servlet 2.2規(guī)范定義了安全約束(Security-Constraint)元件,它用于指定一個或多個Web資源集的安全約束條件;用戶數(shù)據(jù)約束(User- Data-Constraint)元件是安全約束元件的子類,它用于指定在客戶端和容器之間傳輸?shù)臄?shù)據(jù)是如何被保護(hù)的。用戶數(shù)據(jù)約束元件還包括了傳輸保證 (Transport-Guarantee)元件,它規(guī)定了客戶機(jī)和服務(wù)器之間的通信必須是以下三種模式之一:None、Integral、 Confidential。None表示被指定的Web資源不需要任何傳輸保證;Integral表示客戶機(jī)與服務(wù)器之間傳送的數(shù)據(jù)在傳送過程中不會被篡 改; Confidential表示數(shù)據(jù)在傳送過程中被加密。大多數(shù)情況下,Integral或Confidential是使用SSL實(shí)現(xiàn)。
這里以BEA的WebLogic Server 6.1為例介紹其實(shí)現(xiàn)方法,WebLogic是一個性能卓越的J2EE服務(wù)器,它可以對所管理的Web資源,包括EJB、JSP、Servlet應(yīng)用程序 設(shè)置訪問控制條款。假設(shè)某個應(yīng)用建立在Weblogic Server里的/mywebAPP目錄下,其中一部分Servlets、JSPs要求使用SSL傳輸,那么可將它們都放在/mywebAPP /sslsource/目錄里,然后編輯/secureAPP/Web-INF/web.xml文件,通過對web.xml的設(shè)置可達(dá)到對Web用戶實(shí)現(xiàn) 訪問控制。
當(dāng)Web用戶試圖通過HTTP訪問/sslsource目錄下的資源時,Weblogic Server就會查找web.xml里的訪問約束定義,返回提示信息:Need SSL connection to access this resource。資源訪問限制與靜態(tài)超鏈接結(jié)合使用,不僅繼承了靜態(tài)超鏈接方法的簡單易用性,而且有效保護(hù)了敏感資源數(shù)據(jù)。然而,這樣就會存在一個問 題: 假如Web客戶使用HTTP協(xié)議訪問需要使用SSL的網(wǎng)絡(luò)資源時看到彈出的提示信息: Need SSL connection to access this resource,大部分人可能都不知道應(yīng)該用HTTPS去訪問該網(wǎng)頁,造成的后果是用戶會放棄訪問該網(wǎng)頁,這是Web應(yīng)用服務(wù)提供商不愿意看到的事情。
方法三 鏈接重定向
綜觀目前商業(yè)網(wǎng)站資源數(shù)據(jù)的交互訪問,要求嚴(yán)格加密傳輸?shù)臄?shù)據(jù)只占其中一小部分,也就是說在一個具體Web應(yīng)用中 需要使用SSL的服務(wù)程序只占整體的一小部分。那么,我們可以從應(yīng)用開發(fā)方面考慮解決方法,對需要使用HTTPS協(xié)議的那部分JSPs、Servlets 或EJBs進(jìn)行處理,使程序本身在接收到訪問請求時首先判斷該請求使用的協(xié)議是否符合本程序的要求,即來訪請求是否使用HTTPS協(xié)議,如果不是就將其訪 問協(xié)議重定向?yàn)镠TTPS,這樣就避免了客戶使用HTTP協(xié)議訪問要求使用HTTPS協(xié)議的Web資源時,看到錯誤提示信息無所適從的情況,這些處理對 Web客戶來說是透明的。
實(shí)現(xiàn)思想是:首先創(chuàng)建一個類,該類方法可以實(shí)現(xiàn)自動引導(dǎo)Web客戶的訪問請求使用HTTPS協(xié)議,每個要求使用SSL進(jìn)行傳輸?shù)腟ervlets或JSPs在程序開始時調(diào)用它進(jìn)行協(xié)議重定向,最后才進(jìn)行數(shù)據(jù)應(yīng)用處理。
J2EE提供了兩種鏈接重定向機(jī)制。第一種機(jī)制是RequestDispatcher接口里的forward() 方法。使用MVC(Model-View-Controller)機(jī)制的Web應(yīng)用通常都使用這個方法從Servlet轉(zhuǎn)移請求到JSP。但這種轉(zhuǎn)向只能 是同種協(xié)議間的轉(zhuǎn)向,并不能重定向到不同的協(xié)議。第二種機(jī)制是使用HTTPServletReponse接口里的sendRedirect()方法,它能 使用任何協(xié)議重定向到任何URL,例如:
BeSslResponse.sendRedirect(“HTTPS://192.168.100.100/order”);
此外,我們還需使用到Java Servlet API中的兩個方法:ServletRequest接口中的getScheme(),它用于獲取訪問請求使用的傳輸協(xié)議;HTTPUtils類中的 getRequestUrl(),它用于獲取訪問請求的URL,要注意的是該方法在Servlet 2.3中已被移到HTTPServletRequest接口。
以下是實(shí)現(xiàn)協(xié)議重定向的基本步驟:
1. 獲取訪問的請求所使用的協(xié)議;
2. 如果請求協(xié)議符合被訪問的Servlet所要求的協(xié)議,就說明已經(jīng)使用HTTPS協(xié)議了,不需做任何處理;
3. 如果不符合,使用Servlet所要求的協(xié)議(HTTPS)重定向到相同的URL。
例如,某Web用戶使用HTTP協(xié)議訪問要求使用HTTPS協(xié)議的資源BeSslServlet,敲入 “URL:HTTP://192.168.100.100/BeSslServlet”,在執(zhí)行BeSslServlet時首先使用 ProcessSslServlet.processSsl()重定向到HTTPS://192.168.100.100/BeSslServlet,然 后 BeSslServlet與客戶瀏覽器之間就通過HTTPS協(xié)議進(jìn)行數(shù)據(jù)傳輸。
以上介紹的僅是最簡單的例子,是為了對這種重定向的方法有個初步的認(rèn)識。假如想真正在Web應(yīng)用中實(shí)現(xiàn),還必須考慮如下幾個問題:
● 在Web應(yīng)用中常常會用到GET或Post方法,訪問請求的URL中就會帶上一些查詢字串,這些字串是使用getRequesUrl()時獲取不到的,而 且在重定向之后會丟失,所以必須在重定向之前將它們加入到新的URL里。我們可以使用request.getQueryString()來獲取GET的查 詢字串,對于Post的Request參數(shù),可以把它們轉(zhuǎn)換成查詢串再進(jìn)行處理。
● 某些Web應(yīng)用請求中會使用對象作為其屬性,必須在重定向之前將這些屬性保存在該Session中,以便重定向后使用。
● 大多數(shù)瀏覽器會把對同一個主機(jī)的不同端口的訪問當(dāng)作對不同的主機(jī)進(jìn)行訪問,分用不同的Session,為了使重定向后保留使用原來的Session,必須對應(yīng)用服務(wù)器的Cookie 域名進(jìn)行相應(yīng)的設(shè)置。
以上問題均可在程序設(shè)計中解決。
通過程序自身實(shí)現(xiàn)協(xié)議重定向,就可以把要求嚴(yán)格保護(hù)的那部分資源與其他普通數(shù)據(jù)從邏輯上分開處理,使得要求使用SSL的資源和不需要使用SSL的資源各取所需,避免浪費(fèi)網(wǎng)站的系統(tǒng)資源。