c# - Windows或浏览器是否保存X509证书的签名?
问题描述
Windows 有类X509Certificate2
和X509Certificate
证书数据。但是没有人提供原始签名,只有指纹。他们提供了该字段RawData
,但它只是证书本身,因为我在它上面运行了一个哈希,它与 X509Certificate 提供的哈希匹配。
Windows 有工具可以将每个证书保存到不同格式的文件中,但似乎没有一个包含签名。Firefox 有自己的实用程序来显示证书,它显示签名,但它似乎是一个错误,因为签名与RawData
返回的最后一个字节匹配X509Certificate
,这RawData
是没有签名的原始证书。
我尝试了来自 HTTPS 会话的 CA 证书和服务器证书,但它们都不包含签名。似乎 Windows 验证了签名,将其转换为指纹,然后扔掉了签名。为什么?
解决方案
TL;DR:是的,签名被保存,即使它没有显示。创建信任链需要签名。签名由大量二进制数据组成,因此向用户展示它并不是那么有用。
你很困惑。证书的最后一部分是签名值,正如您在 X.509 规范中看到的那样。
显示的证书上的散列不是用于生成签名的散列。它是对构成证书的所有二进制数据(包括签名)的单独散列,而证书中的散列仅在证书的TBSCertificate
“待签名”部分上。
此外,所有证书的指纹通常是使用一种特定的哈希算法计算的。这使得比较指纹变得容易。用于签名的哈希算法在证书本身中指定 - 统称为signatureAlgorithm
. 虽然它可能是与指纹相同的算法,但它通常是一种更现代的哈希函数,不允许冲突。指纹通常仍然是 SHA-1 或 MD-5,它们的安全性较低,但更容易让人摸索。
推荐阅读
- amazon-web-services - 调用 amazonSQS.deleteMessage(queueURL,receiptHandle) 时抛出 javax.xml.stream.XMLStreamException 异常
- ffmpeg - 录制窗口并通过 HLS 流式传输
- javascript - 消息有时未定义 discord.js v12
- kubernetes - 如何使用替代 kube 配置文件
- python - 使用字典生成的数据框的数据框集单元格问题
- z3 - Z3 SMT Sovler 中的汉明权重方程
- python - 如何解决文本扩展不合适的结果
- url - URL显示服务器的IP
- javascript - 带有javascript的父模型中的Django访问id字段
- performance - 使用 Haskell 查找 LCS 的性能问题