数字证书

定义

  不对称算法

    公钥
    私钥

  证书

    证书的颁发机构的信息
      本证书的颁发机构标识
      颁发机构对本证书的签名得到的加密结果
    证书拥有者的信息
      标识
      公钥
    证书用到的算法
      散列算法
      不对称算法

  颁发机构

    给本证书签名的父证书与父证书的私钥的拥有者
      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中管理证书

cermgr.msc
mmc

使用代码安装证书



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置于网页中自动下载安装

    

创建X509证书,并获取证书密钥的一点研究

思维导图下载

原文地址:https://www.cnblogs.com/beta2013/p/3377268.html