热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

所有不同X509KeyStorageFlags的基本原理是什么?

如何解决《所有不同X509KeyStorageFlags的基本原理是什么?》经验,为你挑选了1个好方法。

今天,一位同事遇到了另外一个与这些相关的错误!我发现这些标志在过去我自己真的很令人沮丧,因为如果你在实例化X509Certificate2对象或导出它们或将它们保存在X509Store中时会略微出错,你可能会遇到各种各样奇怪的错误,例如:

意外地无法告诉NETSH.exe或ASP.net使用某个SSL证书[通过其指纹],即使您的机器商店中有该证书

您可以意外地导出证书数据,但使用.Export()导出它而不使用私钥

意外地,您的单元测试开始在较新的Windows版本上失败,显然是因为您没有使用正确的标志

是的,它们是有记录的,而且所有文档(以及一些文档似乎都有意义),但为什么它必须这么复杂?



1> bartonjs..:

主要是,它今天必须这么复杂,因为昨天这个很复杂,没有人提出任何更简单的东西.

我不能在这里提出一个线性叙述,所以请忍受来回的编织.

什么是PFX/PKCS#12文件?

虽然我不能完全说出PFX的起源是什么,但是在Windows函数的名称中有一个线索是读取和写入它们:PFXImportCertStore和PFXExportCertStore.它们包含许多可以使用属性标识符相互关联的单独实体(证书,私钥和其他内容).它们看起来像是一个整个证书库的导出/导入机制,就像所有的CurrentUser\My一样.但是由于一种存储是"内存存储"(任意集合),.NET导入/导出是有意义的,但是有些复杂功能(来自.NET之前).

Windows私钥

Windows支持许多不同的私钥位置,但对于传统的加密API,它们归结为一个由4部分组成的寻址方案:

加密提供程序的名称

密钥容器的名称

这是机器相对密钥还是用户相对密钥的标识符

如果这是"签名"密钥或"交换"密钥的标识符.

这简化为CNG的3部分方案:

存储引擎的名称

密钥的名称

这是机器相对密钥还是用户相对密钥的标识符.

为什么需要机器或非标识符?

CAPI和CNG都支持直接与命名密钥交互.因此,您创建了一个名为"EmailDecryption"的密钥.系统上的另一个用户创建一个同名的密钥.那会有用吗?我们可能会.所以,huzzah,确实如此!单独的键,因为它们被保持在与制作它们的用户相关的上下文中.

但现在您需要一个可供多个用户使用的密钥.这不是你通常想要的东西,所以它不是默认的.这是一个选择.该CRYPT_MACHINE_KEYSET标志诞生了.

我会继续说这里,我听说现在不鼓励直接使用命名密钥; CAPI/CNG团队更喜欢GUID命名的密钥,并且您通过证书存储区与它们进行交互.但它是进化的一部分.

导入PFX有什么作用?

PFXImportCertStore将PFX中的所有证书复制到提供的商店中.它还会导入(CryptImportKey或BCryptImportKey,具体取决于它认为需要的内容).然后,对于它导入的每个键,它(通过PFX中的属性值)找到匹配的证书,并在证书存储表示上设置"这是我的4部分标识符"的属性(CNG键仅设置第4个部分到0); 这真的是证书所知道的私钥.

(PFX是一种非常复杂的文件格式,如果没有使用"怪异部分",这种描述都是正确的)

关键生命周期

Windows私钥永远存在,或直到有人删除它们.

因此,当PFX进口时,它们会永远存在.如果您要导入CurrentUser\My,这是有意义的.如果你做一些短暂的事情,那就不那么有意义了.

.NET颠覆关系/使其"太容易"

Windows设计(主要)是您与证书商店进行交互,并从证书商店获得证书..NET后来出现了,并且(基于看到应用程序真正在做什么)的一个假设使证书成为顶级对象,并存储了一些次要的东西.

因为Windows证书(实际上是"存储证书元素")"知道"它们的私钥是什么,所以.NET证书"知道"它们的私钥是什么.

哦,但是MMC证书管理器说它可以使用私钥导出证书(进入PFX),除了"只是证书"格式之外,为什么cert构造函数不能接受这些字节?好的,现在可以.

协调终身

