Openssl CSR签名是如何构造的?

Openssl CSR签名是如何构造的?,openssl,embedded,x509,csr,pkix,Openssl,Embedded,X509,Csr,Pkix,我正在尝试在嵌入式设备中生成CSR证书签名请求。我已经在一个嵌入式设备中实现了一些OpenSSL函数。不幸的是,我只有几个功能可用。到目前为止,我已经能够生成RSA私钥,现在我需要生成CSR 我的库没有任何函数,如X509_REQ_new、X509_REQ_get_subject_name等。因此,我通过直接创建DER文件来构建CSR DER格式的CSR解码如下: ASN1序列 版本 受试者姓名 加密类型 来自我的RSA密钥的模和指数 属性 这里的签名就是我的问题所在 如果我有所有可用的Open

我正在尝试在嵌入式设备中生成CSR证书签名请求。我已经在一个嵌入式设备中实现了一些OpenSSL函数。不幸的是,我只有几个功能可用。到目前为止,我已经能够生成RSA私钥,现在我需要生成CSR

我的库没有任何函数,如X509_REQ_new、X509_REQ_get_subject_name等。因此,我通过直接创建DER文件来构建CSR

DER格式的CSR解码如下:

ASN1序列 版本 受试者姓名 加密类型 来自我的RSA密钥的模和指数 属性 这里的签名就是我的问题所在 如果我有所有可用的OpenSSL函数,我将使用X509_REQ_signx509_REQ、pKey、EVP_sha1,但正如我之前所说,我没有任何可用的X509对象


我需要签署什么才能构建该部分?

所说的“实现”是指您自己编写的代码,还是您从OpenSSL源代码中选择的块?在后一种情况下,我假设您可以查看完整的源代码,即使它不是在您有限的设备上编译的

CSR,如X.509证书和CRL,使用通用的顶级结构:

SEQUENCE
  body (itself a SEQUENCE of various things depending on what this thing is)
  AlgorithmIdentifier = SEQUENCE { OID, NULL } identifying the algorithm
  BIT STRING containing signature in algorithm-dependent format
请注意,AlgId和signature是独立的项,在主体中的序列之外,但在顶层序列之内

对于CSR,这在PKCS10中有规定, 更稳定的可用性; 见第4节

特别是,我希望您的4.-类型的加密确实是公钥算法的算法标识符,对于RSA来说,由于历史原因,它是OID RSANYPTION=1.2.840.113549.1.1.1,即使RSA用于签名和加密,而5.-模和指数实际上是一个位字符串,包含PKCS1公钥,它是一个包含这两个整数的序列,4和5被分组到一个序列中以形成SubjectPublicKeyInfo

如第4.2节所述,“正文”部分certificationRequestInfo是DER编码的,并且该编码由您的私钥签名-对于RSA,实际上使用PKCS1-v1_5,尽管定义了其他RSA签名方案。该签名方案生成一般意义上的八位字符串,而不是用作位字符串中值的ASN.1类型

根据您使用的原语,请记住PKCS1-v1_5要求您在此处散列消息certificationRequestInfo,使用AlgId对ASN.1序列中的散列进行编码,将ASN.1填充为01 FF。。。00,并将结果的modexp OS2I与d一起显示。在OpenSSL中,EVP_DigestSign*执行所有4个步骤,EVP_PKEY_sign*执行最后3个步骤,RSA_private_encrypt[sic]执行最后2个步骤,即不执行ASN.1,也可以选择不执行填充

你的评论太模糊了,我不清楚你在做什么,所以这里有一个有效的例子:

$ openssl req -newkey rsa:2048 -nodes -keyout SO39842014.key \
  -subj '/CN=example.com/C=AU/O=Widgits Pty' -outform d -out SO39842014.req
Generating a 2048 bit RSA private key
.............+++
..+++
writing new private key to 'SO39842014.key'
-----
$ # -nodes to simplify example; real keys should be secured!
NOTE: this example done in 1.0.1 which defaults signing hash SHA1
  unless set in the config file which my system's file didn't;
  1.0.2 up defaults to SHA256 unless config, 
  or you can override it with e.g. -sha256 on req,
  in which case must change the dgst's below to match
  (and the expected recovery value ditto) -- thanks @foxiris
