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

时间:2015-12-28 22:03:06

标签: c# uwp

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

是否有安装证书的方法,以便它们在系统范围内可用(包括在应用程序容器外部)?有没有办法查看应用容器中安装了哪些证书?

1 个答案:

答案 0 :(得分:5)

默认没有。请检查introduction to certificates article.

  

共享证书存储

     

UWP应用程序使用Windows 8中引入的新隔离主义应用程序模型。在此模型中,应用程序运行   低级操作系统构造,称为app容器,即   禁止应用访问自身之外的资源或文件   除非明确允许这样做。以下部分描述   这对公钥基础设施(PKI)的影响。

     

每个应用容器的证书存储空间

     

打算在特定应用容器中使用的证书存储在每个用户中,   每个应用容器位置。在应用容器中运行的应用有   只能访问自己的证书存储区。如果申请   将证书添加到其任何商店,这些证书不能   其他应用阅读。如果卸载了应用程序,则为任何证书   具体到它也被删除。一个应用程序也具有本地读取权限   除MY和REQUEST商店以外的机器证书商店。

无论如何,您可以在Package.appxmanifest中为您的应用程序添加功能。 sharedUserCertificates 功能授予应用容器对用户MY商店和智能卡受信任根存储中包含的证书和密钥的读取权限。

  <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上获得样本。 Cryptography and Certificate sample