通过查阅msdn数字证书相关信息,个人觉得程序的证书要最终发挥作用,应当是将我们自己的证书最终要导入到控制台的受信任的根证书颁发机构,不论可执行程序是在何时注册的数字证书(可能是已经注册好放入安装包,也可能是在安装时注册),这时以管理员运行时就会显示出证书的信息,若没有在受信任的根证书颁发机构,将显示发布者未知。
那现在我们要做的也很明确了:
1:首先我们需要生成一个自己的证书
2:我们要将证书导入到 受信任的根证书颁发机构
那如何生成自己的证书呢?微软提供有Makecert.exe(证书创建工具),也可以使用代码的方式生成,下面介绍如何使用Makecert.exe创建我们的证书
Makecert.exe这个工具只要我们安装了visual studio,使用命令提示符就可以了
在命令提示符内输入
makecert -r -pe -n "CN=你的证书名字" -a sha1 -b 01/01/2012 -e 01/01/2040 -sky exchange -ss my
-ss my:证书生成到个人证书位置,这时我们可以在控制台个人证书位置找到生成的证书了,参数的具体含义查看Makecert.exe
因后续我们需要将证书在安装时导入到客户机器上,所以我们将生成好的证书导出,右键证书->所有任务->导出,如图

我们选择默认的格式导出(.CER)。
现在我们已经有了自己的证书文件,还需要将其导入到 受信任的根证书颁发机构。我们这块使用代码实现将其导入,操作类(X509Certificate2)。
+ View Code?
X509Certificate2 cert = new X509Certificate2("逗豆豆.cer");
bool my_import = false;
bool root_import = false;
if (cert != null)
{
var store2 = new X509Store(StoreName.My, StoreLocation.CurrentUser);
store2.Open(OpenFlags.ReadWrite);
if (!store2.Certificates.Contains(cert))
{
my_import = true;
store2.Add(cert);
}
var store = new X509Store(StoreName.Root, StoreLocation.LocalMachine);
store.Open(OpenFlags.ReadWrite);
if (!store.Certificates.Contains(cert))
{
root_import = true;
store.Add(cert);
}
}
StringBuilder sb = new StringBuilder();
if (my_import)
{
sb.Append("成功导入到个人证书目录\r\n");
}
if (root_import)
{
sb.Append("成功导入到受信任的根证书颁发机构证书目录\r\n");
}
if (sb.Length == 0)
MessageBox.Show("已经导入过证书");
else
MessageBox.Show(sb.ToString());
上面代码将证书导入到了个人证书以及受信任的根证书颁发机构,接下来我们需要对我们的可执行程序进行签名,那签名与生成证书类似,微软也有提供一个SignTool.exe(签名工具),同样打开命令提示符输入:signtool sign /a F:\SignatureDemo.exe,参数的具体含义查看SignTool.exe
这个时候右键管理员身份运行就可以看到我们要的效果便达到了。但是实际项目中可能需要在安装程序的时候将证书导入,所以我们可以添加一个安装类,在重写安装的方法内将证书导入:
+ View Code?
using System;
using System.Collections;
using System.Collections.Generic;
using System.ComponentModel;
using System.Configuration.Install;
using System.Linq;
using System.Security.Cryptography.X509Certificates;
namespace SignatureDemoInstaller
{
[RunInstaller(true)]
public partial class DemoInstaller : System.Configuration.Install.Installer
{
public DemoInstaller()
{
InitializeComponent();
}
//-------------重写安装方法------------------------------------------------
public override void Install(IDictionary stateSaver)
{
base.Install(stateSaver);
ImportCert();
}
//-------------导入证书----------------------------------------------------
private void ImportCert()
{
X509Certificate2 cert = new X509Certificate2(Context.Parameters["targetdir"] + "\\Bin\\SityTech.cer");
if (cert != null)
{
var store2 = new X509Store(StoreName.My, StoreLocation.CurrentUser);
store2.Open(OpenFlags.ReadWrite);
if (!store2.Certificates.Contains(cert))
{
store2.Add(cert);
}
var store = new X509Store(StoreName.Root, StoreLocation.LocalMachine);
store.Open(OpenFlags.ReadWrite);
if (!store.Certificates.Contains(cert))
{
store.Add(cert);
}
}
}
}
}
五、源代码什么的
关于如何打包以及部署问题,可以参考文章的最顶端有介绍,这里就不再赘述,实际步骤很简单,大家完全可以使用代码生成证书的方式,做到动态生成证书并导入,文章可能看起来排版不这么好,也是给想要深入研究的人一点点小建议,另外使用vs2011之前版本的部署项目,生成的msi文件安装完毕之后,桌面的快捷方式右键指向不到程序目录并且右键也没有管理员身份运行的选项,需要使用Orca工具编辑一下,安装完毕Orca之后右键Msi程序->用Orca编辑,在左边的Tables列表中找到Shortcut表,在右边记录中找到Directory为DesktopFolder的记录,修改该记录的Target属性为 [TARGETDIR]应用程序名称.exe即可。
再另外一下..此文章生成证书仅限于学习交流,正式生产环境下,大家应该去证书颁发机构购买,其实很便宜的...,最后demo和msi编辑工具奉上,算是有点用的话,点下推荐吧