$ openssl rsa -in SO39842014.key -pubout -out SO39842014.pub
writing RSA key
$ 
$ xxd SO39842014.req
0000000: 3082 027e 3082 0166 0201 0030 3931 1430  0..~0..f...091.0
0000010: 1206 0355 0403 0c0b 6578 616d 706c 652e  ...U....example.
0000020: 636f 6d31 0b30 0906 0355 0406 1302 4155  com1.0...U....AU
0000030: 3114 3012 0603 5504 0a0c 0b57 6964 6769  1.0...U....Widgi
0000040: 7473 2050 7479 3082 0122 300d 0609 2a86  ts Pty0.."0...*.
0000050: 4886 f70d 0101 0105 0003 8201 0f00 3082  H.............0.
0000060: 010a 0282 0101 00fa 06d2 819f be88 270e  ..............'.
0000070: 5cc8 8938 aa2d c87c 01e5 bbbd d4c7 e9b6  \..8.-.|........
0000080: 1401 65b3 adf1 52fd 671b 7fa4 6a26 7f36  ..e...R.g...j&.6
0000090: ca1c aec5 877e 2954 1541 0a88 366a 6b52  .....~)T.A..6jkR
00000a0: b3f1 4303 3848 5b05 2b58 e299 c0fd 5a65  ..C.8H[.+X....Ze
00000b0: 4748 4d43 9e5a 26b3 382e 9600 3ce3 4eb6  GHMC.Z&.8...<.N.
00000c0: 09a8 8554 25b4 3ad3 abee 49c8 d15d 27c5  ...T%.:...I..]'.
00000d0: aa9e ff56 f511 a1b6 daaa d484 86ce c0fd  ...V............
00000e0: e4bf 7435 69ed 2806 2adb 9674 a06c 21d9  ..t5i.(.*..t.l!.
00000f0: c64c 0741 88d1 2f4a d2ec b7ec e24c 2cad  .L.A../J.....L,.
0000100: 0dc4 8deb 7fc6 3c9d 3eee a5f6 4aeb 9bd0  ......<.>...J...
0000110: b2b8 0e48 5baf d272 8628 1d79 a05d e632  ...H[..r.(.y.].2
0000120: befa 9f3e eac5 fafb eae1 a0c9 c9a7 3a69  ...>..........:i
0000130: 4ec5 733e 63fc 47d8 bbcc 1c07 1f22 e190  N.s>c.G......"..
0000140: 1ac7 e6d4 f71f 9c4b 1d1b 6cb9 303a b05a  .......K..l.0:.Z
0000150: 4d4f c1e1 8c0e 2b09 5f39 2058 89f7 b2ee  MO....+._9 X....
0000160: 9e2c 6b5d 6b2c 2d02 0301 0001 a000 300d  .,k]k,-.......0.
0000170: 0609 2a86 4886 f70d 0101 0505 0003 8201  ..*.H...........
0000180: 0100 6a7e 8afc d5b1 f55c a824 3516 44f2  ..j~.....\.$5.D.
0000190: ec60 d081 2334 eaae 6d8d 8f79 7e18 bbea  .`..#4..m..y~...
00001a0: c932 bd07 1dc0 67ad 636b b552 619e 9d7f  .2....g.ck.Ra...
00001b0: 5291 3829 0649 e64a 07b6 d659 e181 127e  R.8).I.J...Y...~
00001c0: a56f 3ab9 7dad 9f53 adf9 7c86 3035 ae1c  .o:.}..S..|.05..
00001d0: 9b20 7509 3618 c71e 8f47 98da 4f03 c377  . u.6....G..O..w
00001e0: 52a7 c56e 0a58 265b be81 d263 a9f3 e2c8  R..n.X&[...c....
00001f0: d465 fab6 46a2 269a d649 be08 5857 4a40  .e..F.&..I..XWJ@
0000200: 4cd0 0ddf 17a3 a605 c2a3 a2ae 1c1f c22a  L..............*
0000210: 4aa5 1e1b 6b8a dfd4 708c 55f1 05c5 8309  J...k...p.U.....
0000220: fd62 78d4 e650 367c bf91 2c18 3ccb f6f4  .bx..P6|..,.<...
0000230: c52f 0770 3a44 9558 709f ebba 8878 3fce  ./.p:D.Xp....x?.
0000240: 4588 a7bb d605 8c46 c80c 3b11 8420 c8bd  E......F..;.. ..
0000250: 623c 8205 7d25 1588 017f 2e1b bf09 881f  b<..}%..........
0000260: a56b 5d0f 617a 9914 611d 2336 8335 2f74  .k].az..a.#6.5/t
0000270: 42f9 7188 4b67 7c65 5d83 bc51 52af 124a  B.q.Kg|e]..QR..J
0000280: d426                                     .&
然后是签名的AlgId,即0x16E至0x17D的“外部”AlgId:

$ dd if=SO39842014.req bs=1 skip=$((0x16E)) count=$((0xF)) 2>/dev/null \
  | openssl asn1parse -inform d -i
    0:d=0  hl=2 l=  13 cons: SEQUENCE
    2:d=1  hl=2 l=   9 prim:  OBJECT            :sha1WithRSAEncryption
   13:d=1  hl=2 l=   0 prim:  NULL
后跟包含从0x182到0x282的签名值的位字符串。这可以作为TBS的签名进行验证:

$ dd if=SO39842014.req bs=1 skip=$((0x282)) of=SO39842014.sig 2>/dev/null 
$ dd if=SO39842014.req bs=1 skip=4 count=$((0x16E-4)) 2>/dev/null \
  | openssl dgst -sha1 -verify SO39842014.pub -signature SO39842014.sig
Verified OK
或者,由于PKCS1-v1_5签名是确定性的,我们可以重新创建相同的签名:

$ dd if=SO39842014.req bs=1 skip=4 count=$((0x16E-4)) 2>/dev/null \
 | openssl dgst -sha1 -sign SO39842014.key | xxd
0000000: 6a7e 8afc d5b1 f55c a824 3516 44f2 ec60  j~.....\.$5.D..`
0000010: d081 2334 eaae 6d8d 8f79 7e18 bbea c932  ..#4..m..y~....2
0000020: bd07 1dc0 67ad 636b b552 619e 9d7f 5291  ....g.ck.Ra...R.
0000030: 3829 0649 e64a 07b6 d659 e181 127e a56f  8).I.J...Y...~.o
0000040: 3ab9 7dad 9f53 adf9 7c86 3035 ae1c 9b20  :.}..S..|.05...
0000050: 7509 3618 c71e 8f47 98da 4f03 c377 52a7  u.6....G..O..wR.
0000060: c56e 0a58 265b be81 d263 a9f3 e2c8 d465  .n.X&[...c.....e
0000070: fab6 46a2 269a d649 be08 5857 4a40 4cd0  ..F.&..I..XWJ@L.
0000080: 0ddf 17a3 a605 c2a3 a2ae 1c1f c22a 4aa5  .............*J.
0000090: 1e1b 6b8a dfd4 708c 55f1 05c5 8309 fd62  ..k...p.U......b
00000a0: 78d4 e650 367c bf91 2c18 3ccb f6f4 c52f  x..P6|..,.<..../
00000b0: 0770 3a44 9558 709f ebba 8878 3fce 4588  .p:D.Xp....x?.E.
00000c0: a7bb d605 8c46 c80c 3b11 8420 c8bd 623c  .....F..;.. ..b<
00000d0: 8205 7d25 1588 017f 2e1b bf09 881f a56b  ..}%...........k
00000e0: 5d0f 617a 9914 611d 2336 8335 2f74 42f9  ].az..a.#6.5/tB.
00000f0: 7188 4b67 7c65 5d83 bc51 52af 124a d426  q.Kg|e]..QR..J.&
请看,这包括ASN.1序列的01型填充,该序列包含SHA1的AlgId加上包含实际哈希的八位字节字符串:

