您的位置:首页 > 其它

.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

请求。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
相关文章推荐