.NET Framework x509Certificate2 类,HasPrivateKey == true && PrivateKey == null?

2023-11-26

我正在尝试使用最初使用 MMC 的“证书”管理单元导入到 Windows 10 计算机上的 CurrentUser 密钥库中的 X509 证书。相同的过程已在 Windows 8.1 计算机上进行了测试,得到了相同的结果。

使用标准 PowerShell PKI 模块,我使用 Get-Item 获取 X509Certificate2 对象:

$my_cert = Get-Item Cert:\CurrentUser\My\ADAA82188A17THUMBPRINTXXXXXXXXXXX

的输出$my_cert | fl *如下:

PSPath                   : Microsoft.PowerShell.Security\Certificate::CurrentUser\My\XXXXXXXXXXXXXXXXXXX
PSParentPath             : Microsoft.PowerShell.Security\Certificate::CurrentUser\My
PSChildName              : XXXXXXXXXXXXXXXXXXX
PSDrive                  : Cert
PSProvider               : Microsoft.PowerShell.Security\Certificate
PSIsContainer            : False
EnhancedKeyUsageList     : {Secure Email (1.3.6.1.5.5.7.3.4), IP security user (1.3.6.1.5.5.7.3.7), Encrypting File
                           System (1.3.6.1.4.1.311.10.3.4), Document Signing (1.3.6.1.4.1.311.10.3.12)...}
DnsNameList              : {My Name}
SendAsTrustedIssuer      : False
EnrollmentPolicyEndPoint : Microsoft.CertificateServices.Commands.EnrollmentEndPointProperty
EnrollmentServerEndPoint : Microsoft.CertificateServices.Commands.EnrollmentEndPointProperty
PolicyId                 : {D52C406F-C279-4BF2-B7C2-EE704290DB3E}
Archived                 : False
Extensions               : {System.Security.Cryptography.Oid, System.Security.Cryptography.Oid,
                           System.Security.Cryptography.Oid, System.Security.Cryptography.Oid...}
FriendlyName             :
IssuerName               : System.Security.Cryptography.X509Certificates.X500DistinguishedName
NotAfter                 : 4/15/2017 2:15:16 PM
NotBefore                : 4/15/2016 2:15:16 PM
HasPrivateKey            : True
PrivateKey               :
PublicKey                : System.Security.Cryptography.X509Certificates.PublicKey
RawData                  : {56, 130, 19, 252...}
SerialNumber             : 4F0000002F700000000000000000000000
SubjectName              : System.Security.Cryptography.X509Certificates.X500DistinguishedName
SignatureAlgorithm       : System.Security.Cryptography.Oid
Thumbprint               : XXXXXXXXXXXXXXXXXXX
Version                  : 3
Handle                   : 2241663016272
Issuer                   : CN=Issuing CA, DC=My, DC=Domain, DC=us
Subject                  : [email protected], CN=My Name

所以 HasPrivateKey == True,但 PrivateKey == null。我一直在试图找出如何访问私钥来执行加密和解密。我在网上看到的示例似乎都表明 X509Certificate2 类的 PrivateKey 属性应该随时可用,但显然我错过了一些东西。

我在这里读过类似的问题,例如x509certificate2 中的私钥为空,但似乎没有一个能解决我的问题。我也读过在 .NET 中使用 X.509 证书的八个技巧Paul Stovell 写的,很有启发性,但最终没有帮助。它确实帮助我验证私钥是否存在于正确的位置,并且据我所知,具有由 x509Certificate2 类引用的正确权限:

C:\Users\My.Name\AppData\Roaming\Microsoft\SystemCertificates\My\Keys

密钥文件的名称与证书上的主题密钥标识符匹配。

Edit:

的输出certutil -user -store my "Serial Number" is:

Serial Number: 4f000000xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
Issuer: CN=Issuing CA, DC=My, DC=Domain, DC=us
 NotBefore: 4/15/2016 2:15 PM
 NotAfter: 4/15/2017 2:15 PM
Subject: [email protected], CN=My Name
Non-root Certificate
Template: Userv1, User v1
Cert Hash(sha1): ad ab 82 18 8a 17 4d 75 11 04 48 7c 43 43 d4 05 b9 74 c8 4c
  Key Container = te-Userv1-xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx
  Unique container name: fcbba1aa0xxxxxxxxxxxxxxxxxxxxxxx_xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx
  Provider = Microsoft Software Key Storage Provider
Encryption test passed
CertUtil: -store command completed successfully.

我在这里缺少什么“关键”信息?为什么不能从 X509Certificate2 对象方便地引用私钥?我如何访问它?


您的 certutil 信息显示Provider = Microsoft Software Key Storage Provider这意味着私钥存储在 Windows CNG 下,而不是 Windows CryptoAPI (CAPI) 下。

.NET 4.6 添加了 GetRSAPrivateKey(扩展)方法,以促进让 PrivateKey 属性返回非 RSACryptoServiceProvider(或 DSACryptoServiceProvider)的内容的重大更改。如果您有权访问该方法(我不确定 PowerShell 使用哪个版本的框架),那么它将解决您的问题。

不过,有两件事需要注意:

  1. GetRSAPrivateKey 每次都会返回一个唯一的 Disposable 对象。您应该将其放在 using 语句中/在完成后手动调用 Dispose(与 cert.PrivateKey 相反,它不是唯一的,因此不应被 Dispose)。
  2. 签名/验证//加密/解密方法已移至 RSA 基类(尽管签名略有不同,更具前瞻性)。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

.NET Framework x509Certificate2 类,HasPrivateKey == true && PrivateKey == null? 的相关文章

