錦上添花:為最佳JSP服務(wù)器Resin加上SSL認(rèn)證
原創(chuàng)【51CTO.com 獨(dú)家特稿】Resin主要是作為WEB服務(wù)器的jsp/servlets運(yùn)行平臺(tái)。它支持許多WEB服務(wù)器軟件,而且是完全免費(fèi)的,并提供了對(duì)SUN的J2EE的支持,這要比其它相關(guān)的java和javascript開(kāi)發(fā)和運(yùn)行平臺(tái)要好的多,而且速度非???,并提供服務(wù)器端直接開(kāi)發(fā)、編譯和運(yùn)行。因此,Resin受到了許多應(yīng)用JSP的WEB站點(diǎn)的支持。
對(duì)于任何一種WEB站點(diǎn)來(lái)說(shuō),不管使用何種方式的開(kāi)發(fā)平臺(tái),運(yùn)行后最關(guān)鍵的問(wèn)題之一就是解決服務(wù)器與用戶之間的安全問(wèn)題。而對(duì)于WEB站點(diǎn)與用戶會(huì)話過(guò)程中數(shù)據(jù)的機(jī)密性保護(hù),目前最好的解決方式主要是使用SSL技術(shù)來(lái)進(jìn)行。由于Resin具有的上述優(yōu)點(diǎn)使得它越來(lái)越受歡迎,使用它的WEB站點(diǎn)也就越來(lái)越多。
但是,通常狀態(tài)下,Resin并不對(duì)SSL請(qǐng)求做出任何的回應(yīng)。如果我們需要使用SSL來(lái)增加站點(diǎn)與用戶之間的數(shù)據(jù)傳輸?shù)陌踩?,我們就必需?jīng)過(guò)一系列的操作來(lái)讓Resin提供對(duì)SSL加密的支持。
一、 在WEB服務(wù)器中使用OpenSSL套件
1、安裝OpenSSL
想要Resin可以響應(yīng)SSL請(qǐng)求,我們就必需保證WEB服務(wù)器上已經(jīng)安裝好了相關(guān)的SSL套件。對(duì)于中小企業(yè)來(lái)說(shuō),開(kāi)源免費(fèi)的OpenSSL提供與SSL相同的認(rèn)證功能。
OpenSSL的Linux版本可以在www.openssl.org網(wǎng)站上下載。現(xiàn)在它的最新版本是OpenSSL 0.9.8j。
Resin通過(guò)它的libexec/libresinssl.so JNI庫(kù)文件提供對(duì)OpenSSL的支持。如果是在類Linux系統(tǒng)下使用OpenSSL,在安裝時(shí)可以通過(guò)下列命令將它安裝到指定的位置:
./configure --with-openssl=/usr/local/ssl
如果我們是在Windows系統(tǒng)中使用Resin,那么,我們同樣需要在此操作系統(tǒng)下先安裝好OpenSSL。Windows下的OpenSSL在www.slproweb.com/products/Win32OpenSSL.html下載,它的最新安裝文件是Win32OpenSSL-0_9_8j.exe,其大小為7MB左右。
在Windows系統(tǒng)下,Resin的resinssl.dll文件中包含提供對(duì)OpenSSL支持的代碼。(在Resin3.0以前的版本是通過(guò)resin.dll文件提供支持的。)因此,在Windows系統(tǒng)下只需要安裝好OpenSSL就可以讓Resin使用它了。OpenSSL在Windows系統(tǒng)下很容易安裝,就如同安裝其它的應(yīng)用程序一樣簡(jiǎn)單。
不過(guò),在Windows系統(tǒng)下安裝完OpenSSL后,還應(yīng)當(dāng)將一些需要的DLL文件復(fù)制到Resin的根目錄當(dāng)中?,F(xiàn)在假設(shè)Resin安裝在c:\resin-3.2.1目錄,OpenSSL安裝在c:\Program Files\GnuWin32目錄?,F(xiàn)在打開(kāi)系統(tǒng)開(kāi)始菜單的“運(yùn)行”對(duì)話框,在運(yùn)行框中輸入CMD命令,回車后進(jìn)入命令行終端界面。然后在命令行終端下就可以通過(guò)下列所示的命令將OpenSSL安裝目錄下的相關(guān)文件復(fù)制到Resin的根目錄下:
cd resin-3.2.1
copy c:\Program Files\GnuWin32\bin\libssl32.dll c:\resin-3.2.1\libssl32.dll
copy c:\Program Files\GnuWin32\bin\libeay32.dll c:\resin-3.2.1\libeay32.dll
2、生成SSL認(rèn)證私鑰
SSL認(rèn)證的密鑰由OpenSSL來(lái)生成,生成后的密鑰應(yīng)當(dāng)保存到相應(yīng)的Resin目錄中。因此,在生成密鑰前,我們可以在Resin根目錄中創(chuàng)建一個(gè)keys子目錄用來(lái)保存將要?jiǎng)?chuàng)建的密鑰。在類Linux系統(tǒng)下,我們可以通過(guò)下列方式來(lái)創(chuàng)建keys目錄:
cd /resin
mkdir keys
在Windows系統(tǒng)下,我們可以在資源管理器中直接在Resin根目錄下創(chuàng)建一個(gè)新文件夾,并命名為keys即可。
在生成密鑰時(shí),OpenSSL會(huì)根據(jù)其配置文件中設(shè)置的內(nèi)容來(lái)生成。在類Linux系統(tǒng)下,這個(gè)缺省的配置文件可能在usr/ssl/openssl.cnf或/usr/share/ssl/openssl.cnf下。而Windows系統(tǒng)中不存在這樣的文件。
當(dāng)然,我們還可以自己創(chuàng)建一個(gè)相應(yīng)的配置文件保存到Resin/keys/目錄下。這樣,在創(chuàng)建密鑰時(shí),OpenSSL也會(huì)根據(jù)這個(gè)配置文件中的內(nèi)容來(lái)創(chuàng)建,而且,在創(chuàng)建密鑰時(shí)不會(huì)要求我們根據(jù)提示輸入缺省的相關(guān)信息了。
下面是一個(gè)openssl.cnf配置文件的相關(guān)內(nèi)容實(shí)例:
[ req ]
default_bits = 1024 #在這里填入加密鍵的缺省位數(shù)
distinguished_name = req的名稱
[ req_distinguished_name ]
C = 在這里填入國(guó)家的代碼,例如CN,代表中國(guó)
C_default =
ST = 這里填寫州或省名稱
ST_default =
L = 城市
L_default =
O = 企業(yè)或機(jī)構(gòu)名稱
O_default =
OU = 組織中某個(gè)部門的名稱,例如市場(chǎng)部
OU_default =
CN = 我們的網(wǎng)站域名,必需是全名,例如www.myweb.com
CN_default =
emailAddress = 聯(lián)系的E-Mail郵箱地址
emailAddress_default =
完成OpenSSL配置文件的相關(guān)設(shè)置后,我們就可以開(kāi)始為SSL認(rèn)證創(chuàng)建一個(gè)私鑰。在WEB服務(wù)器上創(chuàng)建私鑰時(shí),會(huì)要求我們輸入相應(yīng)的密碼,這個(gè)密碼將會(huì)在我們使用創(chuàng)建的私鑰時(shí)要求被輸入。因此要牢記這個(gè)密碼并妥善地保管它。我們還必需將這個(gè)密碼加入到Resin的配置文件當(dāng)中。
在類Linux系統(tǒng)下創(chuàng)建私鑰時(shí),私鑰的文件名可以由我們自己決定,可以通過(guò)下列所示命令來(lái)完成:
openssl genrsa -des3 -out myprikey.key 1024
在Windows系統(tǒng)下創(chuàng)建私鑰。得先進(jìn)入命令行終端界面,然后用CD命令切換到OpenSSL安裝目錄,再用下列命令產(chǎn)生私鑰;
c:\Program Files\GnuWin32\bin\openssl.exe genrsa -des3 -out myprikey.key 1024
二、 創(chuàng)建或申請(qǐng)SSL證書:
為了能夠加密與用戶的會(huì)話數(shù)據(jù),我們還必需為SSL認(rèn)證創(chuàng)建或申請(qǐng)一個(gè)公鑰證書。這個(gè)公鑰證書在使用時(shí)會(huì)由Resin發(fā)送給用戶的瀏覽器,以便瀏覽器能夠加密其發(fā)送的數(shù)據(jù)。公鑰證書可以由OPENSSL產(chǎn)生一個(gè)自簽名證書,也可以到第三方SSL證書頒發(fā)機(jī)構(gòu)申請(qǐng)一個(gè)公鑰證書。要注意的是,自簽名證書將不能被其瀏覽器所承認(rèn)。
1、創(chuàng)建一個(gè)自簽名證書
當(dāng)我們只是用來(lái)測(cè)試WEB服務(wù)器的SSL安全連接,或者只是作為企業(yè)遠(yuǎn)程辦公之用時(shí),那么創(chuàng)建一個(gè)自簽名證書將會(huì)為我們節(jié)省一筆小錢。但是,對(duì)于這樣的自簽證書,WEB瀏覽器是不會(huì)承認(rèn)的,還會(huì)為此彈出一個(gè)警告框來(lái)提醒用戶這個(gè)證書不是一個(gè)公認(rèn)的SSL證書。不過(guò),用戶瀏覽器與WEB服務(wù)器之間的會(huì)話數(shù)據(jù)仍然是被SSL加密了的。
在類Linux系統(tǒng)下創(chuàng)建自簽名證書,可以使用下列命令來(lái)完成:
openssl req -config ./openssl.cnf -new -key myprikey.key -x509 -out myself.crt
在Windows系統(tǒng)下創(chuàng)建自簽名證書,在字符終端用CD命令進(jìn)入OpenSSL安裝目錄后,可以通過(guò)下列命令完成:
c:\Program Files\GnuWin32\bin\openssl.exe req -config ./openssl.cnf -new -key myprikey.key -x509 -out myself.crt
其中,自簽名證書的名稱可以由我們自己決定,例在本例中為myself.crt,而“-key”參數(shù)后帶的鍵文件是在上面我們創(chuàng)建的私鑰文件,而命令中的“./openssl.cnf”表示當(dāng)前目錄下的OpenSSL的配置文件。
如果我們沒(méi)有按前文所述方式生成一個(gè)OpenSSL配置文件,或者沒(méi)有修改此配置文件中的缺少配置值,那么在創(chuàng)建過(guò)程中會(huì)要求我們提供一些基本的與WEB服務(wù)器相關(guān)的身份資料,例如企業(yè)名稱和網(wǎng)站域名等信息。
2、創(chuàng)建一個(gè)證書請(qǐng)求文件
如果要使用第三方證書頒發(fā)機(jī)構(gòu)上的證書,那么就必需先創(chuàng)建一個(gè)證書請(qǐng)求文件(CSR)。這個(gè)證書請(qǐng)求文件中包含有證書的公鑰、企業(yè)名稱、加密位數(shù)、地址和網(wǎng)站域名等信息。
當(dāng)我們?cè)诘谌阶C書頒發(fā)機(jī)構(gòu)上申請(qǐng)證書時(shí),就會(huì)要求我們提交這個(gè)證書請(qǐng)求文件,然后,證書頒發(fā)機(jī)構(gòu)才能將SSL證書頒發(fā)給我們?,F(xiàn)在提供SSL證書的機(jī)構(gòu)有許多,例如VeriSign公司就是其中最著名的代表。在生成證書請(qǐng)求文件時(shí)一定要注意,我們使用什么樣的WEB服務(wù)器軟件,就必需生成與它相兼容的證書請(qǐng)求文件,這樣,SSL證書頒發(fā)機(jī)構(gòu)頒發(fā)給我們的證書才能在此WEB服務(wù)器下使用。
在Linux系統(tǒng)下生成證書請(qǐng)求文件,可以使用下列命令達(dá)到目的:
openssl req -new -config ./openssl.cnf -key myprikey.key -out myprikey.csr
在Windows系統(tǒng)下生成證書請(qǐng)求文件,在命令行界面中通過(guò)CD命令進(jìn)入OpenSSL安裝目錄后,通過(guò)下列命令來(lái)完成證書請(qǐng)求文件的生成:
c:\Program Files\GnuWin32\bin\openssl.exe req -new -config ./openssl.cnf -key myprikey.key –out myprikey.csr
證書請(qǐng)求文件的文件名可以由我們自己來(lái)決定,在本文中為myprikey.csr。在生成證書請(qǐng)求文件過(guò)程中會(huì)要求我們輸入一些與WEB服務(wù)器身份相關(guān)的信息,例如網(wǎng)站域名和企業(yè)名稱等。我們必需按要求如實(shí)填寫。
當(dāng)我們成功注冊(cè),并支付相應(yīng)的年使用費(fèi)之后,這些證書頒發(fā)機(jī)構(gòu)就會(huì)將SSL證書發(fā)送到我們填寫的電子郵箱當(dāng)中。
三、 配置Resin使用私鑰和SSL證書
要想Resin能夠使用SSL認(rèn)證,我們還必需對(duì)其配置文件resin.conf做相應(yīng)的設(shè)置。具體要配置的內(nèi)容包括:
...
其中,
四、 測(cè)試Resin的SSL加密連接
當(dāng)我們配置好Resin的SSL認(rèn)證后,我們還可以通過(guò)一些方式來(lái)檢驗(yàn)我們的配置是否正確。
在Windows系統(tǒng)下,我們就可以通過(guò)在WEB瀏覽器地址欄中輸入https://URL(企業(yè)網(wǎng)站的域名)的方式,來(lái)驗(yàn)證WEB服務(wù)器是否對(duì)這樣的URL地址做出正確響應(yīng)。如果返回正常的內(nèi)容,并且在WEB瀏覽器地址欄中顯示出一個(gè)掛鎖的標(biāo)志,那么,Resin的SSL配置就算成功了。
在Linux系統(tǒng)下,除了可以上述方式來(lái)檢驗(yàn)外,還可以通過(guò)下列方式來(lái)驗(yàn)證:
openssl s_client -connect www.myweb.com:443 –prexit
另外,我們還可以通過(guò)下列的JSP腳本來(lái)快速驗(yàn)證Resin是否對(duì)SSL做出反應(yīng):
Secure? <%= request.isSecure() %>
經(jīng)過(guò)上述的檢驗(yàn)操作后,如果都能得到WEB服務(wù)器的正確響應(yīng),那么就說(shuō)明Resin已經(jīng)能夠提供對(duì)SSL技術(shù)的支持了。
也就是說(shuō),當(dāng)用戶通過(guò)WEB瀏覽器向WEB服務(wù)器發(fā)送一個(gè)SSL請(qǐng)求時(shí),Resin就會(huì)為這個(gè)WEB瀏覽器提供SSL認(rèn)證的公共密鑰,然后,這個(gè)WEB瀏覽器就可以使用這個(gè)公共密鑰來(lái)加密數(shù)據(jù),而Resin將使用WEB服務(wù)器的SSL私鑰對(duì)加密的數(shù)據(jù)進(jìn)行解密。
【51CTO.COM 獨(dú)家特稿,轉(zhuǎn)載請(qǐng)注明出處及作者!】
【編輯推薦】