[原創(chuàng)]Apache Proxy with Weblogic Cluster under SSL
有個兄弟在做Weblogic Cluster與Apache Proxy的SSL,他的問題是,當(dāng)部署在Weblogic中的Web應(yīng)用使用了SSL重定向(比如但你要訪問Weblogic的關(guān)鍵資源的時候,你需要重定向到SSL),比如下面的標準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到達了/propected,Web服務(wù)器發(fā)現(xiàn)客戶端還是走HTTP 7001方式,它會向客戶端發(fā)送HTTP 302,重定向客戶端到SSL端口,比如7002,但當(dāng)我們對Weblogic集群使用了Proxy的時候,這可能有一點點麻煩。
我們首先需要配置Weblogic的各個Managed Server,比如HTTP端口都是7001,SSL端口都是7002,然后配置一個由Weblogic提供給apache的proxy包(一個叫做mod_wl_20.so的文件),然后在Apache加載它,再提供幾個簡單的參數(shù),便可以Run起來,為了讓一切變得很簡單,我們可以分開兩步來走:
1,先配通HTTP方式
2,提供SSL方式
針對1,其實那是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是我在另外兩臺機器上的Managed Server,針對所有類型資源的訪問請求,都會被Apache轉(zhuǎn)發(fā)Weblogic集群上去。然后,重啟Apache,測試一下。
針對步驟2,需要注意一些問題,首先是要配置SSL的信任關(guān)系,也就是,Apache Proxy轉(zhuǎn)發(fā)請求的時候,會驗證服務(wù)器的身份,因此,我們配置一套Java證書庫,我是用XCA和SecureXRCP(http://www.aygfsteel.com/security/archive/2007/01/07/SecureXRCP.html)去完成的,圖形化操作比Openssl的純命令行要方便很多。
2.1 創(chuàng)建證書庫
首先,創(chuàng)建一個CA,它包括了cskey.pem的私鑰(保護密碼是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-----
以及其對應(yīng)的公開證書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-----
因為pem是文本格式,讀者可以直接copy上面的文本然后各自保存為pem后綴名的文件即可使用!
有了CA,各位就可以為Weblogic集群中的所有Managed Server創(chuàng)建對應(yīng)的證書庫(我說的當(dāng)然是Identity證書庫)。
用SecureXRCP為每個Managed Server new一個證書庫,然后創(chuàng)建密鑰對,然后用私鑰去創(chuàng)建一個
CSR(證書請求),保存為一個文件,再用XCA去對這個文件簽名(用上述的cskey.pem,你需要往XCA導(dǎo)入上面的
PEM,也可以用你以前創(chuàng)建的CA根私鑰)。
Note:如果讀者對XCA用法不是很熟悉,可以閱讀Weblogic Security In Action的中篇
http://dev2dev.bea.com.cn/bbs/thread.jspa?forumID=81&threadID=26770&tstart=0
或者直接使用Openssl,Openssl的安裝使用可以參考
http://www.aygfsteel.com/Files/openssl/%e7%ac%ac15%e7%ab%a0%20OpenSSL%e5%9f%ba%e6%9c%ac%e6%a6%82%e5%bf%b5.rar
http://www.aygfsteel.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中有兩臺被管Server,因此我分別創(chuàng)建了兩個證書庫
sourcesite.jks
destsite.jks
然后導(dǎo)出了兩個簡單的csr,用XCA中的CS私鑰Sign了之后,便有了兩個證書(這個步驟跟你去VeriSign提交CSR和獲取證書一模一樣)
從XCA,你導(dǎo)出了兩個der格式的證書,在SecureRCP中再針對上面兩個JKS證書庫分別Import CA Reply(就是sourcesite.der和destsite.der),
就完成了證書庫的創(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
其中,對于Weblogic被管Server來說,需要的是sourcesite.jks(用作Identity JKS),cs.jks里面只有一個cs.der,它可以用作Weblogic Server的Trust JKS。
對于Apache Proxy,它需要cs.der,即信任CA的根證書,但由于Apache Proxy是PEM格式Prefer的,因此,請用weblogic的der2pem命令去轉(zhuǎn)換一下cs.der為cs.pem。
準備好證書庫以及證書等瑣碎事情之后,可以繼續(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。
其次,打開SecureProxy(Set ON),然后Apache會將前端的所有請求轉(zhuǎn)發(fā)給Apache信任的ManagedServer(包括sourcesite, destsite兩個節(jié)點,前提是這兩個節(jié)點上的ManagedServer擁有TrustedCAFile信任的CA所簽發(fā)的證書/私鑰,即sourcesite.der和destsite.der)。
最后,我們看看httpd.conf同一目錄下的ssl.conf文件,增加一個虛擬主機的配置即可:
<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>?
注意:下面的私鑰、證書可以獨立用Openssl生成,用SecureRCP或XCA也可以,但要注意,私鑰不能加密,因為Apache可能不支持私鑰解密。
SSLCertificateFile conf/ssl.key/server.crt
SSLCertificateKeyFile conf/ssl.key/server.key
有些朋友可能會問到,如果我一個sourcesite上有兩個Managed Server, 分別使用8002和8004兩個SSL端口,怎么辦?
那就需要配置兩個虛擬主機,增加一個
<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的時候, Apache必須識別來自用戶的8002、8004的SSL請求。
最后,配置完畢,我們看看問題是如何被解決的:
#1,用戶訪問Apache Proxy http://adserver/ssl
#2,Apache Proxy轉(zhuǎn)發(fā)請求給Managed Server sourcesite,http://sourcesite:8001/ssl
#3,http://sourcesite:8001/ssl返回頁面,頁面有一個protected的鏈接
#4,Apache Proxy轉(zhuǎn)發(fā)響應(yīng)給用戶
#5,用戶看到Protected鏈接,點擊它(http://adserver/ssl/protected)
#6,Apache Proxy轉(zhuǎn)發(fā)protected請求給Managed Server sourcesite,http://sourcesite:8001/ssl/protected
#7,ManagedServer發(fā)現(xiàn)是protected HTTP請求,要求做SSL,返回HTTP 302,要用https://sourcesite:8002/ssl/protected
#8,Apache Proxy轉(zhuǎn)發(fā)響應(yīng)給用戶
#9,是IE而不是用戶代替用戶處理了HTTP 302的重定向,提交給https://adserver:8002/ssl/protected給Apache
#10,由于你配置了上面的針對SSL的虛擬主機,Apache會繼續(xù)為你效勞,轉(zhuǎn)發(fā)給sourcesite,https://sourcesite:8002/ssl/protected,
#11,ManagedServer發(fā)現(xiàn)是protected SSL請求,That's OK,返回正確的響應(yīng), HelloWorld!
本來有一些SSL握手動作在Apache與ManagedServer通訊之前發(fā)生,但都無非是ManagedServer向Proxy提交自己的證書的過程,只要Managed Server的證書確實被CS這個CA簽發(fā)過,則可以確保后面的請求繼續(xù),否則Apache會終止與該Managed Server通訊!
所需的證書,私鑰以及證書庫可以在該文件中找到
http://www.aygfsteel.com/Files/security/CS.rar
?
posted on 2007-01-07 14:34 david.turing 閱讀(9180) 評論(2) 編輯 收藏 所屬分類: Security領(lǐng)域