HTTPS应用摘要

来源:互联网 发布:pos及数据拦截器 编辑:程序博客网 时间:2024/06/11 04:12

 http://blog.csdn.net/webwalker/article/details/5658155

在众多大型网站中HTTPS的应用越来越多,尤其是对安全有严格要求的网站,近乎普及。虽说应用HTTPS之后,站点性能稍有影响,但综合评估下来并无大碍、近可忽略,以下本文通过摘要方式汇总HTTPS在项目中的实践应用(服务端、Windows + IIS)。

     HTTPS:HypertextTransfer Protocol over Secure Socket Layer,以安全为目标的HTTP通道,安全基础在于SSL,用以安全的HTTP数据传输。有关详细介绍以及HTTP的区别等不再赘述。实现HTTPS的应用大致分为以下几个步骤:

1、  申请购买HTTPS安全证书

当然你也可以自己搭建CA服务器,然后将证书发布给自己,如需客户端证书验证,则需要做一个发放证书的程序。当然市场上也有些免费的CA证书,但还是建议购买CA证书,毕竟是钱买来的嘛,经得起考验,即便出问题也有利。

2、搭建HTTPS服务环境

         (1)在服务器端,通过以下图示,安装完成CA证书

服务器证书

浏览证书完成安装

 

        (2)然后在网站属性中, SSL设置为443,开启SSL服务支持


3、HTTPS站点测试

         以上步骤完成后,即可进入HTTPS测试阶段。https://...

        一般来说,如果HTTPS站点内含有内嵌页面,则要求内嵌页面与HTTPS页面满足以下情形:

       (1)      URL协议一致

       (2)      URL端口一致

       (3)      根域名一致

       反之存在非安全、跨域问题。当然此类问题,也可以通过在内嵌页面增加HTTPS自身的代理页面来完成跨域控制。

    一般在开发测试阶段,没有正式购买的正式,我们可以自己生成证书来完成测试。请参阅其他资料创建测试证书。

4、  相关问题

运行后的HTTPS站点一般会有以下问题:安全警告、证书问题,证书类问题比较好办,主要体现在证书名称、证书状态上。但安全警告问题一般为HTTPS运行后主要解决问题。以下针对不同问题给出处理方案。

(1)      引用外站资源(JS、CSS、IMAGE、SWF……)提示非安全连接

资源的引用路径不能为空,如果为外站资源,则需要外站资源同样支持HTTPS,如有必要可以将外站资源拿回本地引用。

(2)      内嵌IFRAME

对页面初始时没有SRC的IFRAME,可以通过“src="images/blank.gif”的方式来解决。

src=""

src="#"

src="about:blank"

src="javascript:void"

src="javascript:false"均不可以完全兼容

(3)      页面跳转

在系统交互过程中,也需确保转向的目标URL为HTTPS。

(4)      对于HTTP://...,去掉HTTP的方法,个人尝试后并未完全兼容安全警告问题。

Eg:

  去掉后在服务器上才可以,本机起webserver也行

  'codebase','//download.macromedia.com/...'

  'pluginspage','//www.macromedia.com/go/getflashplayer',

  codebase="//download...."

  pluginspage=":// www...."

 

5、  其他应用

(1)      如果在应用程序判断当前请求是否为HTTPS,则直接通过URL来判断是不准确的,这时需要在NetScaler中增加标识用以APP判断。


[csharp] view plaincopyprint?
  1. /// <summary>  
  2. /// 是否HTTPS访问  
  3. /// </summary>          
  4. public static bool IsHTTPs  
  5. {  
  6.     get  
  7.     {  
  8.         string url = HttpContext.Current.Request.Url.ToString().ToLower();  
  9.         bool result = url.StartsWith("https://");  
  10.   
  11.         string useSSL = PayConfig.GetString("UseSSL");  
  12.         if (!string.IsNullOrEmpty(useSSL) && useSSL == "0")  
  13.         {  
  14.             return result;  
  15.         }  
  16.         else  
  17.         {  
  18.             NameValueCollection nvc = HttpContext.Current.Request.Headers;  
  19.             string ssl = string.Empty;  
  20.             for (int i = 0; i < nvc.Keys.Count; i++)  
  21.             {  
  22.                 if (string.Compare(nvc.Keys[i], "ssl"true) == 0)  
  23.                 {  
  24.                     ssl = nvc[nvc.Keys[i]].Trim();  
  25.                 }  
  26.             }  
  27.             //WebLog.WriteAction("ssl == 1", (ssl == "1").ToString());  
  28.             return ssl == "1" ? true : result;  
  29.         }  
  30.     }  
  31. }  

[csharp] view plaincopyprint?
  1. /// <summary>  
  2. /// 获取HTTPS地址  
  3. /// </summary>  
  4. /// <param name="url"></param>  
  5. /// <returns></returns>  
  6. public static string GetHttpsUrl(string url)  
  7. {  
  8.     if (IsHTTPs)  
  9.     {  
  10.         url = Regex.Replace(url, @"http://", Consts.UrlParameter.HTTPS, RegexOptions.IgnoreCase);  
  11.     }  
  12.     return url;  
  13. }  

(2)      如需对整个站点做HTTPS强制切换,则可以:

             对部分无法强制转向的页面,可以FILTER方式搞定。

[csharp] view plaincopyprint?
  1. /// <summary>  
  2. /// 非HTTPS访问强制转向到HTTPS  
  3. /// </summary>  
  4. void HttpsRedirect()  
  5. {  
  6.     string absolutePath = GlobalItem.AbsolutePath.ToLower();  
  7.     string url = HttpContext.Current.Request.Url.ToString();  
  8.     if (GlobalItem.IsHTTPs == false  
  9.         && GlobalItem.IsHttpsUrl == false  
  10.         && (absolutePath.IndexOf(".") < 0 || absolutePath.Contains(".aspx"))) //过滤.asmx、.ashx、.axd等,//根目录等,不含文件名  
  11.     {  
  12.         //获取不需要HTTPS跳转的页面配置, 不在列表内则跳转  
  13.         string httpsPages = "," + Configs.HttpsPages.ToLower() + ",";  
  14.         if (httpsPages.IndexOf("," + absolutePath + ",") < 0)  
  15.         {  
  16.             url = Regex.Replace(url, @"http://""https", RegexOptions.IgnoreCase);  
  17.             HttpContext.Current.Response.Redirect(url);  
  18.             HttpContext.Current.Response.End();  
  19.         }  
  20.     }  
  21. }  
0 0
原创粉丝点击