$ if=SO39842014.req bs=1 skip=4 count=$((0x16E-4)) 2>/dev/null \
  | openssl dgst -sha1
(stdin)= e577fca22372a03aa4fea0d1485d7f71132137c4

“实现”是指您自己编写的,还是从OpenSSL源代码中选择的块?在后一种情况下,我假设您可以查看完整的源代码,即使它不是在您有限的设备上编译的

CSR,如X.509证书和CRL,使用通用的顶级结构:

SEQUENCE
  body (itself a SEQUENCE of various things depending on what this thing is)
  AlgorithmIdentifier = SEQUENCE { OID, NULL } identifying the algorithm
  BIT STRING containing signature in algorithm-dependent format
请注意,AlgId和signature是独立的项,在主体中的序列之外,但在顶层序列之内

对于CSR,这在PKCS10中有规定, 更稳定的可用性; 见第4节

特别是,我希望您的4.-类型的加密确实是公钥算法的算法标识符,对于RSA来说,由于历史原因,它是OID RSANYPTION=1.2.840.113549.1.1.1,即使RSA用于签名和加密,而5.-模和指数实际上是一个位字符串,包含PKCS1公钥,它是一个包含这两个整数的序列,4和5被分组到一个序列中以形成SubjectPublicKeyInfo

如第4.2节所述,“正文”部分certificationRequestInfo是DER编码的,并且该编码由您的私钥签名-对于RSA,实际上使用PKCS1-v1_5,尽管定义了其他RSA签名方案。该签名方案生成一般意义上的八位字符串,而不是用作位字符串中值的ASN.1类型

