.NET安全系列之七:通信相关内容
安全连接 - SSL
SSL(Secure Sockets Layer, 安全套接字层)协议保证两个在Internet上通信的应用程序之间的保密性和可靠性。SLL建立在TCP层的基础上。其提供了面向连接的安全性,有如下四个属性:
- 链接是私有的,加密仅对这个会话有效。
- 对称密钥加密算法(例如:DES)用于加密。会话密钥使用非对称密钥加密算法来交换。
- 数字证书用于验证通信实体的标识。
- 安全散列函数,如SHA或MD5,用作消息验证代码(MAC)。
SSL协议的目标有:
- 加密的安全性 - 对会话使用对称密钥,对验证使用公共密钥。
- 通用性 - 在不同的OS和编程语言间使用。
- 可扩展性 - 添加允许在SSL框架中使用的数据加密协议。
- 相对的高效 - 使用高速缓存技术减少计算和网络操作。
SSL算法的具体过程
两个使用SSL协议通信的实体必须各有一个公共 - 私有密钥对,并可以用数字证书验证它们各自的公共密钥。
在会话的开始,客户端和服务器交换信息,验证彼此的身份。这个验证过程称为握手协议。在这个过程中,将协商使用什么会话ID、压缩方法和加密包。如果存在证书,它们也要交换。尽管证书是可选的,但如果没有证书,客户端和服务器可能拒绝新链接,停止会话。
在接收到彼此的公共密钥后,就交换建立在随机生成的数字基础上的一组密钥,用彼此的公共密钥加密它们。之后就可以开始交换应用程序数据了。应用程序数据使用一个对称密钥进行加密,并发用一个数据的标记散列,以验证数据的完整性。
.NET Framework中有类实现了SSL客户端。通过IIS Web服务器部署服务时,可以使用服务器端的SSL。这样可以在Windows平台下获得一个完整的保护B/S系统数据安全的方案。
示例1:下面程序演示了在.NET平台上访问SSL保护的Web服务器。
1 2 | WebRequest req = WebRequest.Create( "http://www.cnblogs.com" ); WebResponse result = req.GetResponse(); |
但是用含有https的URL创建WebRequest(System.Net命名空间)时,WebRequest会自动使用SSL协议。
示例2:下面示例了访问一个安全的URL,其考虑了像编码这样的细节。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 | 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处理函数中我们进行如下处理:
1 2 3 4 5 6 7 8 9 | 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。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | public bool EnforceSSL { get { if (ViewState[ "enforceSSL" ] != null ) { return ( bool )ViewState[ "enforceSSL" ]; } else { return false ; } } set { ViewState[ "enforceSSL" ] = value; } } |
此属性在母版页面OnInit事件发生时还不能访问,所以在这个母版页中我们选择在OnPreRender事件处理程序中处理:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | 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请求。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· C#/.NET/.NET Core技术前沿周刊 | 第 29 期(2025年3.1-3.9)
· 从HTTP原因短语缺失研究HTTP/2和HTTP/3的设计差异