有个兄弟在做weblogic cluster与apache proxy的ssl,他的问题是,当部署在weblogic中的web应用使用了ssl重定向(比如但你要访问weblogic的关键资源的时候,你需要重定向到ssl),比如下面的标准j2ee的web.xml部署:
xmlns=""
xmlns:xsi=""
xsi:schemalocation="">
ssl
index.html
index.htm
index.jsp
default.html
default.htm
default.jsp
example ssl security constraint
ssl protected area
/protected/*
confidential
由于当前的url到达了/propected,web服务器发现客户端还是走http 7001方式,它会向客户端发送http 302,重定向客户端到ssl端口,比如7002,但当我们对weblogic集群使用了proxy的时候,这可能有一点点麻烦。
我们首先需要配置weblogic的各个managed server,比如http端口都是7001,ssl端口都是7002,然后配置一个由weblogic提供给apache的proxy包(一个叫做mod_wl_20.so的文件),然后在apache加载它,再提供几个简单的参数,便可以run起来,为了让一切变得很简单,我们可以分开两步来走:
1,先配通http方式
2,提供ssl方式
针对1,其实那是3分钟的事情
1.1 找到weblogic中的mod_wl_20.so,放在�a_home%\weblogic81\server\bin,copy到apache 2.0的modules目录
1.2 在httpd.conf中增加下面的配置:
loadmodule weblogic_module modules/mod_wl_20.so
weblogiccluster sourcesite:8001,destsite:8001
matchexpression *
注意,sourcesite:8001,destsite:8001是我在另外两台机器上的managed server,针对所有类型资源的访问请求,都会被apache转发weblogic集群上去。然后,重启apache,测试一下。
针对步骤2,需要注意一些问题,首先是要配置ssl的信任关系,也就是,apache proxy转发请求的时候,会验证服务器的身份,因此,我们配置一套java证书库,我是用xca和securexrcp(http://www.blogjava.net/security/archive/2007/01/07/securexrcp.html)去完成的,图形化操作比openssl的纯命令行要方便很多。
2.1 创建证书库
首先,创建一个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-----
以及其对应的公开证书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创建对应的证书库(我说的当然是identity证书库)。
用securexrcp为每个managed server new一个证书库,然后创建密钥对,然后用私钥去创建一个
csr(证书请求),保存为一个文件,再用xca去对这个文件签名(用上述的cskey.pem,你需要往xca导入上面的
pem,也可以用你以前创建的ca根私钥)。
note:如果读者对xca用法不是很熟悉,可以阅读weblogic security in action的中篇
或者直接使用openssl,openssl的安装使用可以参考
我在我的weblogic cluster中有两台被管server,因此我分别创建了两个证书库
sourcesite.jks
destsite.jks
然后导出了两个简单的csr,用xca中的cs私钥sign了之后,便有了两个证书(这个步骤跟你去verisign提交csr和获取证书一模一样)
从xca,你导出了两个der格式的证书,在securercp中再针对上面两个jks证书库分别import ca reply(就是sourcesite.der和destsite.der),
就完成了证书库的创建。
ok,看看我们现在有些什么文件(这些文件大家可以在本文附件中找到)。
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命令去转换一下cs.der为cs.pem。
准备好证书库以及证书等琐碎事情之后,可以继续配置apache ssl。
2.2 配置apache信任weblogic集群
修改上面提到的apache的httpd.conf:
loadmodule weblogic_module modules/mod_wl_20.so
loadmodule ssl_module modules/mod_ssl.so
include conf/ssl.conf
sethandler weblogic-handler
sethandler weblogic-handler
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
首先,你需要用loadmodule加载ssl以及weblogic提供给apache的mod。
其次,打开secureproxy(set on),然后apache会将前端的所有请求转发给apache信任的managedserver(包括sourcesite, destsite两个节点,前提是这两个节点上的managedserver拥有trustedcafile信任的ca所签发的证书/私钥,即sourcesite.der和destsite.der)。
最后,我们看看httpd.conf同一目录下的ssl.conf文件,增加一个虚拟主机的配置即可:
documentroot "c:/apache/htdocs"
servername adserver:8002
serveradmin
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
ssloptions stdenvvars
ssloptions stdenvvars
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"
注意:下面的私钥、证书可以独立用openssl生成,用securercp或xca也可以,但要注意,私钥不能加密,因为apache可能不支持私钥解密。
sslcertificatefile conf/ssl.key/server.crt
sslcertificatekeyfile conf/ssl.key/server.key
有些朋友可能会问到,如果我一个sourcesite上有两个managed server, 分别使用8002和8004两个ssl端口,怎么办?
那就需要配置两个虚拟主机,增加一个
documentroot "c:/apache/htdocs"
servername adserver:8004
serveradmin
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
ssloptions stdenvvars
ssloptions stdenvvars
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"
这样,weblogic managed server重定向ssl的时候, apache必须识别来自用户的8002、8004的ssl请求。
最后,配置完毕,我们看看问题是如何被解决的:
#1,用户访问apache proxy
#2,apache proxy转发请求给managed server sourcesite,
#3,返回页面,页面有一个protected的链接
#4,apache proxy转发响应给用户
#5,用户看到protected链接,点击它()
#6,apache proxy转发protected请求给managed server sourcesite,
#7,managedserver发现是protected http请求,要求做ssl,返回http 302,要用
#8,apache proxy转发响应给用户
#9,是ie而不是用户代替用户处理了http 302的重定向,提交给给apache
#10,由于你配置了上面的针对ssl的虚拟主机,apache会继续为你效劳,转发给sourcesite,,
#11,managedserver发现是protected ssl请求,that's ok,返回正确的响应, helloworld!
本来有一些ssl握手动作在apache与managedserver通讯之前发生,但都无非是managedserver向proxy提交自己的证书的过程,只要managed server的证书确实被cs这个ca签发过,则可以确保后面的请求继续,否则apache会终止与该managed server通讯!
所需的证书,私钥以及证书库可以在该文件中找到