数字证书
定义
不对称算法
公钥
私钥
证书
证书的颁发机构的信息
本证书的颁发机构标识
颁发机构对本证书的签名得到的加密结果
证书拥有者的信息
标识
公钥
证书用到的算法
散列算法
不对称算法
颁发机构
给本证书签名的父证书与父证书的私钥的拥有者
CA
证书链
根证书
国际认证机构
颁发主体
本证书与其私钥的拥有者
厂商
软件发行者
签名
使用证书指定的算法对信息进行散列与不对称加密
生成结果:
用到的证书
加密结果
存储区
是保留和管理证书的物理存储区
StoreLocation
LocalMachine
CurrentUser
StoreName
Root
My
AddressBook
AuthRoot
CertificateAuthority
Disallowed
TrustedPeople
TrustedPublisher
密钥容器
包含一个/对密钥与存储所需的相关信息:
是否允许导出密钥
密钥种类
工具
CertMgr.msc
MMC.exe
MakeCert.exe
Cert2Spc.exe
SignTool.exe
pvk2pfx.exe
解决
颁发机构与厂商各藏有自己私有的私钥
用户有颁发机构的公钥
用户的操作系统中安装了知名颁发机构的证书
信任关系可以传递
厂商发布的产品若已签名,则此签名的安全信任关系可以一直追踪到用户信任的颁发机构,则此产品是安全的
实践
测试
创建自签名的发行证书同时导入本地计算机
makecert -r -n "CN=我的自签名发行证书" -ss root
使用此证书对ActiveX控件进行签名
signtool sign /s root /n "我的自签名发行证书" MyMFCActiveXControl.ocx
模拟
模拟颁发机构
创建自签名的根证书
makecert -r -n "CN=模拟颁发机构根证书" -sv myroot.pvk myroot.cer
创建使用根证书签名的厂商发行证书
makecert -n "CN=模拟厂商发行证书" -iv myroot.pvk -ic myroot.cer -sv myspc.pvk myspc.cer
cert2spc myspc.cer myspc.spc
pvk2pfx -pvk myspc.pvk -pi 456 -po 456 -spc myspc.spc -pfx myspc.pfx
拿到.pfx文件即可
模拟厂商
signtool sign /f myspc.pfx /p 456 test.ocx
模拟用户
将myroot.cer安装到“受信任的根证书颁发机构”存储区下
使用厂商发行的软件
正式
厂商向证书颁发机构申请发行证书,得到.pfx文件后对发行软件进行签名。
应用
加解密
class Program { static void Main(string[] args) { //实例化CspParameters对象 var cspPara = new CspParameters { //如果在证书库中此名称对应的密钥容器已经存在,RSA对象会使用这个密钥容器中的密钥进行实例化,否则会创建这个密钥容器 KeyContainerName = "myPK" }; //加密解密用到的公钥与私钥 var rsa = new RSACryptoServiceProvider(cspPara); var publicKeyAndPrivateKey = rsa.ToXmlString(true);//私钥与公钥 var publicKeyOnly = rsa.ToXmlString(false);//公钥 //需要加密的数据 const string text = "你好"; Console.WriteLine("要加密的文本:{0}",text); //公钥加密 var rsa1 = new RSACryptoServiceProvider(); rsa1.FromXmlString(publicKeyOnly); //加密要用到公钥所以导入公钥 var cypherSource = Encoding.UTF8.GetBytes(text); var cypherResult = rsa1.Encrypt(cypherSource, false); //AOutput 加密以后的数据 //私钥解密 var rsa2 = new RSACryptoServiceProvider(); rsa2.FromXmlString(publicKeyAndPrivateKey); var plainResult = rsa2.Decrypt(cypherResult, false); var plainText = Encoding.UTF8.GetString(plainResult); Console.WriteLine("解密后的文本:{0}", plainText); } }
ActiveX
若浏览的远程网页中包含未使用正规证书签名开发的ActiveX,则必须在访客端的浏览器上做以下设置:
允许IE使用控件
将站点加入可信站点(去除https限制选项框)
将Internet级别降低为中(原为中高)
允许脚本与控件交互
设置
对未标识为可安全执行脚本的ActiveX控件初始化并执行脚本
允许IE下载并安装控件
设置
下载未签名的ActiveX控件
在Windwos中管理证书
使用代码安装证书
var store = new X509Store(StoreName.Root, StoreLocation.CurrentUser); store.Open(OpenFlags.ReadWrite); var certificate = new X509Certificate2(@"cer.cer"); store.Add(certificate); store.Close();
参考
.NET中非对称加密RSA算法的密钥保存
数字签名、数字信封和数字证书
签名工具 (SignTool.exe)
证书创建工具(MakeCert.exe)
微软代码签名证书使用指南
ActiveX控件打包成Cab置于网页中自动下载安装