根据您使用的原语,请记住PKCS1-v1_5要求您在此处散列消息certificationRequestInfo,使用AlgId对ASN.1序列中的散列进行编码,将ASN.1填充为01 FF。。。00, 结果的modexp OS2I和d。在OpenSSL中,EVP_DigestSign*执行所有4个步骤,EVP_PKEY_sign*执行最后3个步骤,RSA_private_encrypt[sic]执行最后2个步骤,即不执行ASN.1,也可以选择不执行填充

你的评论太模糊了,我不清楚你在做什么,所以这里有一个有效的例子:

$ openssl req -newkey rsa:2048 -nodes -keyout SO39842014.key \
  -subj '/CN=example.com/C=AU/O=Widgits Pty' -outform d -out SO39842014.req
Generating a 2048 bit RSA private key
.............+++
..+++
writing new private key to 'SO39842014.key'
-----
$ # -nodes to simplify example; real keys should be secured!
NOTE: this example done in 1.0.1 which defaults signing hash SHA1
  unless set in the config file which my system's file didn't;
  1.0.2 up defaults to SHA256 unless config, 
  or you can override it with e.g. -sha256 on req,
  in which case must change the dgst's below to match
  (and the expected recovery value ditto) -- thanks @foxiris
$ openssl rsa -in SO39842014.key -pubout -out SO39842014.pub
writing RSA key
$ 
$ xxd SO39842014.req
0000000: 3082 027e 3082 0166 0201 0030 3931 1430  0..~0..f...091.0
0000010: 1206 0355 0403 0c0b 6578 616d 706c 652e  ...U....example.
0000020: 636f 6d31 0b30 0906 0355 0406 1302 4155  com1.0...U....AU
0000030: 3114 3012 0603 5504 0a0c 0b57 6964 6769  1.0...U....Widgi
0000040: 7473 2050 7479 3082 0122 300d 0609 2a86  ts Pty0.."0...*.
0000050: 4886 f70d 0101 0105 0003 8201 0f00 3082  H.............0.
0000060: 010a 0282 0101 00fa 06d2 819f be88 270e  ..............'.
0000070: 5cc8 8938 aa2d c87c 01e5 bbbd d4c7 e9b6  \..8.-.|........
0000080: 1401 65b3 adf1 52fd 671b 7fa4 6a26 7f36  ..e...R.g...j&.6
0000090: ca1c aec5 877e 2954 1541 0a88 366a 6b52  .....~)T.A..6jkR
00000a0: b3f1 4303 3848 5b05 2b58 e299 c0fd 5a65  ..C.8H[.+X....Ze
00000b0: 4748 4d43 9e5a 26b3 382e 9600 3ce3 4eb6  GHMC.Z&.8...<.N.
00000c0: 09a8 8554 25b4 3ad3 abee 49c8 d15d 27c5  ...T%.:...I..]'.
00000d0: aa9e ff56 f511 a1b6 daaa d484 86ce c0fd  ...V............
00000e0: e4bf 7435 69ed 2806 2adb 9674 a06c 21d9  ..t5i.(.*..t.l!.
00000f0: c64c 0741 88d1 2f4a d2ec b7ec e24c 2cad  .L.A../J.....L,.
0000100: 0dc4 8deb 7fc6 3c9d 3eee a5f6 4aeb 9bd0  ......<.>...J...
0000110: b2b8 0e48 5baf d272 8628 1d79 a05d e632  ...H[..r.(.y.].2
0000120: befa 9f3e eac5 fafb eae1 a0c9 c9a7 3a69  ...>..........:i
0000130: 4ec5 733e 63fc 47d8 bbcc 1c07 1f22 e190  N.s>c.G......"..
0000140: 1ac7 e6d4 f71f 9c4b 1d1b 6cb9 303a b05a  .......K..l.0:.Z
0000150: 4d4f c1e1 8c0e 2b09 5f39 2058 89f7 b2ee  MO....+._9 X....
0000160: 9e2c 6b5d 6b2c 2d02 0301 0001 a000 300d  .,k]k,-.......0.
0000170: 0609 2a86 4886 f70d 0101 0505 0003 8201  ..*.H...........
0000180: 0100 6a7e 8afc d5b1 f55c a824 3516 44f2  ..j~.....\.$5.D.
0000190: ec60 d081 2334 eaae 6d8d 8f79 7e18 bbea  .`..#4..m..y~...
00001a0: c932 bd07 1dc0 67ad 636b b552 619e 9d7f  .2....g.ck.Ra...
00001b0: 5291 3829 0649 e64a 07b6 d659 e181 127e  R.8).I.J...Y...~
00001c0: a56f 3ab9 7dad 9f53 adf9 7c86 3035 ae1c  .o:.}..S..|.05..
00001d0: 9b20 7509 3618 c71e 8f47 98da 4f03 c377  . u.6....G..O..w
00001e0: 52a7 c56e 0a58 265b be81 d263 a9f3 e2c8  R..n.X&[...c....
00001f0: d465 fab6 46a2 269a d649 be08 5857 4a40  .e..F.&..I..XWJ@
0000200: 4cd0 0ddf 17a3 a605 c2a3 a2ae 1c1f c22a  L..............*
0000210: 4aa5 1e1b 6b8a dfd4 708c 55f1 05c5 8309  J...k...p.U.....
0000220: fd62 78d4 e650 367c bf91 2c18 3ccb f6f4  .bx..P6|..,.<...
0000230: c52f 0770 3a44 9558 709f ebba 8878 3fce  ./.p:D.Xp....x?.
0000240: 4588 a7bb d605 8c46 c80c 3b11 8420 c8bd  E......F..;.. ..
0000250: 623c 8205 7d25 1588 017f 2e1b bf09 881f  b<..}%..........
0000260: a56b 5d0f 617a 9914 611d 2336 8335 2f74  .k].az..a.#6.5/t
0000270: 42f9 7188 4b67 7c65 5d83 bc51 52af 124a  B.q.Kg|e]..QR..J
0000280: d426                                     .&
然后是签名的AlgId,即0x16E至0x17D的“外部”AlgId:

$ dd if=SO39842014.req bs=1 skip=$((0x16E)) count=$((0xF)) 2>/dev/null \
  | openssl asn1parse -inform d -i
    0:d=0  hl=2 l=  13 cons: SEQUENCE
    2:d=1  hl=2 l=   9 prim:  OBJECT            :sha1WithRSAEncryption
   13:d=1  hl=2 l=   0 prim:  NULL
后跟包含从0x182到0x282的签名值的位字符串。这可以作为TBS的签名进行验证:

$ dd if=SO39842014.req bs=1 skip=$((0x282)) of=SO39842014.sig 2>/dev/null 
$ dd if=SO39842014.req bs=1 skip=4 count=$((0x16E-4)) 2>/dev/null \
  | openssl dgst -sha1 -verify SO39842014.pub -signature SO39842014.sig
Verified OK
或者,由于PKCS1-v1_5签名是确定性的,我们可以重新创建相同的签名:

$ dd if=SO39842014.req bs=1 skip=4 count=$((0x16E-4)) 2>/dev/null \
 | openssl dgst -sha1 -sign SO39842014.key | xxd
0000000: 6a7e 8afc d5b1 f55c a824 3516 44f2 ec60  j~.....\.$5.D..`
0000010: d081 2334 eaae 6d8d 8f79 7e18 bbea c932  ..#4..m..y~....2
0000020: bd07 1dc0 67ad 636b b552 619e 9d7f 5291  ....g.ck.Ra...R.
0000030: 3829 0649 e64a 07b6 d659 e181 127e a56f  8).I.J...Y...~.o
0000040: 3ab9 7dad 9f53 adf9 7c86 3035 ae1c 9b20  :.}..S..|.05...
0000050: 7509 3618 c71e 8f47 98da 4f03 c377 52a7  u.6....G..O..wR.
0000060: c56e 0a58 265b be81 d263 a9f3 e2c8 d465  .n.X&[...c.....e
0000070: fab6 46a2 269a d649 be08 5857 4a40 4cd0  ..F.&..I..XWJ@L.
0000080: 0ddf 17a3 a605 c2a3 a2ae 1c1f c22a 4aa5  .............*J.
0000090: 1e1b 6b8a dfd4 708c 55f1 05c5 8309 fd62  ..k...p.U......b
00000a0: 78d4 e650 367c bf91 2c18 3ccb f6f4 c52f  x..P6|..,.<..../
00000b0: 0770 3a44 9558 709f ebba 8878 3fce 4588  .p:D.Xp....x?.E.
00000c0: a7bb d605 8c46 c80c 3b11 8420 c8bd 623c  .....F..;.. ..b<
00000d0: 8205 7d25 1588 017f 2e1b bf09 881f a56b  ..}%...........k
00000e0: 5d0f 617a 9914 611d 2336 8335 2f74 42f9  ].az..a.#6.5/tB.
00000f0: 7188 4b67 7c65 5d83 bc51 52af 124a d426  q.Kg|e]..QR..J.&
请看,这包括ASN.1序列的01型填充,该序列包含SHA1的AlgId加上包含实际哈希的八位字节字符串:

