使用.net和x509证书实现安全

使用.netx509证书实现安全

概述

    主要针对目前xxx数据交换平台实现安全数据交换的设计方案;本方案通过PKI技术实现对报文加密,加签和证书的管理实现对数据交换安全的功能性需求.

PKI技术介绍

PKI"Public Key Infrastructure"的缩写,意为"公钥基础设施",是一个用非对称密码算法原理和技术实现的、具有通用性的安全基础设施。PKI利用数字证书标识密钥持有人的身份,通过对密钥的规范化管理,为组织机构建立和维护一个可信赖的系统环境,透明地为应用系统提供身份认证、数据保密性和完整性、抗抵赖等各种必要的安全保障,满足各种应用系统的安全需求。简单的说,PKI是提供公钥加密和数字签名服务的系统,目的是为了自动管理密钥和证书,保证网上数字信息传输的机密性、真实性、完整性和不可否认性。

为什么需要PKI

随着网络技术的发展,特别是Internet的全球化,各种基于互联网技术的网上应用,如电子政务、电子商务等得到了迅猛发展。网络正逐步成为人们工作、生活中不可分割的一部分。由于互联网的开放性和通用性,网上的所有信息对所有人都是公开的,因此应用系统对信息的安全性提出了更高的要求。

1)对身份合法性验证的要求
以明文方式存储、传送的用户名和口令存在着被截获、破译等诸多安全隐患。同时,还有维护不便的缺点。因此,需要一套安全、可靠并易于维护的用户身份管理和合法性验证机制来确保应用系统的安全性。
2)对数据保密性和完整性的要求
企业应用系统中的数据一般都是明文,在基于网络技术的系统中,这种明文数据很容易泄密或被篡改,必须采取有效的措施保证数据的保密性和完整性。
3)传输安全性要求
以明文方式在网上传输的数据,很容易被截获以至泄密,必须对通信通道进行加密保护。利用通信专线的传统方式已经远远不能满足现代网络应用发展的需求,必须寻求一种新的方法来保证基于互联网技术的传输安全需求。
4)对数字签名和不可否认的要求
不可抵赖性为了防止事件发起者事后抵赖,对于规范业务,避免法律纠纷起着很大的作用。传统不可抵赖性是通过手工签名完成的,在网络应用中,需要一种具有同样功能的机制来保证不可抵赖性,那就是数字签名技术。
PKI
基于非对称公钥体制,采用数字证书管理机制,可以为透明地为网上应用提供上述各种安全服务,极大地保证了网上应用的安全性。

功能模块

证书管理控制台:

证书颁发机构(CA) 用于申请和颁发证书的应用服务。

证书生成工具(Makecert.exe)生成仅用于测试目的的 X.509 证书。它创建用于数字签名的公钥和私钥对,并将其存储在证书文件中。此工具还将密钥对与指定发行者的名称相关联,并创建一个 X.509 证书,该证书将用户指定的名称绑定到密钥对的公共部分。

证书控制台,用于管理本地计算机上安装的证书。

安全管道:

证书读取器,读取安装在本地计算机中的证书信息。

加密/解密组件,通过证书提供的信息对报文进行加密/解密操作。

加签/验签组件,通过证书提供的信息对报文进行加签/验签操作。

证书管理过程

通过X.509证书实现密钥的交换和签名;用自己的证书(包含私钥)签名,用其他人证书(公钥)进行加密,验签的过程;

  1. 生成证书,该证书的用途可用于签名,也可用于解密(将证书的公钥导出到其他电脑后通过公钥加密)生成证书的方式有两种
    1. 通过外部CA证书颁发机构申请证书
    2. 通过.net Makecert.exe工具通过命令行创建证书(这种方式才生的证书无法实现验证证书的合法性和可用性)
  2. 将获取到的证书导入到本地计算机的证书管理容器中如图1所示

  3. 对于需要解密的证书需要把公钥导出给其他电脑,让对方用这个公钥加密,用于签名的证书,则需要把公钥导出给其他电脑,用公钥来验证自己的身份和报文是否被篡改。
  4. 将导出的公钥文件通过文件拷贝的方式复制到远程计算如图2。

  5. 远程计算获取到公钥文件后直接导入到计算机的证书管理器的其他人目录下如图3,加密的时候需要读取本地计算其他人(Local Computer\Other People)下的证书加密和验证签名

加密/加签过程

客户端需要发送加密/加签报文到服务器的过程。

