David.Turing's blog

           

          [原創]Apache Proxy with Weblogic Cluster under SSL

          有個兄弟在做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="?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>

          由于當前的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.aygfsteel.com/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.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,因此我分別創建了兩個證書庫
          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.aygfsteel.com/Files/security/CS.rar

          ?

          posted on 2007-01-07 14:34 david.turing 閱讀(9179) 評論(2)  編輯  收藏 所屬分類: Security領域

          評論

          # re: [原創]Apache Proxy with Weblogic Cluster under SSL 2007-03-21 21:32 guest

          真是好文章!解決了很多疑問,謝謝!  回復  更多評論   

          # re: [原創]Apache Proxy with Weblogic Cluster under SSL 2007-12-04 16:22 ljw

          看完文章,順便在這問個WebLogic集群的問題:
          比如集群中有兩個Managed Server,分別為nodeA,nodeB
          現在實際業務也分兩塊,一塊主要是查詢/query/*,另一塊是數據處理/datahandle/*
          怎么配置這個集群,讓查詢塊分發到nodeA,數據處理塊分發到nodeB  回復  更多評論   

          導航

          統計

          常用鏈接

          留言簿(110)

          我參與的團隊

          隨筆分類(126)

          隨筆檔案(155)

          文章分類(9)

          文章檔案(19)

          相冊

          搜索

          積分與排名

          最新隨筆

          最新評論

          閱讀排行榜

          評論排行榜

          主站蜘蛛池模板: 河源市| 陈巴尔虎旗| 宜川县| 平湖市| 文登市| 柯坪县| 东宁县| 余江县| 林芝县| 米脂县| 三江| 新河县| 大安市| 宜阳县| 伊川县| 农安县| 厦门市| 迁西县| 东乡| 峨眉山市| 济源市| 翁牛特旗| 巴林左旗| 贡觉县| 崇仁县| 车险| 彭山县| 建德市| 武定县| 泰顺县| 咸丰县| 宁武县| 古丈县| 神池县| 黑山县| 宁远县| 株洲市| 陆川县| 华蓥市| 翁源县| 保康县|