总体思路:
1、自己创建证书,在安装插件时,调用注册证书。
2、给入口的dll添加签名
一、创建证书
在vs安装目录下找到Visual Studio Tools文件夹下的Developer PowerShell for VS 2019工具进行创建,或 打开vs,在工具-->命令行-->开发者PowerShel中启动命令窗口
PS C:\Users\Administrator\source\repos> makecert -n "CN=CommonRoot" -r -sv D:\001Test\common.pvk D:\001Test\common.cer
Succeeded
PS C:\Users\Administrator\source\repos> pvk2pfx -pvk D:\001Test\common.pvk -spc D:\001Test\common.cer -pfx D:\001Test\common.pfx -pi common
创建完成后,有两个文件使用到,一个为.cer,一个为.pfx,其中.cer为安装包安装时调用注册证书使用,.pfx为给dll签名时使用,需要记住在创建证书时的密码,在签名时需要用上
二、创建一个控制台项目,用于注册证书(注意不要直接双击安装.cer文件,因为直接安装,不会添加到受信任证书中,所以需要通过以下代码进行安装)
注意修改代码中的以下内容
“RegisterCert.exe”替换为当前控制台程序,
“for_revit.cer”换为生成的.cer名称,
“CN=公司名称ForRevit”替换为创建证书时输入的名字
using System;
using System.Security.Cryptography.X509Certificates;
namespace RegisterCert
{
class Program
{
static void Main(string[] args)
{
try
{
System.Security.Principal.WindowsIdentity identity = System.Security.Principal.WindowsIdentity.GetCurrent();
System.Security.Principal.WindowsPrincipal principal = new System.Security.Principal.WindowsPrincipal(identity);
//判断当前登录用户是否为管理员
if (principal.IsInRole(System.Security.Principal.WindowsBuiltInRole.Administrator))
{
//如果是管理员,则直接运行
Run();
}
else
{
//创建启动对象
System.Diagnostics.ProcessStartInfo startInfo = new System.Diagnostics.ProcessStartInfo();
//设置运行文件
startInfo.FileName = Environment.CurrentDirectory + @"\RegisterCert.exe";
//设置启动参数
//设置启动动作,确保以管理员身份运行
startInfo.Verb = "runas";
//如果不是管理员,则启动UAC
System.Diagnostics.Process.Start(startInfo);
}
}
catch
{
}
}
static void Run()
{
var certificate = new X509Certificate2(Environment.CurrentDirectory + @"\for_revit.cer");
if (!CheckCert())
{
X509Store store = new X509Store(StoreName.TrustedPublisher, StoreLocation.LocalMachine);
try
{
store.Open(OpenFlags.ReadWrite);
store.Add(certificate);
}
finally
{
store.Close();
}
}
if (!CheckCert2())
{
var store = new X509Store(StoreName.Root, StoreLocation.LocalMachine);
try
{
store.Open(OpenFlags.ReadWrite);
store.Add(certificate);
}
finally
{
store.Close();
}
}
}
/// <summary>
/// 检测是否存在指定的证书
/// </summary>
/// <returns></returns>
static bool CheckCert()
{
bool result = false;
X509Store store = new X509Store(StoreName.TrustedPublisher, StoreLocation.LocalMachine);
try
{
store.Open(OpenFlags.ReadWrite);
foreach (var item in store.Certificates)
{
if (item.SubjectName.Name == "CN=公司名称ForRevit")
{
result = true;
}
}
}
finally
{
store.Close();
}
return result;
}
static bool CheckCert2()
{
bool result = false;
X509Store store = new X509Store(StoreName.Root, StoreLocation.LocalMachine);
try
{
store.Open(OpenFlags.ReadWrite);
foreach (var item in store.Certificates)
{
if (item.SubjectName.Name == "CN=公司名称ForRevit")
{
result = true;
}
}
}
finally
{
store.Close();
}
return result;
}
}
}
三、给dll添加签名
signtool sign /fd SHA256 /f D:\001Test\common.pfx /p common "D:\001Test\test.dll"