Posted on 2007-04-27 16:26
itspy 阅读(5913)
评论(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。我一直把其理解成一个证书发布机构。