- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
openssl genrsa -out test1 2048
openssl req -new -key test1 -subj "/CN=foo"-out foo.csr
openssl req -in foo.csr -text
验证该证书
它包含我生成的 key 对的公钥
Public Key Algorithm: rsaEncryption
Public-Key: (2048 bit)
Modulus:
00:ca:c5:29:98:08:05:30:30:03:08:eb:23:c2:af:
3e:2e:2d:dc:11:96:cb:2f:d1:1f:7f:41:a4:00:13:
8a:ee:4b:36:5b:f2:c1:d1:0f:8b:27:11:34:08:bd:
4d:df:7e:6d:7a:d7:f9:dd:ea:62:ad:fa:8f:8c:eb:
47:5f:55:82:2c:13:c2:11:41:12:b9:87:0b:3d:08:
86:1b:ad:71:16:89:1c:fa:07:4a:86:8f:80:a9:99:
37:f7:e2:d4:d3:d8:b2:5f:7f:c9:05:51:73:f0:c8:
59:ec:c3:09:a2:03:a5:6e:ec:8b:d9:9c:11:de:d3:
df:55:a5:3f:0c:36:d6:93:8a:70:a0:b9:61:cd:c9:
4a:09:ad:f7:3e:fd:ce:6f:5c:bb:00:69:e9:3b:3d:
85:3b:01:1d:8f:6a:a7:d4:61:f9:b5:07:1e:90:ed:
ab:3b:41:cc:db:e8:a0:e7:88:b7:77:35:66:30:b7:
a6:cd:ea:d6:12:f5:ef:82:63:e9:46:29:2e:7c:10:
0e:32:fd:04:2d:cd:62:0e:4b:74:46:f7:fd:f6:4a:
8d:fb:82:9d:37:11:50:ea:9f:f0:d6:64:2b:50:a4:
f0:18:6e:81:28:11:04:db:2a:0a:f7:b1:70:c5:78:
fe:ed:e3:55:2c:64:f4:a5:a0:96:f5:11:3a:27:2c:
5a:51
Exponent: 65537 (0x10001)
我在创建 CSR 时提供的主题属性
Subject: CN=foo
数字签名信息
签名算法:sha256WithRSAEncryption92:b0:82:a5:aa:98:4a:62:5a:84:8a:15:5c:6f:48:dc:e3:ec:7f:d5:04:e8:c1:47:55:3c:b3:57:84:16:ff:5a:0d:29:2c:16:f2:cc:0c:18:c3:1f:d5:e1:57:3a:dd:8b:b1:c6:92:c3:fe:cb:2b:9d:7d:79:d5:64:eb:31:00:8b:5e:77:48:ce:66:6f:dd:7b:71:41:f9:aa:6e:ea:ea:59:e0:cd:f8:db:a9:13:18:d2:2a:fc:12:25:b3:01:44:0c:b1:02:f7:1a:0f:d0:07:04:1d:9f:6f:a1:58:91:87:25:4a:d6:47:a6:b5:4e:3c:a1:fd:b6:6c:c3:96:16:c1:ab:00:d2:4c:95:ee:2c:01:2d:cf:0e:d0:62:1b:4f:0e:34:e3:e8:85:50:63:74:eb:1f:ac:95:30:d4:df:43:7f:58:11:90:35:29:9d:85:94:dc:c8:c2:29:81:46:71:20:62:9c:9c:f8:ef:ed:bc:8b:e3:d5:41:b3:14:f7:43:c6:b2:74:c2:22:06:a2:af:88:68:2e:67:c4:de:ed:61:37:41:d6:df:8a:76:7d:42:5d:98:d3:c9:19:8b:1d:26:73:92:95:0f:ba:c1:78:3a:55:87:e0:3e:16:13:34:6e:21:13:b9:da:b8:66:f3:0a:ec:79:ae:1a:95:6c:04:cf:b8:b5
以下是我的疑惑:
最佳答案
用于计算签名的数据几乎是 CSR 中的所有内容,除了签名算法和签名。这在 RFC 2986 中称为 certificationRequestInfo
.
第二个问题:我们如何验证签名?
简短的回答:让 openssl
为您完成。
到目前为止最简单的方法是要求 openssl
本身来验证它:
$ openssl genrsa -out test.key 2048
$ openssl req -new -key test.key -subj "/CN=foo" -out foo.csr
$ openssl req -in foo.csr -verify -noout
verify OK
完成!
冗长(乏味)的答案:手动完成
好的,所以你真的想手动完成。让我们试一试。
鉴于上述情况,我们首先需要从 CSR 中提取所需的信息。转储 ASN.1 结构,我们得到:
$ openssl asn1parse -i -in foo.csr
0:d=0 hl=4 l= 595 cons: SEQUENCE
4:d=1 hl=4 l= 315 cons: SEQUENCE
8:d=2 hl=2 l= 1 prim: INTEGER :00
11:d=2 hl=2 l= 14 cons: SEQUENCE
13:d=3 hl=2 l= 12 cons: SET
15:d=4 hl=2 l= 10 cons: SEQUENCE
17:d=5 hl=2 l= 3 prim: OBJECT :commonName
22:d=5 hl=2 l= 3 prim: UTF8STRING :foo
27:d=2 hl=4 l= 290 cons: SEQUENCE
31:d=3 hl=2 l= 13 cons: SEQUENCE
33:d=4 hl=2 l= 9 prim: OBJECT :rsaEncryption
44:d=4 hl=2 l= 0 prim: NULL
46:d=3 hl=4 l= 271 prim: BIT STRING
321:d=2 hl=2 l= 0 cons: cont [ 0 ]
323:d=1 hl=2 l= 13 cons: SEQUENCE
325:d=2 hl=2 l= 9 prim: OBJECT :sha256WithRSAEncryption
336:d=2 hl=2 l= 0 prim: NULL
338:d=1 hl=4 l= 257 prim: BIT STRING
这是由 RFC 2986 定义的结构化 CertificationRequest。作为:
CertificationRequest ::= SEQUENCE {
certificationRequestInfo CertificationRequestInfo,
signatureAlgorithm AlgorithmIdentifier{{ SignatureAlgorithms }},
signature BIT STRING
}
DER 编码的 ASN.1 格式的 certificationRequestInfo
(请参阅 RFC 了解结构细节)使用 signatureAlgorithm
中描述的算法和私钥进行签名以产生 签名
。
让我们从 CSR 中提取我们需要的所有部分。 strparse
值是您要导出的偏移量,这是上面输出中每行的第一个数字。
# Extract the certificationRequestInfo (data to be signed)
$ openssl asn1parse -in foo.csr -strparse 4 -out info.der
# Extract the public key.
$ openssl req -pubkey -in foo.csr -noout -out pub.pem
# Alternatively, you can use:
$ openssl asn1parse -in foo.csr -strparse 27 -out tmp.der
$ openssl rsa -pubin -inform DER -in tmp.der -out pub.pem
# Extract the raw signature bytes:
$ openssl asn1parse -in foo.csr -strparse 338 -out sig.raw
0:d=0 hl=2 l= 70 cons: cont [ 3 ]
Error in encoding
139935063934272:error:0D07209B:asn1 encoding routines:ASN1_get_object:too long:../crypto/asn1/asn1_lib.c:91:
忽略最后一个错误,这是因为提取的数据是原始签名字节,不是 ASN.1 编码的。 openssl
还是很高兴的写到文件里。
我们现在有以下文件:
info.der
:被签名的DER编码数据pub.pem
:CSR请求者的公钥sig.raw
:CSR中包含的签名让我们使用公钥验证 RSA 签名(因为这是签名算法所说的)并提取原始哈希:
$ openssl rsautl -verify -pubin -inkey pub.pem -in sig.raw -out hash.der
$ openssl asn1parse -i -in hash.der -inform DER
0:d=0 hl=2 l= 49 cons: SEQUENCE
2:d=1 hl=2 l= 13 cons: SEQUENCE
4:d=2 hl=2 l= 9 prim: OBJECT :sha256
15:d=2 hl=2 l= 0 prim: NULL
17:d=1 hl=2 l= 32 prim: OCTET STRING [HEX DUMP]:192E0909DABC7454006628AA3F7FB009AFA62A17A44908CAE5E166E528DCDD11
它没有失败,所以我们已经知道公钥与用于签署数据的私钥相匹配。
最后一部分,长 OCTET STRING
是由 CSR 请求者计算的消息的原始哈希值:
192e0909dabc7454006628aa3f7fb009afa62a17a44908cae5e166e528dcdd11
让我们计算 certificationRequestInfo
的 sha256
哈希(再一次:因为签名算法告诉我们这样做):
$ sha256sum info.der
192e0909dabc7454006628aa3f7fb009afa62a17a44908cae5e166e528dcdd11 info.der
耶!哈希值等于从签名中提取的哈希值。
哈希值匹配且签名由与 CSR 中列出的公钥相对应的私钥签名。 这是一个有效的 CSR。
完成!看,我说过这会很乏味。
关于encryption - 如何手动计算和验证证书签名请求的签名,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63901148/
我得到了这个printHashKey函数,它运行良好。 fun printHashKey() { try { val info : PackageInfo = packageM
如何使用正确的签名 key 为我的 Android 应用包签名? 最佳答案 我尝试在此处和 this question 中使用多个答案, 但不知何故我收到了这个错误,因为我的 android/app/
我的 gradle 文件中有这个: android { signingConfigs { mySigningConfig { keyAlias 'the
请至少选择一个签名版本以在 Android Studio 2.3 中使用 现在在 Android Studio 中生成一个签名的 APK 时,它显示了两个选项(复选框),即 1. V1(Jar 签名)
我想表示一些标量值(例如整数或字符串)通过它的实际值或一些 NA 值,然后存储它们在集合中(例如列表)。目的是处理缺失值。 为此,我实现了一个签名 module type Scalar = sig
为什么这不完全有效? sum :: (Num a, Num b) => a -> b -> c sum a b = a + b 当然,错误消息与签名有关,但我仍然不明白原因。 Couldn't mat
谢谢帮助,我的问题是关于从下面的代码中收到的 ax 值? mov al,22h mov cl,0fdh imul cl 真机结果:ff9a 我的预期:00:9a(通过二进制相乘) 第一个数字是 22h
我有一个注释: import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.
我从对物体的思考中得出了一个术语。当我们扩展一个类时,扩展类将具有与父类相同的签名,因此术语 IS-A 来自...示例 class Foo{ } class Foo2 extends Foo{ } c
我需要在有符号整数和它们作为字节序列的内部表示之间进行转换。在 C 中,我使用的函数如下: unsigned char hibyte(unsigned short i) {return i>>8;}
我正在尝试使用给定的 RSA 参数对一些数据进行签名。 我给出了模数、指数、D、DP、DQ、P、Q 和 InverseQ。什么库或方法最容易使用来计算此签名。在 C# 中,一旦您提供参数,它们就会有一
这些签名之间有什么区别? T * f(T & identifier); T & f(T & identifier); T f(T & identifier); void f(T * identifie
这个问题在这里已经有了答案: 关闭 11 年前。 Possible Duplicate: Where and why do I have to put the “template” and “typ
我有一个签名,我需要在签名旁边添加图片。但我不确定 css 的确切程度和内容。目前它显示在文字下方,我应该把图片放在哪里?在相同的 tr 或 td 中?
查看 LinkedHashMap 的 JDK 源代码,我注意到这个类被声明为: public class LinkedHashMap extends HashMap im
背景:我继承了一个基于 linux 的嵌入式系统,其中包含一个 SMTP 代理和一些我不得不忍受的古怪限制。它位于 SMTP 客户端和服务器之间。当 SMTP 客户端连接时,代理会打开与服务器的连接,
这是 C++17 形式的规则 ([basic.lval]/8),但它在其他标准中看起来很相似(在 C++98 中是“lvalue”而不是“glvalue”): 8 If a program attem
我有一个注释: import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.
我即将开展一个项目,希望使用电子签名板使用 C# 捕获客户的签名、在设备上显示文本等。 现在,在我开始做进一步的研究之前,我想向你们征求一些意见/建议,我应该使用哪些设备.. 我现在的要求非常笼统:我
呢喃自己在心中开始扩张地盘,仿佛制式地广播了三次。 漾起的涟绮,用谈不上精腻的手段。 拒绝天亮,却又贪恋着贪恋多情的日光。 川流不息的画面是他们,而我的落幕停在右脚,它渴望着下台,而我只剩自言
我是一名优秀的程序员,十分优秀!