其实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. 《PyQt5快速开发与实战了》正式发售 !!!

    <PyQt5快速开发与实战>正式出售了,该书是国内第一本介绍PyQt5的书籍.是两位一线工程师耗费一年的心血.本书github网址:https://github.com/cxinping/ ...

  2. FM算法解析及Python实现

    1. 什么是FM? FM即Factor Machine,因子分解机. 2. 为什么需要FM? 1.特征组合是许多机器学习建模过程中遇到的问题,如果对特征直接建模,很有可能会忽略掉特征与特征之间的关联信 ...

  3. @Valid注解的使用(转)

    原文地址:http://blog.csdn.net/xzmeasy/article/details/76098188 @Valid注解用于校验,所属包为:javax.validation.Valid. ...

  4. Android——分割线中夹文字

    内容不多,只是感觉平时很容易遇上,那就做个笔记吧! 其实很简单,如下: <RelativeLayout android:layout_width="match_parent" ...

  5. 【nowcoder-2017校招真题】保留最大的数

    牛客在线编程-保留最大的数 题目描述 给定一个十进制的正整数number,选择从里面去掉一部分数字,希望保留下来的数字组成的正整数最大. 输入描述: 输入为两行内容,第一行是正整数number,1 ≤ ...

  6. Java【初识篇】语言概述

    什么是计算机语言 语言:是人与人之间用于沟通的一种方式.例如:中国人与中国人用普通话沟通.而中国人要和英国人交流,就要学习英语.计算机语言(编程语言):人与计算机交流的方式.如果人要与计算机交流,那么 ...

  7. LoadRunner【第三篇】录制脚本实践:订票网站

    启动服务 安装好loadrunner,我们就可以实践了. loadrunner自带订票网站,可以方便我们练习, 先把下面两个发送到桌面快捷方式 首先,启动服务,点击下面图标(如果服务无法启动,检查端口 ...

  8. Django练习——图书管理系统

    Django图书管理系统 创建一个项目 1. django-admin startproject 图书管理 2. cmd 命令终端下创建一个app python manage.py startapp ...

  9. BZOJ 3674 可持久化并查集

    https://www.lydsy.com/JudgeOnline/problem.php?id=3674 用可持久化数组维护并查集的fa数组, 查询时间复杂度为nlognlogn,一个log是并查集 ...

  10. 查看open office运行状态

    打开SSH工具: 1.ps -ef|grep soffice 2.cd /opt/jboss-eap-7.0 3.cd logs 4.tail -f subscription.log 然后就可以操作( ...