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