http://www.cnblogs.com/lsxqw2004/archive/2011/03/26/2007207.html
安全连接 - SSL
SSL(Secure Sockets Layer, 安全套接字层 ) 协议保证两个在 Internet 上通信的应用程序之间的保密性和可靠性。 SLL 建立在 TCP 层的基础上。其提供了面向连接的安全性,有如下四个属性:
l 链接是私有的,加密仅对这个会话有效。
l 对称密钥加密算法(例如: DES )用于加密。会话密钥使用非对称密钥加密算法来交换。
l 数字证书用于验证通信实体的标识。
l 安全散列函数,如 SHA 或 MD5 ,用作消息验证代码 (MAC) 。
SSL 协议的目标有:
l 加密的安全性 - 对会话使用对称密钥,对验证使用公共密钥。
l 通用性 - 在不同的 OS 和编程语言间使用。
l 可扩展性 - 添加允许在 SSL 框架中使用的数据加密协议。
l 相对的高效 - 使用高速缓存技术减少计算和网络操作。
SSL 算法的具体过程
两个使用 SSL 协议通信的实体必须各有一个公共 - 私有密钥对,并可以用数字证书验证它们各自的公共密钥。
在会话的开始,客户端和服务器交换信息,验证彼此的身份。这个验证过程称为握手协议。在这个过程中,将协商使用什么会话 ID 、压缩方法和加密包。如果存在证书,它们也要交换。尽管证书是可选的,但如果没有证书,客户端和服务器可能拒绝新链接,停止会话。
在接收到彼此的公共密钥后,就交换建立在随机生成的数字基础上的一组密钥,用彼此的公共密钥加密它们。之后就可以开始交换应用程序数据了。应用程序数据使用一个对称密钥进行加密,并发用一个数据的标记散列,以验证数据的完整性。
.NET Framework 中有类实现了 SSL 客户端。通过 IIS Web 服务器部署服务时,可以使用服务器端的 SSL 。这样可以在 Windows 平台下获得一个完整的保护 B/S 系统数据安全的方案。
示例 1 :下面程序演示了在 .NET 平台上访问 SSL 保护的 Web 服务器。
WebRequest req = WebRequest .Create("http://www.cnblogs.com" );
WebResponse result = req.GetResponse();
但是用含有 https 的 URL 创建 WebRequest(System.Net 命名空间 ) 时, WebRequest 会自动使用 SSL 协议。
示例 2 :下面示例了访问一个安全的 URL ,其考虑了像编码这样的细节。
using System;
using System.IO;
using System.Net;
using System.Text;
class Program
{
static void Main()
{
Console .WriteLine(" 请输入一个 https 的 url" );
string url = Console .ReadLine();
string ms = "" ;
try
{
ms = Create(url, "utf-8" );
}
catch (Exception ex)
{
Console .WriteLine(ex.StackTrace);
}
Console .WriteLine(ms);
}
// 创建一个 HTTP 安全请求对象,并获得它的相应流
public static string Create(string url, string encod)
{
WebRequest req = WebRequest .Create(url);
WebResponse result = req.GetResponse();
Stream ReceiveStream = result.GetResponseStream();
// 由 Encoding 对象创建一个编码实例
Encoding enc = Encoding .GetEncoding(encod);
// 创建流读取器
StreamReader sr = new StreamReader (ReceiveStream, enc);
// 读取整个流 - 把整个 Web 页面对象串行化入字符串
string response = sr.ReadLine();
return response;
}
}
说完了客户端,接着我们来讨论下如何在 IIS 上配置 SSL ,由前面介绍我们知道 SSL 基于公钥私钥对来实现,而安全证书正是作为这样一组密钥提供加密认证服务。我们可以通过域控制器上配置的证书中心得到证书,但这种证书没法被浏览器校验,会出现安全警告,不适合在互联网生产环境中使用(在域内部使用没有这个问题)。更好的方法的是由 VeriSign 等安全公司申请证书, IE 等浏览器中内置这些机构的根证书,可以验证由这些组织得到的证书数字签名,从而确保证书的可靠性,且没有安全警告等影响易用性的问题。
从 VeriSign 获取 SSL 证书的步骤:
通过 IIS MMC 管理窗口中服务器证书内创建证书申请生成一个证书签名请求 (CSR) ,将生成的 CSR 中的内容复制到 VeriSign 申请系统中。这样就可由 VeriSign 得到一个证书,把其安装到 IIS 中即可。
在 IIS 中安装完证书后,就可以使用 SSL 连接( https )访问服务器上的所有 Web 页面(服务器防火墙注意开放 443 端口),只需将 http:// 换成 https:// 即可。在网站设计中我们应该只对登陆,交易等页面使用 SSL ,对所有页面使用 SSL 会影响服务器性能。
最后我们讨论一下在网站中部署 SSL 的方法
1. 将 Web.config 中的 <forms> 的 requireSSL 属性设置为 true ,这样所有信息都通过 SSL 传输,对于大型网站会影响性能不建议使用。
2. 在 iis 中选中一个页面,进入功能视图中 SSL 设置页,选中“要求 SSL ”这一项。这个做法也有个的问题,当使用 http:// 访问这个页面时将会被拒绝而不是友好的转到 https:// 下的同页面。一个折中的做法是在链接上使用绝对 URL ,从而对需要使用 SSL 的页面上进行正确的导航。
3. 这是我们要介绍的一种比较好的实践
对于需要强制使用 SSL 的页面我们统一使用一个母版页,在这个母版页的 OnInit 处理函数中我们进行如下处理:
public override void OnInit(EventArgs e)
{
if (!Request.IsSecureConnection)
{
// 第二值设为 true 表示结束本次请求
Response.Redirect(Request.Url.AbsoluteUri.ToLower().Replace(
"http://" , "https://" ), true );
}
base .OnInit(e);
}
这样如果在应该使用 SSL 的请求中使用了普通的 http 链接,则会结束当前请求(减少资源浪费),并发起一个新的正确请求。
对于不强制使用 SSL 的页面也使用一个母版页,但对于这些页我们做灵活处理,我们可以通过页面中的 ViewState 的设置来灵活的选择这个也是否可以使用 SSL 。在母版页中我们使用一个属性来得到内容页 ViewState 的设置,这个属性返回一个 bool 表示是否使用 SSL 。
public bool EnforceSSL
{
get
{
if (ViewState["enforceSSL" ] != null )
{
return (bool )ViewState["enforceSSL" ];
}
else
{
return false ;
}
}
set
{
ViewState["enforceSSL" ] = value ;
}
}
此属性在母版页面 OnInit 事件发生时还不能访问,所以在这个母版页中我们选择在 OnPreRender 事件处理程序中处理:
public override void OnPreRender(EventArgs e)
{
if (EnforceSSL)
{
if (!Request.IsSecureConnection)
{
Response.Redirect(Request.Url.AbsoluteUri.ToLower().Replace(
"http://" , "https://" ), true );
}
}
else if (Request.IsSecureConnection)
{
Response.Redirect(Request.Url.AbsoluteUri.ToLower().Replace(
"https://" , "http://" ), true );
}
}
这其中对于不需要使用 SSL ,我们将其转向普通 http 请求。