一、导入pfx证书
//AddX509Certificate(pfxPath, pfxPassword, "localhost", "443");
//导入证书,注意当前程序是否具有写入权限
private void AddX509Certificate(string certPath, string certPwd, string certName, int certPort)
{
X509Store store = new X509Store(StoreName.Root, StoreLocation.LocalMachine);
store.Open(OpenFlags.MaxAllowed);
X509Certificate2Collection certs = store.Certificates.Find(X509FindType.FindBySubjectName,
certName, false);
if (certs.Count != 0 && certs[0].NotAfter >= DateTime.Now) return;
X509Certificate2 certificate =new X509Certificate2(certPath, certPwd,
X509KeyStorageFlags.MachineKeySet |
X509KeyStorageFlags.Exportable |
X509KeyStorageFlags.PersistKeySet);
X509Store storeMy = new X509Store(StoreName.My, StoreLocation.LocalMachine);
storeMy.Open(OpenFlags.ReadWrite);
storeMy.Remove(certificate);
storeMy.Add(certificate);
storeMy.Close();
X509Store storeRoot = new X509Store(StoreName.Root, StoreLocation.LocalMachine);
storeRoot.Open(OpenFlags.ReadWrite);
storeRoot.Remove(certificate);
storeRoot.Add(certificate);
storeRoot.Close();
//绑定端口
//BindPort(certPort, certificate.Thumbprint);
}
二、调用外部程序绑定端口
private void BindPort(int port ,string thumbprint)
{
ProcessStartInfo psi = new ProcessStartInfo
{
CreateNoWindow = true,
UseShellExecute = false,
FileName = "netsh",
Arguments = $"http delete sslcert ipport=0.0.0.0:{port}"
};
Process? proc = Process.Start(psi);
if (proc == null)
return;
proc.WaitForExit();
psi.Arguments = $"http add sslcert ipport=0.0.0.0:{certPort}" +
$" certhash={thumbprint}" +
$" appid={{{Guid.NewGuid():N}}}";
proc = Process.Start(psi);
proc.WaitForExit();
}
注:Process 调用外部程序
Process对于处理时间较长且需要重定向输出的操作,重定向异步或同步方式需要保持一致,混用同步和异步重定向可能会出现进程假死情况。
Process process = new Process();
process.EnableRaisingEvents = true;
process.StartInfo.FileName = program;
process.StartInfo.Arguments = arguments;
process.StartInfo.UseShellExecute = false;
//启动进程而不创建进程新窗体设置
process.StartInfo.CreateNoWindow = true;
//指定进程工作路径设置
process.StartInfo.WorkingDirectory = workDir;
//设置或异常进程环境变量
process.StartInfo.Environment.Remove(environment.Key);
process.StartInfo.Environment.Add(environment.Key, environment.Value);
//设置输入、输出对应standard流中
process.StartInfo.RedirectStandardInput = true;
process.StartInfo.RedirectStandardOutput = true;
process.StartInfo.RedirectStandardError = true;
//异步输出事件,不可和同步获取混用
//process.OutputDataReceived+=(object sender, DataReceivedEventArgs e)=>{}
//process.ErrorDataReceived+=(object sender, DataReceivedEventArgs e)=>{}
//process.BeginOutputReadLine();
//process.BeginErrorReadLine();
//同步获取输出,会卡线程,start后调用,不可和异步获取混用
//process.StandardOutput.ReadToEnd();
//开始
process.Start();
//获取或设置一些处理器,此进程中的线程可以按照计划在这些处理器上运行,默认2n-1,n为处理器数
//process.ProcessorAffinity
Comments NOTHING