有个兄弟在做Weblogic Cluster与Apache Proxy的SSL,他的问题是,当部署在Weblogic中的Web应用使用了SSL重定向(比如但你要访问Weblogic的关键资源的时候,你需要重定向到SSL),比如下面的标准J2EE的Web.xml部署:
<?xml version="1.0" encoding="UTF-8"?>
<web-app id="WebApp_ID" version="2.4"
xmlns="http://java.sun.com/xml/ns/j2ee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/j2eehttp://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">
<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>
由于当前的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,放在%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转发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的中篇
http://dev2dev.bea.com.cn/bbs/thread.jspa?forumID=81&threadID=26770&tstart=0
或者直接使用Openssl,Openssl的安装使用可以参考
http://www.blogjava.net/Files/openssl/%e7%ac%ac15%e7%ab%a0%20OpenSSL%e5%9f%ba%e6%9c%ac%e6%a6%82%e5%bf%b5.rar
http://www.blogjava.net/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,因此我分别创建了两个证书库
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
<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会将前端的所有请求转发给Apache信任的ManagedServer(包括sourcesite, destsite两个节点,前提是这两个节点上的ManagedServer拥有TrustedCAFile信任的CA所签发的证书/私钥,即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转发请求给Managed Server sourcesite,http://sourcesite:8001/ssl
#3,http://sourcesite:8001/ssl返回页面,页面有一个protected的链接
#4,Apache Proxy转发响应给用户
#5,用户看到Protected链接,点击它(http://adserver/ssl/protected)
#6,Apache Proxy转发protected请求给Managed Server sourcesite,http://sourcesite:8001/ssl/protected
#7,ManagedServer发现是protected HTTP请求,要求做SSL,返回HTTP 302,要用https://sourcesite:8002/ssl/protected
#8,Apache Proxy转发响应给用户
#9,是IE而不是用户代替用户处理了HTTP 302的重定向,提交给https://adserver:8002/ssl/protected给Apache
#10,由于你配置了上面的针对SSL的虚拟主机,Apache会继续为你效劳,转发给sourcesite,https://sourcesite:8002/ssl/protected,
#11,ManagedServer发现是protected SSL请求,That's OK,返回正确的响应, HelloWorld!
本来有一些SSL握手动作在Apache与ManagedServer通讯之前发生,但都无非是ManagedServer向Proxy提交自己的证书的过程,只要Managed Server的证书确实被CS这个CA签发过,则可以确保后面的请求继续,否则Apache会终止与该Managed Server通讯!
所需的证书,私钥以及证书库可以在该文件中找到
http://www.blogjava.net/Files/security/CS.rar