繁体   English   中英

自动安装 p12 证书文件

[英]automate installation of p12 certificate file

我的目标是在没有任何用户交互的情况下自动安装证书。

要求:

  • 为当前用户安装
  • 启用强大的私钥保护
  • 将此密钥标记为可导出
  • 将私钥安全级别设置为高(使用此项目时,请使用密码请求我的许可)

代码:

using System.Security.Cryptography.X509Certificates;
X509Certificate2 cert = new X509Certificate2(
     "file.p12", "password", 
      X509KeyStorageFlags.UserProtected
     | X509KeyStorageFlags.UserKeySet
     | X509KeyStorageFlags.Exportable);
X509Store store = new X509Store(StoreName.My);
store.Open(OpenFlags.ReadWrite);
store.Add(cert);

上面的代码在个人商店下为当前用户安装证书,并且能够管理第一个 gui:截图 - 证书导入向导

但它无法设置安全级别,而是打开了一个 gui: Screenshot2

编辑:

实际上还有另一种方法可以通过 UWP 使用,称为 "UserCertificateEnrollmentManager.ImportPfxDataAsync Method" Link “KeyProtectionLevel Enum”在这里为您提供“ConsentWithPassword”选项,但 UWP 对我来说是全新的,我更愿意坚持使用控制台 .net

使用 UWP 进行测试会显示一个额外的“UWP 样式”对话框,请求同意证书操作,然后要求创建密码,因此它会跳过屏幕截图 2 中显示的 GUI。 不知道有没有用?

UWP 同意对话框

Windows 安全证书通过对话框

private async Task<string> PickPfx()
{
    var openPicker = new FileOpenPicker()
    {
        ViewMode = PickerViewMode.List,
        SuggestedStartLocation = PickerLocationId.Desktop,
    };

    openPicker.FileTypeFilter.Add(".pfx");
    openPicker.FileTypeFilter.Add(".p12");

    var file = await openPicker.PickSingleFileAsync();
    if (file == null)
        return null;

    int length = (int)(await file.GetBasicPropertiesAsync()).Size;
    byte[] bytes = new byte[length];

    using (var stream = await file.OpenStreamForReadAsync())
    {
        await stream.ReadAsync(bytes, 0, length);
    }

    return Convert.ToBase64String(bytes);
}

private async void InstallCert_Click(object sender, RoutedEventArgs e)
{
    const string CERT_PASS = "123test";

    string pfx64 = await PickPfx();
    if (pfx64 == null)
        return;

    var importParams = new PfxImportParameters()
    {
        Exportable = ExportOption.Exportable,
        FriendlyName = "My test cert",
        KeyProtectionLevel = KeyProtectionLevel.ConsentWithPassword,
    };

    var ucem = CertificateEnrollmentManager.UserCertificateEnrollmentManager;
    await ucem.ImportPfxDataAsync(pfx64, CERT_PASS, importParams);
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM