-- 作者:flyfoxs
-- 发布时间:4/27/2007 4:29:00 PM
-- 用代理实现AJAX跨域访问时遇到HTTPS
解决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。我一直把其理解成一个证书发布机构。 由于论坛贴图不太方便,如果想仔细的看备注中说明,可以访问: http://www.blogjava.net/itspy/archive/2007/04/27/114125.html
|