在网络上,信息在传递过程中会经过其他计算机。随着网上支付的不断发展,人们对信息安全的要求越来越高。一般情况下,中间的计算机不会监听路过的信息。但在使用网上银行或者进行信用卡交易的时候有可能被监视,从而导致个人隐私的泄露。因此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是个什么东东呢?首先来看看这段代码:
- 01: public class RequireHttpsAttribute :
AuthorizeAttribute - 02: { /// 重写OnAuthorization方法
- 03: public override void OnAuthorization
(AuthorizationContext filterContext) - 04: {
- 05: if (!filterContext.HttpContext.
Request.IsSecureConnection) - 06: {
- 07: string path = filterContext.
HttpContext.Request.Path; - 08: string host = System.Configuration
- .ConfigurationManager.AppSettings[“HostName”];
- 09: string port = System.Configuration
- .ConfigurationManager.AppSettings[“HttpsPort”];
- 10: if (port != null)
- 11: {host = string.Format(“{0}:
{1}”, host, port);} - 12: filterContext.HttpContext.Response.Redirect(
- string.Format(“https://{0}{1}”, host, path));
- 13: }
- 14: }
- 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节加入如下信息即可:
- 01: <appSettings>
- 02: <add key=”HostName” value=”localhost”/>
- 03: <add key=”httpsPort” value=”443″/>
- 04: </appSettings>
HttpsPort可以不写,将使用默认的443。然后在要使用HTTPS连接的controller或action前加上[RequireHttps],如:
- 01: [RequireHttps]
- 02: public ActionResult About()
- 03: {
- 04: return View();
- 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。原来是:
- Html.ActionLink(“Home”, “Index”, “Home”)
对其进行改写:
- 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的设置里增加访问设置,问题迎刃而解。