有個(gè)兄弟在做Weblogic Cluster與Apache Proxy的SSL,他的問(wèn)題是,當(dāng)部署在Weblogic中的Web應(yīng)用使用了SSL重定向(比如但你要訪問(wèn)Weblogic的關(guān)鍵資源的時(shí)候,你需要重定向到SSL),比如下面的標(biāo)準(zhǔn)J2EE的Web.xml部署:
<?xml version="1.0" encoding="UTF-8"?>
<web-app id="WebApp_ID" version="2.4"
?xmlns="?xmlns:xsi="?xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee?<display-name>ssl</display-name>
?<welcome-file-list>
??<welcome-file>index.html</welcome-file>
??<welcome-file>index.htm</welcome-file>
??<welcome-file>index.jsp</welcome-file>
??<welcome-file>default.html</welcome-file>
??<welcome-file>default.htm</welcome-file>
??<welcome-file>default.jsp</welcome-file>
?</welcome-file-list>
?<security-constraint>
??<display-name>Example SSL Security Constraint</display-name>
??<web-resource-collection>
???<web-resource-name>SSL Protected Area</web-resource-name>
???<url-pattern>/protected/*</url-pattern>
??</web-resource-collection>
??<user-data-constraint>
???<transport-guarantee>CONFIDENTIAL</transport-guarantee>
??</user-data-constraint>
?</security-constraint>
</web-app>
由于當(dāng)前的URL到達(dá)了/propected,Web服務(wù)器發(fā)現(xiàn)客戶(hù)端還是走HTTP 7001方式,它會(huì)向客戶(hù)端發(fā)送HTTP 302,重定向客戶(hù)端到SSL端口,比如7002,但當(dāng)我們對(duì)Weblogic集群使用了Proxy的時(shí)候,這可能有一點(diǎn)點(diǎn)麻煩。
我們首先需要配置Weblogic的各個(gè)Managed Server,比如HTTP端口都是7001,SSL端口都是7002,然后配置一個(gè)由Weblogic提供給apache的proxy包(一個(gè)叫做mod_wl_20.so的文件),然后在Apache加載它,再提供幾個(gè)簡(jiǎn)單的參數(shù),便可以Run起來(lái),為了讓一切變得很簡(jiǎn)單,我們可以分開(kāi)兩步來(lái)走:
1,先配通HTTP方式
2,提供SSL方式
針對(duì)1,其實(shí)那是3分鐘的事情
1.1 找到Weblogic中的mod_wl_20.so,放在%BEA_HOME%\weblogic81\server\bin,copy到Apache 2.0的modules目錄
1.2 在httpd.conf中增加下面的配置:
LoadModule weblogic_module modules/mod_wl_20.so
<IfModule mod_weblogic.c>
WebLogicCluster sourcesite:8001,destsite:8001
MatchExpression *
</IfModule>
注意,sourcesite:8001,destsite:8001是我在另外兩臺(tái)機(jī)器上的Managed Server,針對(duì)所有類(lèi)型資源的訪問(wèn)請(qǐng)求,都會(huì)被Apache轉(zhuǎn)發(fā)Weblogic集群上去。然后,重啟Apache,測(cè)試一下。
針對(duì)步驟2,需要注意一些問(wèn)題,首先是要配置SSL的信任關(guān)系,也就是,Apache Proxy轉(zhuǎn)發(fā)請(qǐng)求的時(shí)候,會(huì)驗(yàn)證服務(wù)器的身份,因此,我們配置一套Java證書(shū)庫(kù),我是用XCA和SecureXRCP(http://m.tkk7.com/security/archive/2007/01/07/SecureXRCP.html)去完成的,圖形化操作比Openssl的純命令行要方便很多。
2.1 創(chuàng)建證書(shū)庫(kù)
首先,創(chuàng)建一個(gè)CA,它包括了cskey.pem的私鑰(保護(hù)密碼是weblogic)
-----BEGIN RSA PRIVATE KEY-----
Proc-Type: 4,ENCRYPTED
DEK-Info: DES-EDE3-CBC,829FBE604B9F2544
ej6WSSIsZVw+xU+ihKt4wkz+aGODjFp0vp4Gh+nUjLmWxc9oLgVr4gLzvveop0pk
q1IyfriedXd2OK2etxkcTC0jRQQBs5r83UjCo+DV2bWsbgh+9fSekuRSoGBIbZC+
tjuctihk4tenN5o7jygdI55k9ncH6O486X50aGgiRblzzk4GoYQfQn+2Hksso99T
pzYZdP9KSN0FVHl7D+Zt/oKBw68kIYLV7n+Z2h8LPTW/w6c5rdnCylQZrPfu9ses
b753HI0tcYgtE3ExmEbRhPgzITVGdA+crzEcxlmMxxjknnpg2VJiItlDpEyBXyQ8
1wFB3inxQoqkrttuxLUZLjo+d3OSUZwEy0it/8oZWj5D1cnfafwOXaKuj7ys0FwF
nPoD4Oz5hKfyEFdxXzDm+PKNRT39aYYcWYe73wws75nP3Dj5qfGJCZXzG0Pqbltm
EZH4vJbV+vU75tX5fNo32UZNTKW5d0/jCIFWz5KjFl/7Ohra698FAlAiMMspcMUt
9FNCKV8jT1Ntrxpp/KSauZHjkW7hUeXLsUp/NTIhPCZnzsjIM6zKCm9rCwyAXbav
Rn2g1chzZKUj6RhRTEi8iYX6gKt6om9MEDewEu0EweZiJQ5M5efS8qUMJA+CYXUQ
o2XM5J7blqBETcO8j/dgM1/DPnmLOkZdHgeNssVgld50vEbQN89W6w39H0DSre65
TEFr9oMeJhWWavrh4bcdYn190kku5ZorMZqsacQqeoCznQw017FyyvzGzAy75s3s
v8Wyea7egQ8YEsO5ecdyNxXY+eTKa1HNNbxqWPUcAB67EjXniiCzEkd4mOB/BQIv
yQE8JofXemruflGvBXdBuPOzPWD0pY5FvnFzl6YhrOoMWuC02Fcr/X+a3MGnJPep
9krtXbBQ318MOdeDwkk8dcm+8U76PHuLgWYG+Y7FGiqrHCi1EafHqlxM6jMetaX5
Hjomj6gME1bpnOFzFEo1d74JwNF7Zf73PQZvWV3LGv/HmxXC+KQDi9SfRaFIKgtE
syr3iVAMHauiIbL4vVGLE4sg+JgApYdNhuy1USz3Dxp0+NtOU6CUAeNNHVqS7+uF
eP5PGoMplCF+7pPBUhqiRePVTrId+TuYKPfSBfW1MZ/5YYTzRUiMS14FmB49Ds7T
xyODF4tVpV1j2IxyCAffYdEXOYDn0A13xu5pvU17R9Sd0XtHvq3uOHAtN8A6GQFy
Wt5KesqCj179nSRMlBxs4NhjHmwerhLdIIMIDVROulYh0Abfq9kqTdiqqDnrmV+d
93BDcc/wGq0OZNmMyqK4tmtz8KA520feBA9u9eT5j9MSsm/SWVorrjpPI8JBvqcg
kb0PpQyvP6CcGMkpXDhE/AYEkAiT86fxpAXJnHvQIXRd6p7GscDnQ5AKj+hRro9J
yyL1yrB9vih4xGUiTRycTiT+6LEuH9dWnlKyyv2pRfC0XMVHqJZ760bnjDuFPR2E
6guobsKQx9pnEQGZa7VIJqN/DXmgzVHUTRvz7Pby9k8fS8Jc3iDVeZ2k/4tbbbeG
SmNdQ2NVHwGAa0sDIb0vG7YYG6G2oD8R1EHG71MwZekTQaC7VFpJwg==
-----END RSA PRIVATE KEY-----
以及其對(duì)應(yīng)的公開(kāi)證書(shū)cs.pem
-----BEGIN CERTIFICATE-----
MIIFDjCCA/agAwIBAgIBATANBgkqhkiG9w0BAQQFADBxMQswCQYDVQQDEwJDUzEL
MAkGA1UEBhMCQ04xCzAJBgNVBAcTAkdaMQswCQYDVQQIEwJHRDELMAkGA1UEChMC
Q1MxDzANBgNVBAsTBk9OU0lURTEdMBsGCSqGSIb3DQEJARYOZGh1YW5nQGJlYS5j
b20wHhcNMDcwMTAzMDI0MTQ2WhcNMTYxMjMxMDI0MTQ2WjBxMQswCQYDVQQDEwJD
UzELMAkGA1UEBhMCQ04xCzAJBgNVBAcTAkdaMQswCQYDVQQIEwJHRDELMAkGA1UE
ChMCQ1MxDzANBgNVBAsTBk9OU0lURTEdMBsGCSqGSIb3DQEJARYOZGh1YW5nQGJl
YS5jb20wggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDLCKfrRzEcAwAd
yt1os1vfNJ5dyYDwRqYaUB2n1hPmu7jchVDm8HHlLhZSxyK21rKlcfnrGnPLKWfY
amNP1azmNYbJPDBtfa0rYmn2u33qqXxW61fB3UnSALoFwZ5eNG/vyesaPW+ok63k
z+t+gUyzFXIfuPTVuJbdTkZtO1v44I6Wl0aWjxKpCJZSbw7PVD2g5dqoY2HaJN0W
ZvnMY9e8MLNc0fSeyGhEp6N8NKKAn15prQ6wpudAG3HNuSrMYZTJqKffiSQCJEFe
0UfI/AFQuPw7xk2d2wDMBKJOHxUtMtsUJ4pcxie0L7WSnU2YO3yVMCeLVJHp4JJ1
EbS4jLUTAgMBAAGjggGvMIIBqzASBgNVHRMBAf8ECDAGAQH/AgECMB0GA1UdDgQW
BBQnpgv2gTClymABt62gsGyPtTm/bzCBmwYDVR0jBIGTMIGQgBQnpgv2gTClymAB
t62gsGyPtTm/b6F1pHMwcTELMAkGA1UEAxMCQ1MxCzAJBgNVBAYTAkNOMQswCQYD
VQQHEwJHWjELMAkGA1UECBMCR0QxCzAJBgNVBAoTAkNTMQ8wDQYDVQQLEwZPTlNJ
VEUxHTAbBgkqhkiG9w0BCQEWDmRodWFuZ0BiZWEuY29tggEBMAsGA1UdDwQEAwIB
BjARBglghkgBhvhCAQEEBAMCAAcwHQYJYIZIAYb4QgECBBAWDnd3dy5wZ3Aub3Jn
LmNuMB0GCWCGSAGG+EIBAwQQFg53d3cucGdwLm9yZy5jbjAdBglghkgBhvhCAQQE
EBYOd3d3LnBncC5vcmcuY24wHQYJYIZIAYb4QgEHBBAWDnd3dy5wZ3Aub3JnLmNu
MB0GCWCGSAGG+EIBCAQQFg53d3cucGdwLm9yZy5jbjAdBglghkgBhvhCAQ0EEBYO
d3d3LnBncC5vcmcuY24wDQYJKoZIhvcNAQEEBQADggEBAANNRHl+xc7lbLAIW8HK
cNRJcSqYuUaPgLpMEZw5AnWngbUgs5KOYPCHpfft34DxrFsArV3fOiyhmznQE2f+
BmX8afaDprlq4y4J5GZJz9b+comZEQgbhLqTvZcMW9JuHcIYB7eyvrMam8CEX/qZ
asvYRnworD+LtzYRv9EFUfDPFtkxPpAZBFQJngE5icWI0HdG8W7rWQSOHq+FZxRi
Zz70T97MEtU/MUZb6nDIVleaKB8o2OrSlJRP7ENYV9ueL3tKm7ZlZLbFEHLoyCeF
c2qJp8d1BVx3n1unVABcZbGIFVwxXQqKhtmgd6pLbAfzd1lR6Yhd2p+yTZEvpAqG
ErE=
-----END CERTIFICATE-----
因?yàn)閜em是文本格式,讀者可以直接copy上面的文本然后各自保存為pem后綴名的文件即可使用!
有了CA,各位就可以為Weblogic集群中的所有Managed Server創(chuàng)建對(duì)應(yīng)的證書(shū)庫(kù)(我說(shuō)的當(dāng)然是Identity證書(shū)庫(kù))。
用SecureXRCP為每個(gè)Managed Server new一個(gè)證書(shū)庫(kù),然后創(chuàng)建密鑰對(duì),然后用私鑰去創(chuàng)建一個(gè)
CSR(證書(shū)請(qǐng)求),保存為一個(gè)文件,再用XCA去對(duì)這個(gè)文件簽名(用上述的cskey.pem,你需要往XCA導(dǎo)入上面的
PEM,也可以用你以前創(chuàng)建的CA根私鑰)。
Note:如果讀者對(duì)XCA用法不是很熟悉,可以閱讀Weblogic Security In Action的中篇
http://dev2dev.bea.com.cn/bbs/thread.jspa?forumID=81&threadID=26770&tstart=0
或者直接使用Openssl,Openssl的安裝使用可以參考
http://m.tkk7.com/Files/openssl/%e7%ac%ac15%e7%ab%a0%20OpenSSL%e5%9f%ba%e6%9c%ac%e6%a6%82%e5%bf%b5.rar
http://m.tkk7.com/Files/openssl/%e7%ac%ac14%e7%ab%a0%20OpenSSL%e7%bc%96%e8%af%91%e5%92%8c%e5%ae%89%e8%a3%85.rar
我在我的Weblogic Cluster中有兩臺(tái)被管Server,因此我分別創(chuàng)建了兩個(gè)證書(shū)庫(kù)
sourcesite.jks
destsite.jks
然后導(dǎo)出了兩個(gè)簡(jiǎn)單的csr,用XCA中的CS私鑰Sign了之后,便有了兩個(gè)證書(shū)(這個(gè)步驟跟你去VeriSign提交CSR和獲取證書(shū)一模一樣)
從XCA,你導(dǎo)出了兩個(gè)der格式的證書(shū),在SecureRCP中再針對(duì)上面兩個(gè)JKS證書(shū)庫(kù)分別Import CA Reply(就是sourcesite.der和destsite.der),
就完成了證書(shū)庫(kù)的創(chuàng)建。
OK,看看我們現(xiàn)在有些什么文件(這些文件大家可以在本文附件中找到)。
CS.der
CSKey.pem
cs.jks
cs.pem
destsite.csr
destsite.der
destsite.jks
sourcesite.csr
sourcesite.der
sourcesite.jks
其中,對(duì)于Weblogic被管Server來(lái)說(shuō),需要的是sourcesite.jks(用作Identity JKS),cs.jks里面只有一個(gè)cs.der,它可以用作Weblogic Server的Trust JKS。
對(duì)于Apache Proxy,它需要cs.der,即信任CA的根證書(shū),但由于Apache Proxy是PEM格式Prefer的,因此,請(qǐng)用weblogic的der2pem命令去轉(zhuǎn)換一下cs.der為cs.pem。
準(zhǔn)備好證書(shū)庫(kù)以及證書(shū)等瑣碎事情之后,可以繼續(xù)配置Apache SSL。
2.2? 配置Apache信任Weblogic集群
修改上面提到的Apache的httpd.conf:
LoadModule weblogic_module modules/mod_wl_20.so
LoadModule ssl_module modules/mod_ssl.so
<IfModule mod_ssl.c>
??? Include conf/ssl.conf
</IfModule>
<Location "/examplesWebApp">
? SetHandler weblogic-handler
</Location>
<Location "/ssl">
? SetHandler weblogic-handler
</Location>
<IfModule mod_weblogic.c>
WebLogicCluster sourcesite:8002,destsite:8002
SecureProxy ON
TrustedCAFile C:\CertGen\CS\cs.pem
RequireSSLHostMatch false
Debug ALL
WLLogFile C:\Apache2\Apache2\logs\wls_proxy_server.txt
</IfModule>
首先,你需要用LoadModule加載ssl以及weblogic提供給apache的mod。
其次,打開(kāi)SecureProxy(Set ON),然后Apache會(huì)將前端的所有請(qǐng)求轉(zhuǎn)發(fā)給Apache信任的ManagedServer(包括sourcesite, destsite兩個(gè)節(jié)點(diǎn),前提是這兩個(gè)節(jié)點(diǎn)上的ManagedServer擁有TrustedCAFile信任的CA所簽發(fā)的證書(shū)/私鑰,即sourcesite.der和destsite.der)。
最后,我們看看httpd.conf同一目錄下的ssl.conf文件,增加一個(gè)虛擬主機(jī)的配置即可:
<VirtualHost _default_:8002>
DocumentRoot "c:/apache/htdocs"
ServerName adserver:8002
ServerAdmin dhuang@bea.com
ErrorLog logs/error_log
TransferLog logs/access_log
SSLEngine on
SSLCipherSuite ALL:!ADH:!EXPORT56:RC4+RSA:+HIGH:+MEDIUM:+LOW:+SSLv2:+EXP:+eNULL
SSLCertificateFile conf/ssl.key/server.crt
SSLCertificateKeyFile conf/ssl.key/server.key
<FilesMatch "\.(cgi|shtml|phtml|php3?)$">
??? SSLOptions +StdEnvVars
</FilesMatch>
<Directory "c:/apache/cgi">
??? SSLOptions +StdEnvVars
</Directory>
SetEnvIf User-Agent ".*MSIE.*" \
???????? nokeepalive ssl-unclean-shutdown \
???????? downgrade-1.0 force-response-1.0
CustomLog logs/ssl_request_log \
????????? "%t %h %{SSL_PROTOCOL}x %{SSL_CIPHER}x \"%r\" %b"
</VirtualHost>?
注意:下面的私鑰、證書(shū)可以獨(dú)立用Openssl生成,用SecureRCP或XCA也可以,但要注意,私鑰不能加密,因?yàn)锳pache可能不支持私鑰解密。
SSLCertificateFile conf/ssl.key/server.crt
SSLCertificateKeyFile conf/ssl.key/server.key
有些朋友可能會(huì)問(wèn)到,如果我一個(gè)sourcesite上有兩個(gè)Managed Server, 分別使用8002和8004兩個(gè)SSL端口,怎么辦?
那就需要配置兩個(gè)虛擬主機(jī),增加一個(gè)
<VirtualHost _default_:8004>
DocumentRoot "c:/apache/htdocs"
ServerName adserver:8004
ServerAdmin dhuang@bea.com
ErrorLog logs/error_log
TransferLog logs/access_log
SSLEngine on
SSLCipherSuite ALL:!ADH:!EXPORT56:RC4+RSA:+HIGH:+MEDIUM:+LOW:+SSLv2:+EXP:+eNULL
SSLCertificateFile conf/ssl.key/server.crt
SSLCertificateKeyFile conf/ssl.key/server.key
<FilesMatch "\.(cgi|shtml|phtml|php3?)$">
??? SSLOptions +StdEnvVars
</FilesMatch>
<Directory "c:/apache/cgi">
??? SSLOptions +StdEnvVars
</Directory>
SetEnvIf User-Agent ".*MSIE.*" \
???????? nokeepalive ssl-unclean-shutdown \
???????? downgrade-1.0 force-response-1.0
CustomLog logs/ssl_request_log \
????????? "%t %h %{SSL_PROTOCOL}x %{SSL_CIPHER}x \"%r\" %b"
</VirtualHost>?
這樣,Weblogic Managed Server重定向SSL的時(shí)候, Apache必須識(shí)別來(lái)自用戶(hù)的8002、8004的SSL請(qǐng)求。
最后,配置完畢,我們看看問(wèn)題是如何被解決的:
#1,用戶(hù)訪問(wèn)Apache Proxy http://adserver/ssl
#2,Apache Proxy轉(zhuǎn)發(fā)請(qǐng)求給Managed Server sourcesite,http://sourcesite:8001/ssl
#3,http://sourcesite:8001/ssl返回頁(yè)面,頁(yè)面有一個(gè)protected的鏈接
#4,Apache Proxy轉(zhuǎn)發(fā)響應(yīng)給用戶(hù)
#5,用戶(hù)看到Protected鏈接,點(diǎn)擊它(http://adserver/ssl/protected)
#6,Apache Proxy轉(zhuǎn)發(fā)protected請(qǐng)求給Managed Server sourcesite,http://sourcesite:8001/ssl/protected
#7,ManagedServer發(fā)現(xiàn)是protected HTTP請(qǐng)求,要求做SSL,返回HTTP 302,要用https://sourcesite:8002/ssl/protected
#8,Apache Proxy轉(zhuǎn)發(fā)響應(yīng)給用戶(hù)
#9,是IE而不是用戶(hù)代替用戶(hù)處理了HTTP 302的重定向,提交給https://adserver:8002/ssl/protected給Apache
#10,由于你配置了上面的針對(duì)SSL的虛擬主機(jī),Apache會(huì)繼續(xù)為你效勞,轉(zhuǎn)發(fā)給sourcesite,https://sourcesite:8002/ssl/protected,
#11,ManagedServer發(fā)現(xiàn)是protected SSL請(qǐng)求,That's OK,返回正確的響應(yīng), HelloWorld!
本來(lái)有一些SSL握手動(dòng)作在Apache與ManagedServer通訊之前發(fā)生,但都無(wú)非是ManagedServer向Proxy提交自己的證書(shū)的過(guò)程,只要Managed Server的證書(shū)確實(shí)被CS這個(gè)CA簽發(fā)過(guò),則可以確保后面的請(qǐng)求繼續(xù),否則Apache會(huì)終止與該Managed Server通訊!
所需的證書(shū),私鑰以及證書(shū)庫(kù)可以在該文件中找到
http://m.tkk7.com/Files/security/CS.rar
?