C# 导入pfx证书、Process调用外部程序

烂柯 发布于 2022-09-23 142 次阅读


一、导入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
烂柯

最后更新于 2023-02-20