.Net(C#)访问X509证书加密的Webservice(一)--证书生成
1、原理
X.509 给出的鉴别框架是一种基于公开密钥体制的鉴别业务密钥管理。一个用户有两把密钥:一把是用户的专用密钥(简称为:私钥),另一把是其他用户都可得到和利用的公共密钥(简称为:公钥)。该鉴别框架允许用户将其公开密钥存放在CA的目录项中。一个用户如果想与另一个用户交换秘密信息,就可以直接从对方的目录项中获得相应的公开密钥,用于各种安全服务。
创建X509证书方法较多,在Windows 环境下大致总结了几中办法,
1) 通过CA获取证书,
2) 通过微软提供的makecert 工具得到测试证书
3) 编程的方法创建,.Net提供了 X509Certificate2 类,该类可以用于创建证书,但只能从RawData中创建,创建后无法修改除FriendlyName以外的任何属性。
查看生成的证书:
通过在开始菜单-运行-输入mmc可以选择证书单元来查看和管理证书,通过微软的提供的certmgr.exe证书管理工具也可管理证书,和makecert.exe在同一目录,使用相当简单,双击就可了
网络安全的四大要 素,即信息传输的保密性、数据交换的完整性、发送信息的不可否认性、交易者身份 的确定性
安全证书体制主要采 用了公开密钥体制,其它还包括对称密钥加密、数字签名、数字信封等技术。
我们可以使用数字证书,通过运用对称和非对称密码体制等密码技术建立起一套严密的身份认证系统,从而保证:信息除发送方和接收方外不被其它人窃取;信息在传输过程中不被篡改;发送方能够通过数字证书来确认接收方的身份;发送方对于自己的信息不能抵赖。
数字证书原理介绍
数字证书采用公钥体制,即利用一对互相匹配的密钥进行加密、解密。每个用户自己设定一把特定的仅为本人所知的私有密钥(私钥),用它进行解密和签名;同时设定一把公共密钥(公钥)并由本人公开,为一组用户所共享,用于加密和验证签名。当发送一份保密文件时,发送方使用接收方的公钥对数据加密,而接收方则使用 自己的私钥解密,这样信息就可以安全无误地到达目的地了。通过数字的手段保证加 密过程是一个不可逆过程,即只有用私有密钥才能解密。在公开密钥密码体制中,常用的一种是RSA体制。其数学原理是将一个大数分解成两个质数的乘积,加密和解密用的是两个不同的密钥。即使已知明文、密文和加密密钥(公开密钥),想要推导出解密密钥(私密密钥),在计算上是不可能的。按现在的计算机技术水平,要破解目前采用的1024位RSA密钥,需要上千年的计算时间。公开密钥技术解决了密钥发布的管理问题,商户可以公开其公开密钥,而保留其私有密钥。购物者可以用人人皆知的公开密钥对发送的信息进行加密,安全地传送给商户,然后由商户用自己的私有密钥 进行解密。
2、WCF中使用X509证书
1) 创建WCF服务应用以及调用客户端。
2) 创建客户证书和服务端的X509证书
在VS2008 的DOS命令提示中,输入下面的指令即可创建相关的服务器和客户端证书
makecert.exe -sr LocalMachine -ss My -a sha1 -n CN=ParkingClient -sky exchange -pe
E:\TFS\Makecert\makecert.exe -n "CN=test" -a sha1 -cy authority -r -sr LocalMachine -ss AuthRoot -sky exchange -e 12/31/2099 -pe //demo 设置过期时间,保存地址,颁发者
下面是各种参数的介绍
属性 |
解析 |
-sr |
指定的证书存储区中的注册表位置。 |
-ss |
指定证书存储的位置。 |
-a |
指定相关的算法,可以选择 MD5 算法或者 SHA1算法 |
-n |
指定证书的名称。该名称遵循X.500命名标准。简单例子如 "CN=MyName" 格式,如果没有指定/n开关,证书默认的名称是"Joe's Software Emporium"。 |
-sky |
证书键类型。可以设置为 exchange 或者 signature。 |
-pe |
证书可导出 |
3、检查证书是否生成成功
4、给IIS赋予访问私钥的权限
1)证书的私钥文件在计算机上的存储位置?
Windows xp存放在:C:\Documents and Settings\All Users\Application Data\Microsoft\Crypto\RSA\MachineKeys
Windows vista存放在:C:\ProgramData\Microsoft\Crypto\RSA\MachineKeys
2) 哪个文件才是我们要找的证书的私钥文件?
Crypto\RSA\MachineKeys 这个文件里可能有很多文件,有几种方法可以确定。
1)根据文件的修改日期
2)如果根据文件的修改日期,不能确定是哪个文件,可以使用FindPrivateKey这个工具来获取证书的完整路径。
FindPrivateKey 工具需要证书存储区名称、证书存储区位置以及可以唯一标识此证书的信息。
FindPrivateKey 工具接受将证书的主题名称或其指纹作为唯一标识符。
下面的代码示例使用 FindPrivateKey 工具来确定指纹为
46 dd 0e 7a ed 0b 7a 31 9b 02 a3 a0 43 7a d8 3f 60 40 92 9d
的证书的私钥在 LocalMachine 的 My 存储区中的位置:
findprivatekey.exe My LocalMachine -t "46 dd 0e 7a ed 0b 7a 31 9b 02 a3 a0 43 7a d8 3f 60 40 92 9d" -a
3)哪里获取 FindPrivateKey 这个工具?
这里是 FindPrivateKey 的源代码:FindPrivateKey.7z
如何把证书私钥文件的读访问权限授予WCF所使用的帐户?
1)通过资源管理器->文件属性->安全,来设置证书私钥文件读访问权限
2)使用 cacls.exe 等工具来设置证书私钥文件读访问权限。
下面的代码示例编辑 (/E) 指定文件的访问控制列表 (ACL),以向“NETWORK SERVICE”帐户授予 (/G) 对此文件的读 (:R) 访问权限:cacls.exe "C:\Documents and Settings\All Users\Application Data\Microsoft\Crypto\RSA\MachineKeys\8aeda5eb81555f14f8f9960745b5a40d_38f7de48-5ee9-452d-8a5a-92789d7110b1" /E /G "NETWORK SERVICE":R
3) 配置服务端的配置文件,使之使用X509证书服务。
<behavior name="behavior0"> <serviceMetadata httpGetEnabled="true"/> <serviceDebug includeExceptionDetailInFaults="true"/> <serviceCredentials> <clientCertificate> <authentication certificateValidationMode="None"/> </clientCertificate> <serviceCertificate findValue="TestX509Server" storeLocation="LocalMachine" x509FindType="FindBySubjectName" storeName="My"/> </serviceCredentials> </behavior>
4、 授权IIS访问服务器证书
只需要给相应的账号分配权限即可,这里IIS访问证书密钥的权限可以通过WinHttpCertCfg.exe来处理,只需要通过命令行执行该程序即可,如下所示。
winhttpcertcfg -g -c LOCAL_MACHINE\My -s ParkingServer -a "NETWORKSERVICE"
winhttpcertcfg 命令:
winhttpcertcfg -l -c LOCAL_MACHINE\My -s ParkingServer -a "NETWORKSERVICE"
给IIS的NETWORKSERVICE账户以基于证书名称模式授权
winhttpcertcfg -g -c LOCAL_MACHINE\My -s ParkingServer -a "NETWORKSERVICE"
给IIS的NETWORKSERVICE账户以基于证书文件模式授权
winhttpcertcfg -g -i "ParkingServer.pfx" -c LOCAL_MACHINE\My -a "NETWORKSERVICE" -p
移除账号对于证书的授权
winhttpcertcfg -r -c LOCAL_MACHINE\My -s ParkingServer -a "NETWORKSERVICE"
5、 在服务器证书管理中导入服务器端证书
6、 在客户端导入客户端证书,完成X509证书配置并调用服务。
<behavior name="behavior0"> <clientCredentials> <clientCertificate findValue="TestX509Client" x509FindType="FindBySubjectName" storeLocation="LocalMachine" storeName="My"/> <serviceCertificate> <authentication certificateValidationMode="None"/> </serviceCertificate> </clientCredentials> </behavior>
证书authentication (服务器与客户端)共有四种:
None= 未执行任何证书验证
PeerTrust=如果证书位于被信任的人的存储区中,则有效
ChainTrust=如果该链在受信任的根存储区生成证书颁发机构,则证书有效
PeerOrChainTrust=如果证书位于被信任的人的存储区或该链在受信任的根存储区生成证书颁发机构,则证书有效
Custom=用户必须插入自定义 X509CertificateValidator 以验证证书(这种模式很有意思,后面会提到)
7、使用X509证书加密与不加密的区别如下: