我正在开发通用Windows平台的密钥管理应用程序,并希望安装可供系统应用程序和第三方应用程序使用的CA证书和信任锚。我尝试过使用CertificateStores.GetStoreByName和CertificateStore.Add的组合,以及通过P / Invoke访问CertAddEncodedCertificateToStore的调用。不幸的是,在这两种情况下,调用都成功但使用MMC看不到证书,并且它们似乎没有被其他应用程序使用。
是否有安装证书的方法,以便它们在系统范围内可用(包括在应用程序容器外部)?有没有办法查看应用容器中安装了哪些证书?
答案 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