打算开发一个软件使用rsa加密的东西,所以有用到数字证书这块,最近遇到些问题,

问题一:使用如下代码添加数字证书后,在证书管理器的当前用户和本地计算机下都找不到这张证书。

 using (X509Store store = new X509Store(StoreName.My, StoreLocation.CurrentUser))
{
store.Open(OpenFlags.MaxAllowed); string documentsPath = Windows.Storage.ApplicationData.Current.LocalFolder.Path;
var path = Path.Combine(documentsPath, @"Mytestcer.pfx");//Mytestcer.pfx
X509Certificate2 myX509Certificate2 = new X509Certificate2(
path, //证书路径
"", //证书的私钥保护密码
X509KeyStorageFlags.Exportable|X509KeyStorageFlags.UserKeySet | X509KeyStorageFlags.PersistKeySet//表示此证书的私钥以后还可以导出
);
store.Add(myX509Certificate2); }

问题二:如上面代码添加完数字证书后,使用下列代码却可以看查到我导入的数字证书。

 using (X509Store store = new X509Store(StoreName.My, StoreLocation.CurrentUser))
{
store.Open(OpenFlags.ReadOnly);
foreach (var item in store.Certificates)
{
if (item.SerialNumber == "22307124FFF203CD55109BB")
{
X509Certificate2 cert = new X509Certificate2(item.RawData,"", X509KeyStorageFlags.UserKeySet|X509KeyStorageFlags.Exportable|X509KeyStorageFlags.PersistKeySet);
var s = item.Export(X509ContentType.Pkcs12);
result = item.Export(X509ContentType.Pfx, "");
break;
}
}
}

问题三,我直接点击证书,安装后在证书管理器上可以看到这张证书,在使用问题二去取证书的时候,发现有两张一样的证书,且其中一张可以用item.Export(X509ContentType.Pfx, "1111111111");取到密钥,其中一张报错:拒绝访问。

问题四,在添加一个应用,使用问题二的方式访问数字证书,可以取到一张证书,但是取私钥时报错:拒绝访问。

推断是安装时有权限问题,应用程序自己安装的证书只能自己去调用,且证书管理器看不见,为应用程序私有的证书,安装的证书其他程序找不到。

尝试过下列方式:

方式一:设置下列两个属性为true,尝试结果:失败,在xamarin uwp环境下不存在下面的设置,及没有下面命名空间的设置字段。

System.Security.Cryptography.RSACryptoServiceProvider.UseMachineKeyStore=true;
System.Security.Cryptography.DSACryptoServiceProvider.UseMachineKeyStore=true;

方式二:如何使用System.Security.Cryptography命名空间,尝试结果:解决,在早期版本中不存在上面的命名空间,需升级到最新版本,

Microsoft.NETCore.UniversalWindowsPlatform  版本5.2.2

方式三:设置下列文件的权限,C:\Documents and Settings\All Users\Application Data\Microsoft\Crypto\RSA)的“完全控制”权限设置为“允许”。尝试结果:设置后无效果。

方式四:证书管理器->本地计算机->证书->所有任务->管理私钥,添加权限。尝试结果:未能解决问题三。

方式五:使用下列方式插入数字证书,

 FileOpenPicker picker = new FileOpenPicker();
picker.FileTypeFilter.Add(".pfx");
StorageFile pfxFile = await picker.PickSingleFileAsync();
if (pfxFile != null)
{
// 将证书内容转为base64字符串
IBuffer buffer = await FileIO.ReadBufferAsync(pfxFile);
string cerB64 = CryptographicBuffer.EncodeToBase64String(buffer);
// 密码
string password = "";
// 导入证书
// 导入到当前用户存储
await CertificateEnrollmentManager.UserCertificateEnrollmentManager.ImportPfxDataAsync(cerB64, password, ExportOption.Exportable, KeyProtectionLevel.NoConsent, InstallOptions.DeleteExpired, "GoodBoy");
// 导入到当前应用存储
//await CertificateEnrollmentManager.ImportPfxDataAsync(cerB64, password, ExportOption.Exportable, KeyProtectionLevel.ConsentOnly, InstallOptions.DeleteExpired, "GoodBoy");
}

尝试结果:导入的证书可以正常显示了,也可以隐藏,解释如下:系统为每个APP创建一个独立的证书存储区,在应用安装时创建,在应用卸载时被删除。因此,每个应用的证书只能自己使用,不能访问其他应用的证书。如果希望让其他应用也能使用证书,就要用“共享用户证书”,被共享的证书会导入到当前系统的用户证书存储区中,所以,其他应用都可以访问,当然了,为了防止别有用心的人乱来,应用只有导入和读取的权限,不能写入和删除证书。

感谢园区东邪独孤提供的文档,我是搬运工。

方式六:使用方式五导入证书时,如果选择

CertificateEnrollmentManager.UserCertificateEnrollmentManager.ImportPfxDataAsync导入证书,那证书可见,但是使用问题二方法去取私钥时会提示拒绝访问,使用
CertificateEnrollmentManager.ImportPfxDataAsync导入证书,证书只单独应用可用,证书不可见,使用问题二方式访问私钥正常使用。尝试结果:问题解决。
遗留问题:当为共享证书的时候,拒绝访问私钥。

