.NET安全系列之七:通信相关内容
2011-05-24 20:57
295 查看
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
请求。
安全连接
- 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
请求。
相关文章推荐
- .NET安全系列之七:通信相关内容
- MSDN Webcast预告 - .NET 4.0中的新特性系列课程(4):.NET 4.0 安全模型介绍(Level 200)
- .NET安全系列之四:.NET中加密算法及证书
- 在.NET中利用委托实现窗体间安全通信
- HTTP协议系列----------- HTTP协议相关的Web安全问题
- solr与.net系列课程(六)solr定时增量索引与安全
- MSDN Webcast预告 - .NET 4.0中的新特性系列课程(4):.NET 4.0 安全模型介绍(Level 200)
- [.NET领域驱动设计实战系列]专题十:DDD扩展内容:全面剖析CQRS模式实现
- .NET安全系列之五:数据保护API
- 【网络安全】复习网络安全相关内容
- .NET安全系列之六:强名程序集
- 基于Windows的设备管理开发(主要阐述SetupDi系列函数及其相关内容)
- .Net控制USB设备相关内容
- 构建安全的.NET应用系列-目录
- .net知识系列之十:单元测试(Nunit相关知识)
- Visual Studio 2017中使用正则修改部分内容 如何使用ILAsm与ILDasm修改.Net exe(dll)文件 C#学习-图解教程(1):格式化数字字符串 小程序开发之图片转Base64(C#、.Net) jquery遍历table为每一个单元格取值及赋值 。net加密解密相关方法 .net关于坐标之间一些简单操作
- 20151024学习内容:安全相关
- .NET中用弹出窗口添加或修改一个页面,当添加或修改相关内容后按下提交按钮自动刷新页面的JS代码
- JMVM系列之三_JMVM2.1运动估计相关内容
- .net知识系列之六:(ADO.NET相关知识)