在众多大型网站中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 plain copy print ?
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 plain copy print ?
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. "http://", Consts.UrlParameter.HTTPS, RegexOptions.IgnoreCase);
11. }
12. return url;
13. }
(2) 如需对整个站点做HTTPS强制切换,则可以:
对部分无法强制转向的页面,可以FILTER方式搞定。
[csharp] view plain copy print ?
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. false
10. ".") < 0 || absolutePath.Contains(".aspx"))) //过滤.asmx、.ashx、.axd等,//根目录等,不含文件名
11. {
12. //获取不需要HTTPS跳转的页面配置, 不在列表内则跳转
13. string httpsPages = "," + Configs.HttpsPages.ToLower() + ",";
14. if (httpsPages.IndexOf("," + absolutePath + ",") < 0)
15. {
16. "http://", "https", RegexOptions.IgnoreCase);
17. HttpContext.Current.Response.Redirect(url);
18. HttpContext.Current.Response.End();
19. }
20. }
21. }