分类
知识中心

如何利用数字证书实现的安全SSL访问(一)

在网络上,信息在传递过程中会经过其他计算机。随着网上支付的不断发展,人们对信息安全的要求越来越高。一般情况下,中间的计算机不会监听路过的信息。但在使用网上银行或者进行信用卡交易的时候有可能被监视,从而导致个人隐私的泄露。因此Netscape公司提出了SSL协议,旨在达到在开放网络上安全保密地传输信息的目的,这种协议在Web上获得了广泛的应用。在网络安全应用过程中,经常会遇到和SSL相关的问题。下面列举两个典型的SSL开发应用,详细剖析SSL安全应用的内部奥秘。

1.揭开SSL安全开发的神秘面纱

SSL又叫”安全套接层(Secure Sockets Layer)协议”,是一种在客户端和服务器端之间建立安全通道的协议。SSL协议使用不对称加密技术实现会话双方之间信息的安全传递。可以实现信息传递的保密性、完整性,并且会话双方能鉴别对方身份。不同于常用的HTTP协议,我们在与网站建立SSL安全连接时使用HTTPS协议,即采用https://ip:port/的方式来访问。

IETF(http://www.ietf.org/)对SSL做了标准化,即RFC2246,并将其称为TLS(Transport Layer Security),从技术上讲,TLS 1.0与SSL 3.0的差别非常微小。以下是服务器传输的证书,主要通过Wireshark抓取IE浏览器和Gmail的通信过程所得

我们可以看到”SSLv3″、”Certificate”等字眼。不错,这里就是SSL通信过程了。SSL安全套接层协议包括服务器认证、客户认证(可选)、SSL链路上的数据完整性和SSL链路上的数据保密性。在实际应用中,SSL主要使用公开密钥体制和X.509数字证书技术保护信息传输的机密性和完整性。SSL安全协议主要提供3方面的服务:

认证用户和服务器,使得它们能够确信数据将被发送到正确的客户机和服务器上。

加密数据以隐藏被传送的数据。

维护数据的完整性, 确保数据在传输过程中不被改变。

对于电子商务应用来说,使用SSL可保证信息的真实性、完整性和保密性。想到这里,我们自然会思索:电子商务网站、银行网站或证券公司的网站,这样的应用也应该差不多吧!答案是肯定的。这里就列举几个典型的应用,看看其中有些什么玄机。

2.使用ASP.NET实现SSL安全转向应用

银行的网站包括了机密性页面,比如网上支付的金额,也包括了非机密页面,比如某某行长造访某地。因此,有的页面需要SSL,有的页面不需要SSL。对于某些安全性较高的网页,如网上支付或用户登录页面,可能会使用到HTTPS(SSL/TLS)来提高安全性,而其他的页面则不需要。

那么,如何自动快速地在HTTPS和HTTP之间进行切换呢?这里介绍如何在ASP.NET中强制某action使用HTTPS和如何进行向HTTPS页面的跳转。我们先实现强制一个action使用HTTPS。这里写了一个RequireHttpsAttribute,它的作用是将非HTTPS连接转换成HTTPS连接,这样所有使用了RequireHttps这个filter的controller都会强制使用HTTPS连接。

RequireHttpsAttribute是个什么东东呢?首先来看看这段代码:

  1. 01:  public class RequireHttpsAttribute :
    AuthorizeAttribute
  2. 02:  {    /// 重写OnAuthorization方法
  3. 03:      public override void OnAuthorization
    (AuthorizationContext filterContext)
  4. 04:      {
  5. 05:          if (!filterContext.HttpContext.
    Request.IsSecureConnection)
  6. 06:          {
  7. 07:              string path = filterContext.
    HttpContext.Request.Path;
  8. 08:              string host = System.Configuration
  9. .ConfigurationManager.AppSettings[“HostName”];
  10. 09:              string port = System.Configuration
  11. .ConfigurationManager.AppSettings[“HttpsPort”];
  12. 10:              if (port != null)
  13. 11:              {host = string.Format(“{0}:
    {1}”, host, port);}
  14. 12:              filterContext.HttpContext.Response.Redirect(
  15. string.Format(“https://{0}{1}”, host, path));
  16. 13:           }
  17. 14:      }
  18. 15:  }

首先看看代码分析。

(1)AuthorizeAttribute类,代表一个属性,用来限制访问者对Action方法的访问。

(2)OnAuthorization()方法,当请求一个认证时会调用此方法;AuthorizationContext类用来封装AuthorizeAttribute类常用的一些信息。

(3)如果已经是HTTPS连接则不处理,否则重定向到HTTPS连接

(4)获取当前请求的Path路径。

(5)从web.config中获取host,也可以直接从httpContext中获取。

(6)从web.config中获取HTTPS的端口。

(7)如果端口号为空表示使用默认端口,否则将host写成host:port的形式。

(8)重定向到HTTPS连接。

由于HTTPS和HTTPS服务使用不同的端口号,而且HTTPS不能绑定主机头,只能通过不同端口的方式来区分各个站点,所以这里将host和port信息写到了web.config里,以方便配置。在web.config的appSettings节加入如下信息即可:

  1. 01:  <appSettings>
  2. 02:       <add key=”HostName” value=”localhost”/>
  3. 03:       <add key=”httpsPort” value=”443″/>
  4. 04:  </appSettings>

HttpsPort可以不写,将使用默认的443。然后在要使用HTTPS连接的controller或action前加上[RequireHttps],如:

 

  1. 01:  [RequireHttps]
  2. 02:  public ActionResult About()
  3. 03:  {
  4. 04:      return View();
  5. 05:  }

这样,当我们用http://localhost/Home/访问该页面时,会自动跳到https://localhost/Home。但是这样还有一个问题,网页中的链接都是HTTP的,当点击进入需要使用HTTPS连接的网页时都要进行一次Redirect。所以要将网页中的链接也改成HTTPS。其实,只需要将view中所有链接到HTTPS页面的Html.Action()使用适当的重载方法来写即可。ASP.NET提供了2种重载可以将protocol设置为HTTPS。在新建ASP.NET MVC Web Application后默认生成的站点中,shared文件夹下的site.master文件中有个指向/Home/About的ActionLink。原来是:

  1. Html.ActionLink(“Home”, “Index”, “Home”)

对其进行改写:

  1. Html.ActionLink(“About”, “About”, “Home”,
    “https”, “localhost”, “”,null, null)

这样,生成出来的链接就是HTTPS的了,点击以后直接会使用HTTPS连接而无需再进行一次Redirect,之后新的要到HTTPS页面的链接也可仿照次写法。在调试过程中,也是一波三折,比如这里就遇到了无法启动HTTP SSL服务的解决方法。在调网站程序的时候,打开IIS管理器,发现里面的网站目录上有一个红叉,启动网站失败,没有日志记录;再检查”服务”项目,发现IIS ADMIN已经启动,RPC已经启动,但是HTTP SSL无法启动,并提示”与World Wide Web Publishing Service服务相依的HTTP SSL服务因下列错误而无法启动:系统找不到指定的文件”,在服务里面启动”World Wide Web Publishing Service”,仍然提示错误。在测试过程中发现,出现上面的错误是由于防火墙的原因。在防火墙MacAfee的设置里增加访问设置,问题迎刃而解。