Posted on 2007-04-27 16:26
itspy 閱讀(5949)
評論(4) 編輯 收藏 所屬分類:
JAVA技術
解決AJAX跨域訪問一般都是通過代理服務器來解決,但是我使用coldFusion實現這個問題時卻遇到這樣一個錯誤,在cfhttp標簽使用https訪問網站時,出現如下錯誤提示:
Connection Failure: Status code unavailable
找了好久也沒找到原因,最后還是在別的幫助下發現這個問題。由于個問題是語言無關的,所以不敢獨享,特拿來和大家分享。
為了方便說明,先做出一些定義。
代理服務器:在AJAX可以訪問的域中,并且代理AJAX來訪問其它網站的服務器,
目標服務器:AJAX真實想想訪問的網址所在的服務器。
我遇到的問題就是:代理服務器通過HTTPS訪問目標服務器,但是目標服務器的證書出于一些原因并不被信任。
如何讓代理服務器相信目標服務器的證書呢:有兩種方法
1):一般代理服務器都持有一些可信的頂CA的證書,如果站點的證書被其中之一的證書簽名過了,那么代理服務器就會相信這個證書。不過被這些頂給證書簽名是要收費的。(如何查看證書被哪些CA給簽名了,可以參考備注)
2):你個人確定這個網站是沒有問題的(比如我們訪問公司自己的網站時),然后手工的告訴代理服務器,這個證書是可信的,那么以后被這個證書簽名過的證書對這個代理服務器也是可信的了。
http://livedocs.adobe.com/coldfusion/7/htmldocs/wwhelp/wwhimpl/common/html/wwhelp.htm?context=ColdFusion_Documentation&file=00000272.htm
有一點要說明的,操作系統在安裝的時候,已經安裝了一些可信的證書(如何查看OS已經安裝了哪些證書,可以參考備注),所以在通過瀏覽器訪問網站的時候,如果網站的證書已經被這些證書其中之一簽名過了,瀏覽器也會相信這個網站的證書。否則瀏覽器會詢問你,這個證書有問題,你是否相信這個證書。
按照上面的URL我給服務器添加證書后,發現還是不行。最后證書確實是被驗證通過了,但是證書是給指定的域名使用的,但是我在訪問這個網站時,使用的IP地址,不是域名,所以服務器還是不相信這個網站。就好比:你有一張身份證,身份證確實是真的,但是你拿到的是別人的身份證。
通過查看證書,發現證書被頒發給如下域*.qa.webex.com(如何查看證書被頒發給哪些域名可以參考備注)。但之前我在code時,AJAX是直接使用的目標服務器的IP地址,不是域名。所以最后目標服務器無法被信任。這就好比,你明明拿著身份證去登機,雖然身份證是真的,但你同時要表明你就是身份證上的那人,你要是整容整的太大了,人家肯定不認你。
最后解決這個問題的辦法:在代理服務器上的HOST文件里面添加一行記錄,把felix.qa.webex.com域名與目標服務器的IP關連起來。
總結:要用代理實現AJAX跨域訪問遇到HTTPS協議時,首先要目標站點的證書被代理服務器信任,其次就是訪問的URL處于,證書頒發對象下面,不要使用IP地址這樣的方法來訪問。
本文章首發于 http://blog.OpenJ.cn
備注:
1、如何查看證書被哪些CA,或者是其它證書簽名?
通過瀏覽器(IE)打開對應的HTTPS網站。
雙擊鎖形圖標(如果是IE6,這個圖標應該在右下角的狀態欄)
點擊證書路徑,就可以看到這個證書的上級,以及上級的上級。

2、證書可以給哪些網站使用?
備注1已經說明了如何查看證書,打開證書,點擊常規:
證書頒發給:*.qa.webex.com

3、如何查看OS已經安裝了哪些證書?
IE->工具->Internet選項->內容->證書
這時你會看到很多Tab,不同的Tab對應不同的證書類型,我大概的看了一下,沒有100個,也有幾十個。在Windows下,Firefox好像并不使用OS的證書,而是使用自己安裝時帶的證書,以前好像看過,但寫此文章時沒有找到,也沒想到測試辦法。

正是因為證書一般是OS安裝的,所以可以看到有的商業CA會在網站上說明,它頒發的證書適合xxxx年后的OS。
3、CA:證書認證中心,Certificate Authority。我一直把其理解成一個證書發布機構。