xamarin UWP证书问题汇总的更多相关文章

  1. xamarin uwp数字证书公钥私钥

    对于数字证书存储导入到电脑中,采用如下方式: /// <summary> /// 导入证书 /// </summary> /// <param name="ra ...

  2. xamarin UWP ActivityIndicator

    在xamarin的UWP平台使用ActivityIndicator时,如果你时后台创建的这个对象,请设置他的宽度,不然在UWP平台下会发现找不这个对象,其实是在这个平台和特点版本下的宽度没设置,导致有 ...

  3. xamarin UWP图片读取

    xamarin使用listview时经常会使用图片,而图片的图片源设置在uwp平台中是有平台特性的,这点请注意区分处理.也就是说在android和IOS上正常的处理在uwp下却是错误的方式. 如同一张 ...

  4. xamarin UWP平台线程交互问题

    先吐槽一下,xamarin到现在为止,虽然开发一下应用尚可,对于一些简单的app开发使用xamarin-forms方式开发,虽然有一些优势,可以省下开发三个平台共同功能的时间,但是当我们随着项目深入的 ...

  5. xamarin UWP平台下 HUD 自定义弹窗

    在我的上一篇博客中我写了一个在xamarin的UWP平台下的自定义弹窗控件.在上篇文章中介绍了一种弹窗的写法,但在实际应用中发现了该方法的不足: 1.当弹窗出现后,我们拖动整个窗口大小的时候,弹窗的窗 ...

  6. xamarin UWP设置HUD加载功能

    使用xamarin开发的时候经常用到加载HUD功能,就是我们常见的一个加载中的动作,Android 下使用 AndHUD , iOS 下使用 BTProgressHUD, 这两个在在 NuGet 上都 ...

  7. xamarin UWP中MessageDialog与ContentDialog的区别

    MessageDialog与ContentDialog的异同点解析: 相同点一:都是uwp应用上的一个弹窗控件.都能做为弹出应用. 相异点一:所在命名空间不同,MessageDialog在Window ...

  8. xamarin UWP自定义圆角按钮

    uwp自带的button本身不支持圆角属性,所以要通过自定义控件实现. 通过设置Button的Background=“{x:Null}”设置为Null使背景为空,再设置Button.Content中的 ...

  9. 微软XAML Studio - WPF, Sliverlight, Xamarin, UWP等技术开发者的福音

    目录 编辑器功能 数据源功能 调试数据绑定 伟大的开始 我们来一起实践吧 最近又在继续倒腾WPF的项目,继续使用Caliburn.Micro和Xceed来堆代码.每次调试xaml上的binding,都 ...

随机推荐

  1. JMeter中HTTP Cookie 管理器使用

    案例: 在一次做公司OA系统的时候,发现录制脚本无法回放成功,通过定位,是因为登录的过程中存在重定向,导致登录接口的状态没有自动带入重定向页面 解决方法: 加入HTTP Cookie 管理器使用 现象 ...

  2. iOS Start developing ios apps (OC) pdf

    这是苹果官方最后一次更新的基于OC的iOS开发基础教程, 如果英文的看不懂,还有中文的版本哦. 点击下面的链接 好东西,分享给大家! 如果确实有帮到你,麻烦star一下我的github吧!

  3. js 逻辑或

    逻辑或操作符由两个竖线来表示||,属于短路操作符,也就是说,如果第一个操作数的求职结果为true,就不会对第二个操作数进行求值 var found = true; var result = found ...

  4. 【oracle】union、union all、intersect、minus 的用法及区别

    一.union与union all 首先建两个view create or replace view test_view_1 as as c from dual union as c from dua ...

  5. dotnet webapi 中添加Swagger文档

    首先添加"SwaggerGenerator": "1.1.0","SwaggerUi": "1.1.0" 需要注意的是这 ...

  6. Django 权限管理

    对于Django而言,虽然自带了一些基本的通用权限限制,但现实中,可能我们更希望自己去定义业务权限划分 Django对于权限这块的部分验证方法 user = request.user user.is_ ...

  7. ZOJ1913 Euclid's Game (第一道简单的博弈题)

    题目描述: Euclid's Game Time Limit: 2 Seconds      Memory Limit: 65536 KB Two players, Stan and Ollie, p ...

  8. 定时任务crontab 例子

    查看定时任务格式 [root@centos ~]# vim /etc/crontab 1 SHELL=/bin/bash 2 PATH=/sbin:/bin:/usr/sbin:/usr/bin 3 ...

  9. python 之 Django 小案例

    一, F  Q # F 使用查询条件的值 # # from django.db.models import F # models.Tb1.objects.update(num=F('num')+1) ...

  10. C#读取Excel设置(亲测可用)

    OpenFileDialog openFD = new OpenFileDialog(); openFD.FileName = ""; openFD.Filter = " ...