随机推荐

  • Chrome 扩展:webRequest.onBeforeSendHeaders 行为奇怪

    我正在尝试向 Chrome 扩展程序中的某些 AJAX 请求添加 Referer HTTP 标头 您无法直接在 AJAX 请求中更改它 因此我尝试使用网络请求 API chrome webRequest onBeforeSendHeader
  • Laravel Mail::send() 发送到多个收件人或密件抄送地址

    我似乎无法成功发送至multiple使用 Laravel 时的地址Mail send 回调 但是当我只指定时 代码确实有效one接受者 我尝试过链接 for example emails array email protected emai
  • 无法在已停止的 SparkContext 上调用方法

    当我运行以下测试时 它会抛出 无法在已停止的 SparkContext 上调用方法 可能的问题是我使用TestSuiteBase和流 Spark 上下文 在行val gridEvalsRDD ssc sparkContext paralle
  • 使用 linq 删除列表中的重复项

    我有课Items with properties Id Name Code Price 名单Items填充有重复的项目 例如 1 Item1 IT00001 100 2 Item2 IT00002 200 3 Item3 IT00003 1
  • 使用数据注释的有条件必需的属性

    我有一堂这样的课 public class Document public int DocumentType get set Required public string Name get set Required public strin
  • JAVA使用google语音识别API

    我正在尝试使用谷歌语音识别 API 这是我写的代码 http pastebin com zJEhnJ74 有用 我从服务器得到答案 status 5 id 8803471b14a2310dfcf917754e8bd4a7 1 hypothe
  • MySQL - 唯一外键

    我必须使其中一个外键唯一 问题是 我从 phpMyAdmin 收到以下消息 The following indexes appear to be equal and one of them should be removed consign
  • 查询 DNS 服务记录以查找主机名和 TCP/IP

    在一篇关于生命科学标识符 see LSID Tester 用于测试生命科学标识符解析服务的工具 罗德里克 DM 佩奇博士写道 给定 LSID urn lsid ubio org namebank 11815 在 DNS 中查询 SRV 记录
  • 从已使用的命名空间中排除类

    我所有 C 文件的第一条语句是 使用系统 现在 在框架版本 4 中 该命名空间包含一个名为 Action 的类 这也是我自己的代码中经常使用的命名空间中的类的名称 现在当然有冲突 当然 我可以通过在我之前使用 Action 的地方使用显式的
  • C++ 中的构造函数和对象数组

    我正在尝试用 C 创建一个应用程序 在应用程序中 我有默认构造函数和另一个带有 3 个参数的构造函数 用户从键盘提供一个整数 该整数将用于使用非默认构造函数创建对象数组 不幸的是 到目前为止我还无法完成它 因为我在创建对象数组时遇到问题 它
  • Rails:Turbo Stream Broadcast 不更新视图

    我有一个 Turbo Stream 它没有更新视图 我不知道为什么 我在类似的配置中设置了另外两个广播 运行良好 从我所看到的来看 一切看起来都应该正常工作 我只是没有在前端获得更新 我错过了一些明显的事情吗 partial div div
  • 打开文件时出现“无效参数”错误(并且不读取文件)

    我正在尝试编写代码 在文本文件中获取 2 个数字 然后将它们分开 将答案显示为最重的分数 当我在程序中输入自己的值时 我已经让分数部分开始工作 但我无法让程序识别文本文件 我尝试将它们放在同一目录中并放置文件的完整系统路径 但到目前为止没有
  • 使用供应商目录中的 autoloader.php 自动加载无法正常工作

    我在自动加载 Composer 时遇到问题 因为自动加载器无法解析 Doctrine ORM Mapping Table 对于单元测试 我创建了带有典型注释的学说实体类
  • Akka 中 Actorref.tell 和 inbox.send 的区别

    所以我开始学习 Akka 并尝试 typesafe 中的示例 所以 Hello Akka 应用程序有以下代码 import akka actor ActorRef ActorSystem Props Actor Inbox import s
  • 如何计算两个日期之间的周数?

    如何计算两个日期之间的周数 例如如下 Declare StartDate as DateTime 01 Jan 2009 Declare EndDate as DateTime 01 June 2009 StartDate and EndD
  • 我可以在 LESS css 字符串插值中进行数学运算吗?

    我的这个少了 我不知道如何在字符串内进行数学运算 bp tablet landscape 1024px bp tablet portrait 768px tablet landscape only only screen and min w
  • 如何在 grails 中断开对象与其休眠会话的连接?

    我正在尝试执行此操作 但出现错误 具有相同标识符值的不同对象已与会话关联 看来我需要从休眠会话中删除 dbObject def object messageParserService parseMessage messageType mes
  • 使用 XML1.1 解析 unicode 字符 (0x2)

    在我的 Java 应用程序中 我需要解析包含控制字符的 XML 文档0x2在 CDATA 内 我尝试了几种方法但无法通过 我想避免任何类型的编码 XML1 1有什么办法吗 我需要解析 CDATA 中包含控制字符 0x2 的 xml 那么那不
  • 我的网站 IE 总是崩溃,无法调试

    我的网站突然开始使 Internet Explorer 崩溃 网站加载并开始执行 javascript 但机器在某个地方爆炸了 我什至没有收到脚本错误 它只是崩溃了 我尝试使用内置调试器手动单步执行每一行 js 但问题当然不会发生 如果我选
  • .NET Framework x509Certificate2 类,HasPrivateKey == true && PrivateKey == null?

    我正在尝试使用最初使用 MMC 的 证书 管理单元导入到 Windows 10 计算机上的 CurrentUser 密钥库中的 X509 证书 相同的过程已在 Windows 8 1 计算机上进行了测试 得到了相同的结果 使用标准 Powe