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