【Win 10 应用开发】导入.pfx证书
这个功能其实并不常用,一般开发较少涉及到证书,不过,简单了解一下还是有必要的。
先来说说制作测试证书的方法,这里老周讲两种方法,可以生成用于测试的.pfx文件。
产生证书,大家都知道有个makecert工具。好,我们先用这个工具来生成一个证书,并存放到当前用户的证书存储中。打开VS的开发人员命令提示符,然后输入:
makecert -n "CN=中国好男人" -pe -sr CurrentUser -ss My -b // -e //
-n 表示证书的标题名字,在系统的证书管理单元窗口中,它会显示在“颁发给”一列中,即证书是颁给谁的。在本例中,该荣誉证书主要颁发给中国好男人。
-pe 参数一定要加上,它表示我们能否导出证书的密钥(私钥),因为稍后我们要将证书导出为.pfx。
-sr 表示证书是作为用户证书还是本台计算机的证书。用户证书即CurrentUser,只有当前登录的用户可见;如果希望所有用户都可见,可以用LocalMachine,即本台计算机范围的证书。
-ss 表示证书存储目录,MY表示证书将安装到“个人”目录下。
-b -e 表示证书的有效期,这个不用多说。
命令执行完后。打开用户证书管理窗口,展开个人分支,就会看到刚刚创建的证书。
接下来就好办了,直接导出这个证书即可。在导出向导的第二页,记得选择“导出私钥”。
因为.pfx文件是可以包含私钥的。此时,进入下一步,会自动选择个人信息交换。
下面的几个复选项,你可按实际情况来决定,然后下一步,在安全选项页中,勾选密码,然后自己输入密码。
密码可以自己决定,比如我输入弱智密码1234。
接着选择.pfx文件的存放路径。
随后一路下一步,直到完成即可。
上面的方法是通过证书管理窗口来完成的,下面我们再看另一种方法,这种方法是完全用命令来完成的。除了必须的 makecert 工具外,还需要用到 cert2spc 和 pvk2pfx 这两个家伙。从名字上就可以知道它们是干吗的,cert2spc就是把证书文件(.cer)转化为spc文件,而pvk2pfx是将结合私钥文件和spc文件,最终输出.pfx文件。
第1步,产生证书和私钥文件。输入以下命令:
makecert -n "CN=中国好闺女" -pe -b // -e // -sv testkey.pvk test.cer
前面几个参数刚才说过了,-sv 表示密钥文件的名字,后缀名一般为.pvk,即私钥,最后的参数是证书的文件名,后缀是.cer。本命令是直接生成文件,而不是在证书存储区中。
执行后,首先弹出一个输入框,让你为pvk文件创建密码,比如,我依旧用弱智密码1234。
点OK确定后,会再次弹出一个输入框,这一次是要你输入你刚刚创建的密码,比如1234。
确定后,若无意外,证书和私钥文件已经生成,如下图所示。
确定这两个文件成功生成后,进入下一步。
第2步,把cer转为spc,输入命令:
cert2spc test.cer test.spc
第一个参数是待转的cer文件(证书),第二个参数是输出的spc文件。
命令执行后,会多了个test.spc文件。
第3步,利用上面生成的spc和pvk文件,生成pfx文件,输入命令:
pvk2pfx -pvk testkey.pvk -pi -spc test.spc -pfx test.pfx -po
-pvk 是刚创建的pvk文件,-pi是pvk文件的密码,刚刚我设置了是1234;
-spc 是刚刚生成的spc文件的名字,-pfx是输出的pfx文件名,-po是新pfx的密码,我改为123456。
命令执行后,会看到多了个.pfx文件。
大功告成,现在,pfx文件已经有了,接下就是在UWP应用中导入证书了。
在干活之前,我们要知道,系统为每个APP创建一个独立的证书存储区,在应用安装时创建,在应用卸载时被删除。因此,每个应用的证书只能自己使用,不能访问其他应用的证书。如果希望让其他应用也能使用证书,就要用“共享用户证书”,被共享的证书会导入到当前系统的用户证书存储区中,所以,其他应用都可以访问,当然了,为了防止别有用心的人乱来,应用只有导入和读取的权限,不能写入和删除证书。
在Windows.Security.Cryptography.Certificates命名空间下,公开了几个与证书操作有关的类。经老周测试,不是所有的API都能用,有些API会发生异常,可能还没有完全实现吧,具体得看今年“红石”更新了,反正Win 10是不断累积更新的,这个道理,8000年前我们的祖先就懂了。
CertificateEnrollmentManager 类公开了N版重载的ImportPfxDataAsync方法,就是支持从.pf文件导入证书。
但是,你得注一个事:如果直接调用 CertificateEnrollmentManager 类的方法,表明导入的证书是存放在应用的独立存储区中,只能自己使用。
如果调用的是 CertificateEnrollmentManager.UserCertificateEnrollmentManager 下面的方法,说明证书是导入到用户存储区中,可以与其他应用共享。
好,下面来看一段导入证书的代码。
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 = pwd.Password; // 导入证书
if (chkUserCert.IsChecked == true)
{
// 导入到当前用户存储
await CertificateEnrollmentManager.UserCertificateEnrollmentManager.ImportPfxDataAsync(cerB64, password, ExportOption.Exportable, KeyProtectionLevel.NoConsent, InstallOptions.DeleteExpired, "GoodBoy");
}
else
{
// 导入到当前应用存储
await CertificateEnrollmentManager.ImportPfxDataAsync(cerB64, password, ExportOption.Exportable, KeyProtectionLevel.ConsentOnly, InstallOptions.DeleteExpired, "GoodBoy");
}
}
因为导入方法接收的是证书的base64字符串,所以打开.pfx文件后,要把它转化为base64字符串。
ImportPfxDataAsync方法的第一个参数是证书文件的base64字符串,第二个参数是密码,刚刚在使用pvk2pfx命令时,设置的密码是123456。
ExportOption.Exportable表示私钥可以导出,KeyProtectionLevel.NoConsent表示无需保护私钥,如果使用其他值,在导入时会弹出一个对话框,让用户设置一个密码来保护私钥。
InstallOptions.DeleteExpired表示如果证书过期就删除。
如果要共享用户证书。请打开清单文件,切换到 功能 选项卡,然后勾选“共享用户证书”。XML如下
<Capabilities>
……
<uap:Capability Name="sharedUserCertificates" />
</Capabilities>
如果证书导入到当前用户的证书区储中,可以打开用户证书管理窗口,展开“个人”分支,就会看到导入的证书。
好,今天的F话就讲到这里了,天气相当地热,记得多喝水,少喝点有毒饮料。
【Win 10 应用开发】导入.pfx证书的更多相关文章
- IIS导入.pfx证书时报错:"A specified logon session does not exist. It may already have been terminated."
在IIS中可以直接导入.pfx文件来给站点绑定https协议: 如果在导入.pfx文件时,不选择"Allow this certificate to be exported"的话 ...
- 【Win 10 应用开发】启动远程设备上的应用
这个功能必须在“红石-1”(build 14393)以上的系统版中才能使用,运行在一台设备上的应用,可以通过URI来启动另一台设备上的应用.激活远程应用需要以下前提: 系统必须是build 14393 ...
- 【Win 10应用开发】Adaptive磁贴模板的XML文档结构
在若干天之前,老周给大家讲了Adaptive Toast通知的XML模板,所以相应地,今天老周给大家介绍一下Adaptive磁贴的新XML模板. 同样道理,你依旧可以使用8.1时候的磁贴模板,在win ...
- 【Win 10 应用开发】RTM版的UAP项目解剖
Windows 10 发布后,其实SDK也偷偷地在VS的自定义安装列表中出现了,今天开发人员中心也更新了下载.正式版的SDK在API结构上和以前预览的时候是一样的,只是版本变成10240罢了,所以大家 ...
- 【Win 10应用开发】认识一下UAP项目
Windows 10 SDK预览版需要10030以上版本号的Win 10预览版系统才能使用.之前我安装的9926的系统,然后安装VS 2015 CTP 6,再装Win 10 SDK,但是在新建项目后, ...
- 【Win 10 应用开发】在代码中加载文本资源
记得前一次,老周给大伙,不,小伙伴们介绍了如何填写 .resw 文件,并且在 XAML 中使用 x:Uid 标记来加载.也顺便给大伙儿分析了运行时是如何解析 .resw 文件的. 本来说好了,后续老周 ...
- 【Win 10应用开发】延迟共享
延迟共享是啥呢,这么说吧,就是在应用程序打开共享面板选择共享目标时,不会设置要共享的数据,而是等到共享目标请求数据时,才会发送数据,而且,延迟操作可以在后台进行. 这样说似乎过于抽象,最好的诠释方法, ...
- 【Win 10 应用开发】Toast通知激活应用——前台&后台
老周最近热衷于讲故事,接下来还是讲故事时间. 有人问我:你上大学的时候,有加入过学生会吗?读大学有没有必要加入学生会? 哎哟,这怎么回答呢,从短期来说,加入学生会有点用,至少可以娱乐一下,运气好的话, ...
- 【Win 10 应用开发】InkToolBar——涂鸦如此简单
从WPF开始,就有个InkCanvas控件,封装了数字墨迹处理相关的功能,Silverlight到Win 8 App,再到UWP应用,都有这个控件,所以,老周说了3688遍,凡是.net基础扎实者,必 ...
随机推荐
- C# DateTime日期格式化
在C#中DateTime是一个包含日期.时间的类型,此类型通过ToString()转换为字符串时,可根据传入给Tostring()的参数转换为多种字符串格式. 目录 1. 分类 2. 制式类型 3. ...
- jQuery学习之路(7)- 用原生JavaScript实现jQuery的某些简单功能
▓▓▓▓▓▓ 大致介绍 学习了妙味,用原生的JavaScript实现jQuery中的某些部分功能 定义自己的函数库lQuery ▓▓▓▓▓▓ $()选择器的实现 jQuery是面向对象的,所以自己编写 ...
- Linux 常用命令(持续补充)
常用命令: command &:将进程放在后台执行 ctrl + z:暂停当前进程 并放入后台 jobs:查看当前后台任务 bg( %id):将任务转为后台执行 fg( %id):将任务调回前 ...
- 问题记录:EntityFramework 一对一关系映射
EntityFramework 一对一关系映射有很多种,比如主键作为关联,配置比较简单,示例代码: public class Teacher { public int Id { get; set; } ...
- [原]分享一下我和MongoDB与Redis那些事
缘起:来自于我在近期一个项目上遇到的问题,在Segmentfault上发表了提问 知识背景: 对不是很熟悉MongoDB和Redis的同学做一下介绍. 1.MongoDB数组查询:MongoDB自带L ...
- spring boot 部署为jar
前言 一直在ide中敲代码,使用命令行mvn spring-boot:run或者gradlew bootRun来运行spring boot项目.想来放到prod上面也应该很简单.然而今天试了下,各种问 ...
- The Zen of Python
Beautiful is better than ugly. 优美总比丑陋好Explicit is better than implicit. 直率总比含蓄好Simple is better than ...
- javaScript中的小细节-script标签中的预解析
首先介绍预解析,虽然预解析字面意思很好理解,但是却是出坑出的最多的地方,也是bug经常会有的地方,利用好预解析的特性可以解决很多问题,并且提高代码的质量及数量,浏览器在解析代码前会把变量的声明和函数( ...
- [Django]用户权限学习系列之Permission权限基本操作指令
若需建立py文件进行测试,则在文件开始加入以下代码即可 #coding:utf-8 import os os.environ.setdefault("DJANGO_SETTINGS_MODU ...
- spring boot1
spring boot 玩转spring boot--快速开始 开发环境: IED环境:Eclipse JDK版本:1.8 maven版本:3.3.9 一.创建一个spring boot的mcv ...