自动安装数字证书

应用场景

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证书区域中可看到安装的证书。


源代码下载

posted @ 2012-07-03 19:04  beta2013  阅读(469)  评论(0编辑  收藏  举报