• 自动安装数字证书


    应用场景

    WCF的服务端与客户端可使用证书加强其通讯安全。



    解决方案一:利用Visual Studio的Prerequiste

    参考 完整版WPF Browser Application证书制作、发布与自动下载安装 一文。流程总结如下:

    1、生成证书

    2、创建证书安装程序

    3、到目录C:\Program Files\Microsoft SDKs\Windows\v6.0A\Bootstrapper\Packages\下建证书安装程序对应的prerequiste包

    4、为应用程序的安装/发布的Prerequiste设定项



    解决方案二:自制证书安装程序与应用程序一起发布

    1、生成证书

    使用“Visual Studio命令提示”工具生成证书文件:

    makecert -r -sky exchange -n "CN=MyCompany" -sv MyCompany.pvk MyCompany.cer
    pvk2pfx.exe -pvk MyCompany.pvk -spc MyCompany.cer -pfx MyCompany.pfx


    2、创建证书安装程序

    流程

    • 创建控制台工程
    • 修改app.manifest文件,使本证书安装助手能在管理员权限下运行
    • 在工程的资源文件中将.pfx证书导入
    • 在入口程序中安装资源文件中的证书
    • 写证书辅助程序,供其它应用程序(WCF服务端、WCF客户端哒哒哒)调用

    Main类

    namespace CertificateInstaller
    {
        class Program
        {
            static void Main()
            {
                CertificateHelper.InstallCertificateFromResource();
            }
        }
    }
    


    CertificateHelper类

    using System.Diagnostics;
    using System.Reflection;
    using System.Security;
    using System.Security.Cryptography.X509Certificates;
    
    namespace CertificateInstaller
    {
        public class CertificateHelper
        {
            /// <summary>
            /// 安装资源文件中的证书
            /// </summary>
            internal static void InstallCertificateFromResource()
            {
                var certificate = GetCertificateFromResource();
                var store = new X509Store(StoreName.AuthRoot, StoreLocation.LocalMachine);
                store.Open(OpenFlags.ReadWrite);
                store.Remove(certificate);
                store.Add(certificate);
                store.Close();
            }
    
            /// <summary>
            /// 获取资源文件中的证书
            /// </summary>
            private static X509Certificate2 GetCertificateFromResource()
            {
                //使用“Visual Studio命令提示”工具生成证书文件:
                //makecert -r -pe -n "CN=MyCompany" -sky exchange -sv MyCompany.pvk MyCompany.cer
                //pvk2pfx.exe -pvk MyCompany.pvk -spc MyCompany.cer -pfx MyCompany.pfx
                //然后将MyCompany.pfx导入成资源
                var certificatefile = Properties.Resources.MyCompany;
                return new X509Certificate2(certificatefile,"",X509KeyStorageFlags.PersistKeySet);
            }
    
            /// <summary>
            /// 尝试获取计算机中的证书
            /// </summary>
            private static X509Certificate2 TryGetCertificate()
            {
                var store = new X509Store(StoreName.Root, StoreLocation.LocalMachine);
                store.Open(OpenFlags.ReadOnly);
                var certs = store.Certificates.Find(X509FindType.FindBySubjectDistinguishedName, GetCertificateFromResource().Subject, false);
                return (certs.Count > 0) ? certs[0] : null;
            }
    
            /// <summary>
            /// 通过另开进程运行本程序集来安装证书
            /// </summary>
            private static void InstallCertificate()
            {
                Process.Start(Assembly.GetExecutingAssembly().ManifestModule.Name).WaitForExit();
            }
    
            /// <summary>
            /// 尝试获取计算机中的证书,若不成功,则为其安装再获取一次
            /// </summary>
            public static X509Certificate2 GetCertificate()
            {
                var cert = TryGetCertificate();
                if (cert == null)
                    InstallCertificate();
                cert = TryGetCertificate();
                if (cert == null)
                    throw new SecurityException("找不到数字证书");
                return cert;
            }
        }
    }
    


    3、在应用程序(WCF服务端、WCF客户端哒哒哒)中调用

    一行即可:
    //获取用户计算机中安装的证书
    var cert=CertificateHelper.GetCertificate();

    4、查看安装的证书

    运行“mmc”,添加”证书“单元,在ROOT证书区域中可看到安装的证书。


    源代码下载

    勉強心を持てば、生活は虚しくない!
  • 相关阅读:
    浅谈python socket编程
    MYSQL(三)
    python数据库操作之pymysql模块和sqlalchemy模块(项目必备)
    MYSQL(二)
    ajax应用篇
    浅析tornado web框架
    CSS学习笔记06 简单理解line-height
    CSS学习笔记05 display属性
    CSS学习笔记04 CSS文字排版常用属性
    CSS学习笔记03 CSS层叠性、继承性、特殊性
  • 原文地址:https://www.cnblogs.com/beta2013/p/3377295.html
Copyright © 2020-2023  润新知