您打开一些字节作为X509Certificate/X509Certificate2.它是一个没有密码的PFX(通过各种方式可以是真的).你看它是错误的,你让证书去垃圾收集器.这个私钥永远存在,所以你的硬盘慢慢填满,密钥存储访问变得越来越慢.然后你生气了,重新格式化你的电脑.

这看起来很糟糕,所以.NET所做的是当一个证书(一个字段)获得垃圾收集(实际上,最终确定)时,它告诉CAPI(或CNG)删除该密钥.现在事情按预期工作了,对吗?好吧,只要程序没有异常终止.

哦,你把它添加到一个持久的商店?但是,在新证书存储实体"知道"如何查找私钥后,我将删除私钥.这看起来很糟糕.

输入 X509KeyStorageFlags.PersistKeySet

PersistKeySet说"不要删除东西".当您打算将证书添加到X509Store时.

如果要在不指定标志的情况下执行相同的操作,请在执行导入后调用Environment.FailFast或拔下计算机电源插头.

关于该机器或用户位

在.NET中,您可以轻松地在一个集合中获得一系列证书并对其进行调用Export.如果有人有机器密钥,而其他人有用户密钥怎么办?PFXExportCertStore来救援.当导出机器密钥时,它会记下一个标识符,表明它是一个机器密钥,因此import会将其放回到同一个地方.

嗯,通常.也许您从一台机器上导出了一个机器密钥,并且您只想在另一台机器上将其作为非管理员进行检查.好的,你可以指定CRYPT_USER_KEYSETaka X509KeyStorageFlags.UserKeySet.

哦,你在一台机器上创建了这个用户,但是想把它作为另一台机器上的机器密钥?精细. CRYPT_MACHINE_KEYSET/ X509KeyStorageFlags.MachineKeySet.

我真的需要"临时"文件吗?

如果你只是检查PFX文件,或者想要临时使用它们,为什么还要把密钥写入磁盘呢?好的,Windows Vista说,我们可以直接将私钥加载到加密密钥对象中,我们会告诉你指针.

PKCS12_NO_PERSIST_KEY/X509KeyStorageFlags.EphemeralKeySet

我想如果Windows在NT4中具有此功能,那么这将是.NET的默认设置.它现在不能是默认值,因为太多的东西依赖于"正常"导入如何检测私钥是否可用的内部结构.

最后两个怎么样?

PFXImportCertStore的默认模式是私钥不应该可以重新导出.要说明它是错的,你可以指定CRYPT_EXPORTABLE/ X509KeyStorageFlags.Exportable.

CAPI和CNG都支持在使用私钥之前软件密钥可能需要同意或密码的机制(如智能卡的PIN提示),但您必须在首次创建(或导入)密钥时声明.所以PFXImportCertStore允许你指定CRYPT_USER_PROTECTED(和.NET公开它X509KeyStorageFlags.UserProtected).

最后两个真正只对"一个私钥"PFXes有意义,因为它们适用于所有键.它们也不包含原始密钥可能具有的全部选项...... CNG和CAPI都支持"可存档"键,这意味着"可导出一次".机器密钥上的自定义ACL也不会在PFX中获得任何支持.

摘要

对于证书(或证书集合),一切都很容易.一旦涉及到私钥,事情就会变得混乱,并且对Windows证书(存储)的抽象会变得有点薄,您需要了解持久性模型和存储模型.


