【Win 10 应用开发】导入.pfx证书

这个功能其实并不常用,一般开发较少涉及到证书,不过,简单了解一下还是有必要的。

先来说说制作测试证书的方法,这里老周讲两种方法,可以生成用于测试的.pfx文件。

产生证书,大家都知道有个makecert工具。好,我们先用这个工具来生成一个证书,并存放到当前用户的证书存储中。打开VS的开发人员命令提示符,然后输入:

makecert -n "CN=中国好男人" -pe -sr CurrentUser -ss My -b 01/01/2016 -e 12/31/2018

-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 01/01/2016 -e 12/31/2017 -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 1234 -spc test.spc -pfx test.pfx -po 123456

-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话就讲到这里了,天气相当地热,记得多喝水,少喝点有毒饮料。

示例代码下载地址

时间: 2024-08-01 21:29:56

【Win 10 应用开发】导入.pfx证书的相关文章

【Win 10应用开发】如何知道当前APP在哪个平台设备上运行

[Win 10应用开发]如何知道当前APP在哪个平台设备上运行 在做Win10开发的时候,我们可能经常会需要获得当前程序在在哪个平台设备上运行,用于UI和相关API的调用,那么可以通过什么方式知道当前APP运行的平台呢? 今天这里提供两个方法给大家做参考: 方法一:DeviceFamily 通过Windows.System.Profile.AnalyticsInfo.VersionInfo.DeviceFamily,来获取当前的平台设备,目前只可以得到两个值Windows.Mobile或Wind

【Win 10 应用开发】打印UI元素

原文:[Win 10 应用开发]打印UI元素 Windows App支持将UI界面进行打印的功能,这与浏览器中的打印网页的用途相近,其好处就是“所见即所得”,直接把界面上呈现的内容打印下来,比重新创建打印图像方便得多. 要在通用App中实现打印,主要依靠以下几个类型: PrintManager:位于Windows.Graphics.Printing命名空间,主要负责显示打印对话框,设置打印源等操作.在使用时,首先调用GetForCurrentView静态方法得到一个PrintManager实例:

【Win 10应用开发】实现全屏播放的方法

原文:[Win 10应用开发]实现全屏播放的方法 有人会问,以前的MediaElement控件不是有现成的一排操作按钮吗?而且可以直接进入全屏播放.是的,我们知道,以往的Store App都是在全屏模式下运行的,只要MediaElement控件填满整个窗口,就等于全屏播放了,但是,Win10应用是窗口化的,将MediaElement控件的IsFullWindow属性设置为true后,就会这样: 从上面的截图看,MediaElement控件只是覆盖整个窗口而已,并没有实现全屏.那有办法让它全屏播放

【Win 10应用开发】如何知道UAP在哪个平台上运行

原文:[Win 10应用开发]如何知道UAP在哪个平台上运行 面向22世纪的现代化应用程序可以同时在多种设备上运行,于是有朋友会有一个疑问:有时候,我们还真的需要判断一下,UAP应用程序在哪个平台上运行.尽管大多情况下我们不必要这样做,但某些特殊情况还得考虑.比如一串数据列表,我希望如果在桌面上运行时就以横向列表展现:但要是运行在手机上就以纵向列表展现. 也就是说,其实我们只需分析两种情况即可: 一.桌面.(台式机.笔记本.平板.游戏机.发广告专用机.导航器……) 二.移动环境.其实就是手机.

【Win 10 应用开发】RTM版的UAP项目解剖

原文:[Win 10 应用开发]RTM版的UAP项目解剖 Windows 10 发布后,其实SDK也偷偷地在VS的自定义安装列表中出现了,今天开发人员中心也更新了下载.正式版的SDK在API结构上和以前预览的时候是一样的,只是版本变成10240罢了,所以大家不要问老周有什么新的API. API虽然没变,但VS中的应用程序项目是有了新变化.毕竟以前都是预览的,而现在是“正规军”,以前练兵时都用土豆枪,现在都是真刀真枪干了,故而应用程序项目是有变化的. 以前老周跟大家讲的修改项目模板,去掉遥测类库的

【Win 10 应用开发】Toast通知激活应用——前台&amp;后台

原文:[Win 10 应用开发]Toast通知激活应用--前台&后台 老周最近热衷于讲故事,接下来还是讲故事时间. 有人问我:你上大学的时候,有加入过学生会吗?读大学有没有必要加入学生会? 哎哟,这怎么回答呢,从短期来说,加入学生会有点用,至少可以娱乐一下,运气好的话,说不定能遇到红颜知己,但这概率相当低.从长远发展看嘛,是没什么用.老周当年读了四年本科,在学生会混了四年,什么名堂也没混出来. 一方面老周向来不求虚名,所以也没去参选所谓的什么部长.主席之类的,这些“官衔”听起来很高大上,实际上很

【Win 10应用开发】Adaptive磁贴模板的XML文档结构

在若干天之前,老周给大家讲了Adaptive Toast通知的XML模板,所以相应地,今天老周给大家介绍一下Adaptive磁贴的新XML模板. 同样道理,你依旧可以使用8.1时候的磁贴模板,在win 10的API中也是支持的,此外,Win10 App还支持全新的自适应磁贴模板,本文老周就给大家先讲一下基本结构,下一篇文章中咱们再说一说复杂排版. 应用程序的图标可以分为两类:第一类是应用商店上专用的,就是你的应用提交到商店后,给用户看的图标:另一类就是应用本身的一些图标或磁贴. 磁贴其实也就这么

【Win 10 应用开发】启动远程设备上的应用

这个功能必须在“红石-1”(build 14393)以上的系统版中才能使用,运行在一台设备上的应用,可以通过URI来启动另一台设备上的应用.激活远程应用需要以下前提: 系统必须是build 14393或以上版本,UWP应用必须使用14393或以上版本的SDK开发. 被启动的应用应当支持协议激活,比如Cortana的协议URI为:[ms-cortana:],当然如果是你自己开发的应用,可以自己定义一个协议,名字随便取,不要跟系统的协议或别人的应用冲突就行,比如:[haha:][zxzx:]等. 必

PowerShell 运维菜鸟系列-01-批量为n台服务器导入PFX证书(2017年除夕奉献)

作为PowerShell菜鸟,我用PowerShell已有n年了,不怎么使用,但积累不少实用的PowerShell脚本. 将在后续的工作中一一给大家分享. 项目背景: 在测试中使用一个公网证书,每3个月需要更新一次,重新申请.重新颁发.重新导入.重新分配. 但重新导入的时候,如果十台.二十台导入很繁琐,同时也花时间. 本次测试花了我2天时间,从2018年2月14日星期三到2018年2月15日星期四. 本博文写于2018年02月15日 20:00(2018年除夕之夜).边看春节联欢晚会,边写博文.