$ if=SO39842014.req bs=1 skip=4 count=$((0x16E-4)) 2>/dev/null \
  | openssl dgst -sha1
(stdin)= e577fca22372a03aa4fea0d1485d7f71132137c4

我很难分析你的问题。你的图书馆和什么有什么关系?或者,如果不是OpenSSL问题,为什么要将其标记为OpenSSL?如果您的问题是为了构建该部件,我需要签署什么?那么这是来自的TBSCE证书。您也可以查看和。如果我的问题不清楚,请道歉。我正在使用一些OpenSSL函数,这就是为什么我标记了它。这是我第一次使用这个论坛,所以如果有必要,我可以删除标签,这样我们就有了一个更好的环境。现在,我正在尝试构建一个CSR文件。所以我添加了所有的组件版本、主题、加密类型等等。此CSR的最后一个组件是签名。但我不知道我需要签什么才能在DER文件中保留最后一部分。我将查看RFC2986,以便更好地了解CSR。你的答案很有用!我很难分析你的问题。你的图书馆和什么有什么关系?或者,如果不是OpenSSL问题,为什么要将其标记为OpenSSL?如果您的问题是为了构建该部件,我需要签署什么?那么这是来自的TBSCE证书。您也可以查看和。如果我的问题不清楚,请道歉。我正在使用一些OpenSSL函数,这就是为什么我标记了它。这是我第一次使用这个论坛,所以如果有必要,我可以删除标签,这样我们就有了一个更好的环境。现在,我正在尝试构建一个CSR文件。所以我添加了所有的组件版本、主题、加密类型等等。此CSR的最后一个组件是签名。但我不知道我需要签什么才能在DER文件中保留最后一部分。我将查看RFC2986,以便更好地了解CSR。你的答案很有用!非常感谢您的回复。是的,我自己编写函数。至于4-加密类型,这个算法标识符可以从我生成的RSA密钥中检索,不是吗?我将查看RFC2986以确定我需要签署什么。在此之前,我已经掌握了构建企业社会责任的所有必要信息。我会告诉你我的结果。谢谢大家!@博格斯先生:这取决于你所说的“生成”是什么意思。RSA_generate_key[_ex]仅创建RSA编号n=pq、e、d、dmp1、dmq1、qinv。EVP_PKEY_keygen为RSA添加了内部标记,但这不是ASN.1 AlgId。如果您使用i2d_u[RSA_u]PUBKEY*或PEM_write*[RSA_u]PUBKEY进行编码,或对包含RSA类型EVP_PKEY的X509或X509_REQ进行编码,则它们会将内部标记转换为AlgId,最终在RSA中使用OBJ_nid2objEVP_PKEY_RSA在crypto/RSA/RSA ameth.c中进行编码,其中EVP_PKEY_RSA被定义为NID_RSA Encryption,这是我给出的OID的NID。。。。。。同样需要说明的是,这是SPKI中钥匙的AlgId。签名的AlgId需要是sha1WithRSA或类似的,PKCS1-v1_5值中的AlgId需要是sha1或类似的。好的,又是我。所以我查阅了文件,做了一些实验,但是我还没有生成一个有效的CSR。到目前为止,我有一个DER格式的缓冲区,包含除签名以外的所有信息。我的意思是,我有所有的ASN1序列,但我没有它的最后一部分,即签名。我尝试对缓冲区的不同部分(如版本、主题等)进行签名,然后将签名256字节放在DER缓冲区的底部,然后从base64解码,然后添加页眉/页脚(BEGIN CERTTI…),然后尝试验证CSR。有什么建议吗?该链接不是永久性的,请访问“1.0.2h和1.1.0之间的变化[2016年8月25日]”。当您创建SO39842014.req时,它是SHA1带RSA加密,但新版本的OpenSSL是SHA256带RSA加密,非常感谢您的回复。是的,我自己编写函数。至于4-加密类型,这个算法标识符可以从我生成的RSA密钥中检索,不是吗?我将查看RFC2986以确定我需要签署什么。在此之前,我已经掌握了构建企业社会责任的所有必要信息。我会告诉你我的结果。谢谢大家!@博格斯先生:这取决于你所说的“生成”是什么意思。RSA_generate_key[_ex]只创建RSA数字
n=pq、e、d、dmp1、dmq1、qinv。EVP_PKEY_keygen为RSA添加了内部标记,但这不是ASN.1 AlgId。如果您使用i2d_u[RSA_u]PUBKEY*或PEM_write*[RSA_u]PUBKEY进行编码,或对包含RSA类型EVP_PKEY的X509或X509_REQ进行编码,则它们会将内部标记转换为AlgId,最终在RSA中使用OBJ_nid2objEVP_PKEY_RSA在crypto/RSA/RSA ameth.c中进行编码,其中EVP_PKEY_RSA被定义为NID_RSA Encryption,这是我给出的OID的NID。。。。。。同样需要说明的是,这是SPKI中钥匙的AlgId。签名的AlgId需要是sha1WithRSA或类似的,PKCS1-v1_5值中的AlgId需要是sha1或类似的。好的,又是我。所以我查阅了文件,做了一些实验,但是我还没有生成一个有效的CSR。到目前为止,我有一个DER格式的缓冲区,包含除签名以外的所有信息。我的意思是,我有所有的ASN1序列,但我没有它的最后一部分,即签名。我尝试对缓冲区的不同部分(如版本、主题等)进行签名,然后将签名256字节放在DER缓冲区的底部,然后从base64解码,然后添加页眉/页脚(BEGIN CERTTI…),然后尝试验证CSR。有什么建议吗?该链接不是永久性的,请访问“1.0.2h和1.1.0之间的变化[2016年8月25日]”。当您创建SO39842014.req时,它是SHA1带RSA加密,但新版本的OpenSSL是SHA256带RSA加密