其实CSP主要是对容器里的密钥对操作的,和证书关系不大。
容器里的密钥对有两种类型:一种是AT_KEYEXCHANGE,表示加密的密钥对,一种是AT_SIGNATURE表示签名的密钥对。
由于美国的出口限制,在MS的CSP中加密的密钥对可以取的密钥最大长度通常会比签名的密钥对短。
通常加密的密钥对只会用于加密,签名的密钥对只会用于签名,由于某些原因(例如产生证书请求),加密的密钥对也可以用于签名。
我把AT_KEYEXCHANGE和AT_SIGNATURE看作是容器里的两个位置。在智能卡CSP中可以把证书写入容器中,和加密的密钥对对应的证书写到AT_KEYEXCHANGE位置中,和签名的密钥对对应的证书写到AT_SIGNATURE位置中。这里判断依据是证书的公钥和密钥对的公钥相同,而不是证书中的密钥用法扩展。
使用Crypto API可以根据证书库里的证书的CERT_KEY_PROV_INFO_PROP_ID找到相对应得容器里的密钥对。CRYPT_KEY_PROV_INFO中的dwKeySpec就是指容器里的密钥对类型。如果在CSP实现的层次根据证书的密钥用法扩展来限制是否能够加密和签名,要先读出证书,这个操作比较慢,估计实现者比较少采用。
 
事实上,明华EKey的CSP的AT_KEYEXCHANGE和AT_SIGNATURE类型的密钥对都是既可以加密也可以签名的(CryptDecrypt和CryptSignHash是没问题的,没怎么测过CryptImportKey,不知道是不是签名的密钥对能不能成功导入会话密钥)。我没有和你的版本一样的xcsp_eclib.dll,我使用了一个稍微旧一点的版本的来测试。我测试了CryptDecryptMessage函数,发现如果是签名密钥对不管我证书的密钥用法扩展如何设置则解密总是会失败(用MS的CSP也一样)。而使用加密密钥对则可以成功。虽然OUTLOOK可能不是使用CryptDecryptMessage来解密CMS的EnvelopedData的,但是我相信最终都会调用CSP的CryptImportKey解出对称密钥,再解密的。CryptDecryptMessage传给CryptImportKey的是一个Simple-Key BLOBs。我的测试发现EKey好像总是使用加密的密钥对来解密。这可能是这个Simple-Key BLOBs的结构有问题导致解密失败或者EKey的CSP的CryptImportKey有BUG导致解密失败。
 
看来,如果要使得证书既能加密也能签名,必须首先保证使用的是加密密钥对。产生加密密钥对可以在产生证书请求的时候使用Xenroll来设置,至于使用PKCS#12文件导入的方式要取决于使用的软件是根据什么来判断应该创建什么类型的密钥对。

Windows密钥容器和证书的关系的更多相关文章

  1. windows2003安装证书服务:csp配置不正确、您没有此密钥容器的写访问权限

    1.填写CA名称后在生成密钥时提示:csp配置不正确或安装不完整.      原因:可能的原因为CS服务(Crysptographic Service)没有启动 . ps:该服务依赖RPC服务,但RP ...

  2. 加密webconfig中的连接字符串,利用RSA非对称加密,利用windows保存密钥容器

    简单的解决方法: WebConfig 加解密,未能使用提供程序“RsaProtectedConfigurationProvider”进行解密.提供程序返回错误消息为: 打不开 RSA 密钥容器.问题: ...

  3. windows p12(pfx)个人证书安装过程

    证书库个人证书存储区为其中的每个证书维护一个属性CERT_KEY_PROV_INFO_PROP_ID,该属性指定了证书对应的密钥容器的相关信息,包括密钥容器名,CSP名称,CSP类型,密钥用途,以及C ...

  4. 初识Docker和Windows Server容器

    概览 伴随着Windows Server 2016 Technical Preview 3 (TP3)版本的发布,微软首次提供了Windows平台下地原生容器.它集成了Docker对Windows S ...

  5. Windows Server 2008标准证书使用记录

    Windows Server 2008标准证书使用记录   近期准备将单位的服务器全部升级到Windows Server 2008,但有一些“遗留”问题需要解决: (1)现在单位还有一台Windows ...

  6. 侯捷STL学习(四)--allocator和容器时间的实现关系

    第十一节 分配器 分配器的好坏影响到容器的性能 operator new()里面调用malloc D:\Program Files (x86)\Microsoft Visual Studio 12.0 ...

  7. 备份Windows密钥,重装后免费激活系统教程

    最重要的一点:在你重装系统之前,一定要先备份Windows密钥,不然重装系统后就查询不了原来的密钥,从而无法免费激活. 1.查询系统密钥(注册表中查询) 打开 “运行”(快捷键 win + R) 打开 ...

  8. 侯捷STL学习(五)--allocator和容器之间的实现关系

    第十一节 分配器 STL源码学习----内存管理 分配器的好坏影响到容器的性能 operator new()里面调用malloc D:\Program Files (x86)\Microsoft Vi ...

  9. Windows 应用容器化

    背景 在这个时间点,我们可能已经对 Linux 容器使用已经达到熟练掌握的程度,因为 Docker 与 Kubernetes 都是最早为 Linux 平台设计.当我们从容器这项技术中体会到种种收益,对 ...

随机推荐

  1. linkedin 第三方网站登录(JavaScript SDK)

    官网:https://developer.linkedin.com/docs/oauth2 一.配置LinkedIn应用程序 a.创建一个应用  |  https://www.linkedin.com ...

  2. 用bisect维护一个排序的序列

    import bisect list1 = [] bisect.insort(list1, 5) bisect.insort(list1, 1) bisect.insort(list1, 3) bis ...

  3. 07-JavaScript之常用内置对象

    JavaScript之常用内置对象 1.数组Array 1.1数组的创建方式 // 直接创建数组 var colors = ['red', 'blue', 'green']; console.log( ...

  4. wince单实例启动

    static class Program { [DllImport("Toolhelp.dll")] public static extern IntPtr CreateToolh ...

  5. js04-DOM对象一

    一.什么是HTML  DOM HTML  Document Object Model(文档对象模型) HTML DOM 定义了访问和操作HTML文档的标准方法 HTML DOM 把 HTML 文档呈现 ...

  6. restfull规范、DRF视图和路由

    一.restfull规范的简单介绍 1.介绍 REST:表述性状态转移,是一种web交互方案 资源:在web中只要有被引用的必要都是资源 URI: URI 统一资源标识符 URL 统一资源定位符 统一 ...

  7. Windows + Ubuntu 16.04 双系统安装详细教程

    Windows + Ubuntu 16.04 双系统安装详细教程 2018年01月28日 16:43:19 flyyufenfei 阅读数:165619   发现了一篇好教程,果断转载了,以后用得着时 ...

  8. edusoho -A5: AppBundle UML

    edusoho -A5:  AppBundle UML

  9. python之路day03--数据类型分析,转换,索引切片,str常用操作方法

    数据类型整体分析 int :用于计算bool:True False 用户判断str:少量数据的存储 list:列表 储存大量数据 上亿数据[1,2,3,'zzy',[aa]] 元组:只读列表(1,23 ...

  10. 全基因组关联分析(GWAS)扫不出信号怎么办(文献解读)

    假如你的GWAS结果出现如下图的时候,怎么办呢?GWAS没有如预期般的扫出完美的显著信号,也就没法继续发挥后续研究的套路了. 最近,nature发表了一篇文献“Common genetic varia ...