满足的前提条件

    在证书管理器中存在加密用的服务器证书和加签用的客户端证书

  1. 获取需要加密/加签的明文,对于加密操作则读取本地计算机其他人目录下的证书信息,对于签名操作则需要读取本地计算机\个人下面的证书。加密/加签需要的证书名称通过配置文件获取。如图4证书内容

  2. 调用加密/加签算法进行对报文的加密/加签操作;使用.net标准的类库实现;加密后的文档结构如图5

    加密算法说明

    EncryptedXml 类是 .NET Framework 中用于 XML 加密的主类。XML 加密是对所有或部分 XML 文档或任意数据进行加密的一种基于标准的、可互操作的方法。.NET Framework XML 加密类实现了位于 http://www.w3.org/TR/xmldsig-core/ 的万维网联合会 (W3C) XML 加密规范。无论何时需要在应用程序或组织之间以标准方式共享加密的 XML 数据,都可使用 EncryptedXml 类。任何使用此类进行加密的数据均可通过符合 W3C XML 加密规范的任何实现进行解密。 XML 加密用 <EncryptedData> 元素替换任何明文 XML 元素或文档,此元素包含明文 XML 或任意数据的加密(或密文)表示形式。<EncryptedData> 元素可以选择包含有关在何处查找用于对密文进行解密的密钥的信息,以及关于使用哪种加密算法对明文进行加密的信息。除了允许对用于解密 <EncryptedData> 元素值的密钥进行加密外,<EncryptedKey> 元素在样式和用法方面与 <EncryptedData> 元素类似。注意,<EncryptedKey> 元素和 <EncryptedData> 元素从不包含未加密的密钥。使用下列方法之一交换密钥信息:

  • 不包含任何密钥信息。如果选择此选项,则双方必须在交换加密数据之前在算法和密钥上取得一致。
  • 在 <RetrievalMethod> 元素的统一资源标识符 (URI) 属性中包含密钥位置。双方必须事先就密钥位置取得一致,并且必须将此位置保密。
  • 包含一个字符串名称,此名称映射到 <KeyName> 元素中的密钥。双方必须在交换加密数据之前在密钥名称映射上取得一致,并且必须将此映射保密。
  • 在 <EncryptedKey> 元素中包含加密密钥。双方必须在交换加密数据之前在对加密密钥进行解密的密钥上取得一致。可以有选择地包含将对 <EncryptedKey> 元素中的密钥进行解密的密钥的名称或位置。

加签算法说明

SignedXml 类是 .NET Framework 中用于 XML 签名和验证 (XMLDSIG) 的主类。 XMLDSIG 是一种基于标准且可互操作的方法,用于对 XML 文档的全部或部分或者可通过统一资源标识符 (URI) 查找的其他数据进行签名和验证。.NET Framework XMLDSIG 类实现了 WWW 联合会 (W3C) 有关 XML 签名和验证的规范,可从 http://www.w3.org/TR/xmldsig-core/ 获得该规范。

无论何时需要在应用程序或组织之间采用标准方式共享已签名的 XML 数据,都可使用 SignedXml 类。 使用此类签名的任何数据都可以通过符合 XMLDSIG 的 W3C 规范的任何实现进行验证。

XMLDSIG 将创建一个 <Signature> 元素,该元素包含用于 XML 文档或可通过 URI 查找的其他数据的数字签名。 <Signature> 元素可以有选择地包含有关在何处查找用于验证签名的密钥以及使用哪种加密算法进行签名等信息。

通过 SignedXml 类,可以创建以下三种 XML 数字签名:

签名类型

说明

被包封签名

该签名包含于被签名的 XML 文档中。

包封签名

已签名的 XML 包含于 <Signature> 元素中。

分离签名

该签名位于与被签名的数据不同的单独文档中。

使用下列方法之一交换密钥信息:

  • 不包含任何密钥信息。 如果您选择此选项,则双方必须在交换数字签名之前在算法和密钥上取得一致。
  • 在 <EncryptedKey> 元素中包括公钥。
  • 在 <RetrievalMethod> 元素的 URI 属性中包括密钥的位置。双方必须事先就密钥位置取得一致,并且必须将此位置保密。
  • 在 <KeyName> 元素中包括映射到密钥的字符串名称。 双方必须在交换加密数据之前在密钥名称映射上取得一致,并且必须将此映射保密。
  1. 将生成的密文;密文中包含加密证书信息和加签证书的信息提供给服务端解密和验签使用
  2. 发送到目的地

解密/验签过程

服务端接收解密/验签报文的过程,通过对报文的加密/加签和证书的管理实现对客户端传输的控制和安全上管理。可以很好保证报文的安全不会在传输过程中被篡改和截获。

满足的前提条件

    在证书管理器中存在解密用的服务器证书和验签用的客户端证书

  1. 接收到加密/加签的报文后首先抽取中间的证书信息(包含证书名称)
  2. 获取到证书名称后匹配本地计算中是会存在这本证书对于验证签名的证书统一存放在本地计算机\其他人目录下,对于解密的证书统一存放在本地计算机\个人目录下 ,如果没有找到相应的证书则抛出异常终止这个过程
  3. 调用.net SignedXml类库验证报文的合法性-是否在传输过程中被篡改和证实客户端的身份,如果发现验证不通过比如被篡改过饿抛出异常终止这个过程。
  4. 验证通过后对于需要解密的报文调用.net EncryptedXml类库进行解密,最终变成明文进行后续的处理。
原文地址:https://www.cnblogs.com/neozhu/p/1271369.html