推荐阅读
  • vue使用
    关键词: ... [详细]
  • YOLOv7基于自己的数据集从零构建模型完整训练、推理计算超详细教程
    本文介绍了关于人工智能、神经网络和深度学习的知识点,并提供了YOLOv7基于自己的数据集从零构建模型完整训练、推理计算的详细教程。文章还提到了郑州最低生活保障的话题。对于从事目标检测任务的人来说,YOLO是一个熟悉的模型。文章还提到了yolov4和yolov6的相关内容,以及选择模型的优化思路。 ... [详细]
  • 开发笔记:加密&json&StringIO模块&BytesIO模块
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了加密&json&StringIO模块&BytesIO模块相关的知识,希望对你有一定的参考价值。一、加密加密 ... [详细]
  • Java容器中的compareto方法排序原理解析
    本文从源码解析Java容器中的compareto方法的排序原理,讲解了在使用数组存储数据时的限制以及存储效率的问题。同时提到了Redis的五大数据结构和list、set等知识点,回忆了作者大学时代的Java学习经历。文章以作者做的思维导图作为目录,展示了整个讲解过程。 ... [详细]
  • Windows下配置PHP5.6的方法及注意事项
    本文介绍了在Windows系统下配置PHP5.6的步骤及注意事项,包括下载PHP5.6、解压并配置IIS、添加模块映射、测试等。同时提供了一些常见问题的解决方法,如下载缺失的msvcr110.dll文件等。通过本文的指导,读者可以轻松地在Windows系统下配置PHP5.6,并解决一些常见的配置问题。 ... [详细]
  • 本文介绍了OC学习笔记中的@property和@synthesize,包括属性的定义和合成的使用方法。通过示例代码详细讲解了@property和@synthesize的作用和用法。 ... [详细]
  • 本文介绍了在SpringBoot中集成thymeleaf前端模版的配置步骤,包括在application.properties配置文件中添加thymeleaf的配置信息,引入thymeleaf的jar包,以及创建PageController并添加index方法。 ... [详细]
  • 本文讨论了一个关于cuowu类的问题,作者在使用cuowu类时遇到了错误提示和使用AdjustmentListener的问题。文章提供了16个解决方案,并给出了两个可能导致错误的原因。 ... [详细]
  • 本文介绍了Hyperledger Fabric外部链码构建与运行的相关知识,包括在Hyperledger Fabric 2.0版本之前链码构建和运行的困难性,外部构建模式的实现原理以及外部构建和运行API的使用方法。通过本文的介绍,读者可以了解到如何利用外部构建和运行的方式来实现链码的构建和运行,并且不再受限于特定的语言和部署环境。 ... [详细]
  • 本文详细介绍了Linux中进程控制块PCBtask_struct结构体的结构和作用,包括进程状态、进程号、待处理信号、进程地址空间、调度标志、锁深度、基本时间片、调度策略以及内存管理信息等方面的内容。阅读本文可以更加深入地了解Linux进程管理的原理和机制。 ... [详细]
  • 后台获取视图对应的字符串
    1.帮助类后台获取视图对应的字符串publicclassViewHelper{将View输出为字符串(注:不会执行对应的ac ... [详细]
  • 本文介绍了Web学习历程记录中关于Tomcat的基本概念和配置。首先解释了Web静态Web资源和动态Web资源的概念,以及C/S架构和B/S架构的区别。然后介绍了常见的Web服务器,包括Weblogic、WebSphere和Tomcat。接着详细讲解了Tomcat的虚拟主机、web应用和虚拟路径映射的概念和配置过程。最后简要介绍了http协议的作用。本文内容详实,适合初学者了解Tomcat的基础知识。 ... [详细]
  • C++字符字符串处理及字符集编码方案
    本文介绍了C++中字符字符串处理的问题,并详细解释了字符集编码方案,包括UNICODE、Windows apps采用的UTF-16编码、ASCII、SBCS和DBCS编码方案。同时说明了ANSI C标准和Windows中的字符/字符串数据类型实现。文章还提到了在编译时需要定义UNICODE宏以支持unicode编码,否则将使用windows code page编译。最后,给出了相关的头文件和数据类型定义。 ... [详细]
  • Go Cobra命令行工具入门教程
    本文介绍了Go语言实现的命令行工具Cobra的基本概念、安装方法和入门实践。Cobra被广泛应用于各种项目中,如Kubernetes、Hugo和Github CLI等。通过使用Cobra,我们可以快速创建命令行工具,适用于写测试脚本和各种服务的Admin CLI。文章还通过一个简单的demo演示了Cobra的使用方法。 ... [详细]
  • Webpack5内置处理图片资源的配置方法
    本文介绍了在Webpack5中处理图片资源的配置方法。在Webpack4中,我们需要使用file-loader和url-loader来处理图片资源,但是在Webpack5中,这两个Loader的功能已经被内置到Webpack中,我们只需要简单配置即可实现图片资源的处理。本文还介绍了一些常用的配置方法,如匹配不同类型的图片文件、设置输出路径等。通过本文的学习,读者可以快速掌握Webpack5处理图片资源的方法。 ... [详细]
author-avatar
杯莫停
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有