从UWP应用程序安装信任锚或证书

本文关键字:证书 信任 安装 UWP 应用程序 | 更新日期: 2023-09-27 18:28:15

我正在为通用windows平台开发密钥管理应用程序,希望安装系统应用程序和第三方应用程序可以使用的CA证书和信任锚。我尝试过使用CertificateStores.GetStoreByName和CertificateStore.Add的组合,以及通过P/Invoke访问CertAddEncodedCertificateToStore的调用。不幸的是,在这两种情况下,调用都成功了,但使用MMC时证书不可见,而且其他应用程序似乎也没有使用证书。

是否有安装证书的方法,使其在系统范围内可用(包括在应用程序容器之外)?有没有任何方法可以查看应用程序容器中安装了哪些证书?

从UWP应用程序安装信任锚或证书

默认为否。请查看证书文章简介。

共享证书存储

UWP应用程序使用Windows 8中引入的新的隔离应用程序模型。在此模型中,应用程序在底层操作系统构造,称为应用程序容器禁止应用程序访问自身之外的资源或文件除非明确允许这对公钥基础设施(PKI)的影响。

每个应用程序容器的证书存储

打算在特定应用程序容器中使用的证书存储在每个用户中,每个应用程序的容器位置。在应用容器中运行的应用具有只对其自己的证书存储进行写访问。如果应用程序将证书添加到其任何存储中,这些证书不能其他应用程序读取。如果卸载了应用程序,则任何证书特定于它的也被移除。应用程序还可以读取本地机器证书存储,而不是MY和REQUEST存储。

无论如何,您可以在Package.appxmanifest中为应用程序添加一项功能。sharedUserCertificates功能授予应用程序容器对用户MY存储和智能卡Trusted Roots存储中包含的证书和密钥的读取访问权限。

  <Capabilities>
    <uap:Capability Name="sharedUserCertificates" />
  </Capabilities>

我添加它只是为了测试(UWP应用程序),下面的代码运行良好。证书已添加到用户的MY存储中。

string pfxCertificate = null;
string pfxPassword = "";    
FileOpenPicker filePicker = new FileOpenPicker();
filePicker.FileTypeFilter.Add(".pfx");
filePicker.CommitButtonText = "Open";
try
{
    StorageFile file = await filePicker.PickSingleFileAsync();
    if (file != null)
    {
        // file was picked and is available for read
        // try to read the file content
        IBuffer buffer = await FileIO.ReadBufferAsync(file);
        using (DataReader dataReader = DataReader.FromBuffer(buffer))
        {
            byte[] bytes = new byte[buffer.Length];
            dataReader.ReadBytes(bytes);
            // convert to Base64 for using with ImportPfx
            pfxCertificate = System.Convert.ToBase64String(bytes);
        }
        await CertificateEnrollmentManager.UserCertificateEnrollmentManager.ImportPfxDataAsync(
            pfxCertificate,
            pfxPassword,
            ExportOption.NotExportable,
            KeyProtectionLevel.NoConsent,
            InstallOptions.None,
            "Test");
    }
}
catch (Exception ex)
{
    Debug.WriteLine(ex.Message);
}

如果有帮助,8.1上提供了一个示例。加密和证书示例