定义
不对称算法
公钥
私钥
证书
证书的颁发机构的信息
本证书的颁发机构标识
颁发机构对本证书的签名得到的加密结果
证书拥有者的信息
标识
公钥
证书用到的算法
散列算法
不对称算法
颁发机构
给本证书签名的父证书与父证书的私钥的拥有者
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置于网页中自动下载安装