2016-10-03 4 views
1

Ich versuche, eine CSR (Certificate Signing Request) in einem eingebetteten Gerät zu generieren. Ich habe einige OpenSSL-Funktionen in einem eingebetteten Gerät implementiert. Leider habe ich nur ein paar Funktionen zur Verfügung. Bisher konnte ich einen privaten RSA-Schlüssel generieren und jetzt muss ich den CSR generieren.Wie wird die CSR-Signatur erstellt?

Meine Bibliothek hat KEINE der Funktionen wie X509_REQ_new(), X509_REQ_get_subject_name() usw. Daher baue ich die CSR durch Erstellen einer DER-Datei direkt.

Die CSR in DER-Format decodiert wird, wie folgt:

  1. ASN1 Sequenz
  2. Version
  3. Fachgruppe (n) Name (n)
  4. Art der Verschlüsselung
  5. Modulus & Exponent (von meinem RSA Schlüssel)
  6. Attribute
  7. Signa ture (hier ist, wo mein Problem liegt)

Wenn ich alle OpenSSL Funktionen zur Verfügung hätte, würde ich X509_REQ_sign(x509_req, pKey, EVP_sha1()) verwenden, aber wie ich schon sagte, ich habe keine der X509-Objekte zur Verfügung.

Was muss ich unterschreiben, um dieses Teil zu erstellen?

+0

Ich habe eine harte Zeit beim analysiert Ihre Frage habe. Was hat deine Bibliothek mit irgendetwas zu tun? Oder warum ist OpenSSL getaggt, wenn es keine OpenSSL-Frage ist? Wenn Ihre Frage wörtlich ist * "Was muss ich unterschreiben, um diesen Teil zu erstellen?" *, Dann ist es das *** 'tbsCertificate' *** aus dem [RFC 5280, Internet X.509 Public Key Infrastructure-Zertifikat und Zertifikatsperrlisten-Profil (CRL) (https://tools.ietf.org/html/rfc5280). – jww

+0

Sie können sich auch [RFC 2986, Syntaxspezifikation für Zertifizierungsanforderungen] (https://tools.ietf.org/html/rfc2986) und [Entwurf von Gutmann SCEP, Protokoll für die Einschreibung einfacher Zertifikate] (http://tools.ietf. org/html/draft-gutmann-scep-03). – jww

+0

Sorry, wenn meine Frage nicht klar war. Ich verwende einige OpenSSL-Funktionen und deshalb habe ich sie getaggt. Dies ist das erste Mal, dass ich dieses Forum benutze. Wenn nötig, kann ich das Tag entfernen, damit wir eine bessere Umgebung haben. Jetzt versuche ich eine CSR-Datei zu erstellen. Also füge ich alle Komponenten hinzu (Version, Thema, Art der Verschlüsselung usw.), um das zu tun. Die letzte Komponente dieses CSR ist die Signatur. Aber ich weiß nicht, was ich unterschreiben muss, damit ich den letzten Teil in meiner DER-Datei haben kann. Ich überprüfe die RFC2986 heraus, um ein besseres Verständnis über CSR zu haben. Ihre Antworten sind sehr nützlich! –

Antwort

2

Mit "implementiert" meinst du, du hast sie selbst codiert, oder hast du Teile aus der OpenSSL-Quelle ausgewählt? In letzterem Fall gehe ich davon aus, dass Sie die vollständige Quelle zur Verfügung haben, die Sie ansehen können, auch wenn sie nicht auf Ihrem eingeschränkten Gerät kompiliert ist.

CSRs, wie (X.509) Certs und CRLs, eine gemeinsame Top-Level-Struktur verwendet werden:

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 

anzumerken, dass algid und Unterschrift sind separate Einzelteile und außerhalb der Sequenz, die in dem Körper, wenn auch innerhalb der Top-Level-Sequenz.

Für CSR ist dies in PKCS # 10, stabiler verfügbar als RFC2986; siehe Abschnitt 4.

Insbesondere Ich hoffe, Ihre „4.- Art der Verschlüsselung“ ist wirklich ein AlgorithmIdentifier für den Algorithmus des publickey, die aus historischen Gründen für RSA ist die OID rsaEncryption = 1.2.840.113549.1.1.1 obwohl RSA zur Unterzeichnung verwendet wird, wie genau wie Verschlüsselung und "5.- Modul & Exponent" ist wirklich ein BIT STRING, das die DER-Codierung eines öffentlichen PKCS # 1-Schlüssels enthält, der eine SEQUENZ ist, die diese zwei INTEGER enthält, und die 4 und 5 in einer SEQUENCE gruppiert sind, um SubjectPublicKeyInfo zu bilden . Wie in Abschnitt 4.2 beschrieben, ist der body-Teil (certificationRequestInfo) DER-codiert, und diese Codierung wird von Ihrem privaten Schlüssel signiert - für RSA in der Praxis unter Verwendung von PKCS1-v1_5, obwohl andere RSA-Signaturschemata definiert sind . Dieses Signaturschema erzeugt eine Oktettzeichenfolge (im generischen Sinne nicht den ASN.1-Typ), die als Wert in der BIT STRING verwendet wird.

Je nachdem, welche Primitive Sie verwenden, denken Sie daran, dass PKCS1-v1_5 erfordert, dass Sie die Nachricht hashen (hier certificationRequestInfo), diesen Hash in einer ASN.1 SEQUENCE mit einer AlgId für den Hash codieren, diese ASN.1 mit 01 FF ... 00 und modexp (OS2I von) das Ergebnis mit d.In OpenSSL tut alle 4 Schritte, EVP_PKEY_sign* tut die letzten 3, und RSA_private_encrypt macht die letzten 2, d. H. Tut nicht die ASN.1 (und macht optional auch die Auffüllung nicht).


Ihre Kommentare sind zu vage für mich klar zu sein, was Sie tun, ist hier so ein gültiges Beispiel:

$ 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! 
$ 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.&[email protected] 
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          .& 

Diese besteht aus der äußeren Sequence Tag & Länge, dann die TBS oder Körper (CertificationRequestInfo) bei 4 bis 0x16E die dieser dER Codierung ist:

$ dd if=SO39842014.req bs=1 skip=4 count=$((0x16E-4)) 2>dev/null \ 
    | openssl asn1parse -inform d -i 
    0:d=0 hl=4 l= 358 cons: SEQUENCE 
    4:d=1 hl=2 l= 1 prim: INTEGER   :00 
    7:d=1 hl=2 l= 57 cons: SEQUENCE 
    9:d=2 hl=2 l= 20 cons: SET 
    11:d=3 hl=2 l= 18 cons: SEQUENCE 
    13:d=4 hl=2 l= 3 prim:  OBJECT   :commonName 
    18:d=4 hl=2 l= 11 prim:  UTF8STRING  :example.com 
    31:d=2 hl=2 l= 11 cons: SET 
    33:d=3 hl=2 l= 9 cons: SEQUENCE 
    35:d=4 hl=2 l= 3 prim:  OBJECT   :countryName 
    40:d=4 hl=2 l= 2 prim:  PRINTABLESTRING :AU 
    44:d=2 hl=2 l= 20 cons: SET 
    46:d=3 hl=2 l= 18 cons: SEQUENCE 
    48:d=4 hl=2 l= 3 prim:  OBJECT   :organizationName 
    53:d=4 hl=2 l= 11 prim:  UTF8STRING  :Widgits Pty 
    66:d=1 hl=4 l= 290 cons: SEQUENCE 
    70:d=2 hl=2 l= 13 cons: SEQUENCE 
    72:d=3 hl=2 l= 9 prim: OBJECT   :rsaEncryption 
    83:d=3 hl=2 l= 0 prim: NULL 
    85:d=2 hl=4 l= 271 prim: BIT STRING 
    360:d=1 hl=2 l= 0 cons: cont [ 0 ] 

vom algid für die Signatur (auch bekannt als die 'äußere' algid) bei 0x16E gefolgt von bis zu 0x17D:

$ 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 

gefolgt von einem BIT STRING, das den Signaturwert von 0x182 bis 0x282 enthält. Dies kann als die Unterschrift des TBS überprüft werden:

$ 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 

oder seit PKCS1-v1_5 Signatur ist determinis wir die gleiche Signatur neu erstellen können:

$ 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.&[email protected] 
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.& 

Schließlich, da diese (wie die meisten) RSA-Signatur ‚Verwertung‘ erlaubt (manchmal irreführend genannt ‚entschlüsseln mit einem öffentlichen Schlüssel‘) können wir auf den Wert sehen tatsächlich in der modexp-d:

$ openssl rsautl -in SO39842014.sig -verify -inkey SO39842014.pub -pubin -raw |xxd 
0000000: 0001 ffff ffff ffff ffff ffff ffff ffff ................ 
0000010: ffff ffff ffff ffff ffff ffff ffff ffff ................ 
0000020: ffff ffff ffff ffff ffff ffff ffff ffff ................ 
0000030: ffff ffff ffff ffff ffff ffff ffff ffff ................ 
0000040: ffff ffff ffff ffff ffff ffff ffff ffff ................ 
0000050: ffff ffff ffff ffff ffff ffff ffff ffff ................ 
0000060: ffff ffff ffff ffff ffff ffff ffff ffff ................ 
0000070: ffff ffff ffff ffff ffff ffff ffff ffff ................ 
0000080: ffff ffff ffff ffff ffff ffff ffff ffff ................ 
0000090: ffff ffff ffff ffff ffff ffff ffff ffff ................ 
00000a0: ffff ffff ffff ffff ffff ffff ffff ffff ................ 
00000b0: ffff ffff ffff ffff ffff ffff ffff ffff ................ 
00000c0: ffff ffff ffff ffff ffff ffff ffff ffff ................ 
00000d0: ffff ffff ffff ffff ffff ffff 0030 2130 .............0!0 
00000e0: 0906 052b 0e03 021a 0500 0414 e577 fca2 ...+.........w.. 
00000f0: 2372 a03a a4fe a0d1 485d 7f71 1321 37c4 #r.:....H].q.!7. 

und sehen diese besteht aus Typ-01-Polsterung eine ASN.1-Sequenz, die ein algid für SHA1 sowie einen OCTET STRING enthält den eigentlichen Hash enthält:

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

Vielen Dank für Ihre Antwort. Ja, ich kodiere die Funktionen selbst. Wie für "4.-Art der Verschlüsselung" kann diese AlgorithmIdentifier aus dem RSA-Schlüssel abgerufen werden, die ich generiert habe, kann nicht sein? Ich werde die RFC2986 überprüfen, um herauszufinden, was ich unterschreiben muss. Zuvor habe ich alle notwendigen Informationen, um den CSR (in DER) zu erstellen. Ich lasse Sie meine Ergebnisse wissen. Vielen Dank! –

+0

@ Mr.Bogus: hängt davon ab, was Sie mit generiert meinen.'RSA_generate_key [_ex]' erzeugt nur die RSA-Nummern (n = pq, e, d, dmp1, dmq1, qinv). 'EVP_PKEY_keygen' fügt das interne Tag für RSA hinzu, aber dies ist nicht die ASN.1 AlgId. Wenn Sie mit 'i2d_ [RSA_] PUBKEY *' oder 'PEM_write * [RSA_] PUBKEY' codieren oder ein' X509' oder 'X509_REQ' codieren, das ein' EVP_PKEY' vom Typ RSA enthält, konvertieren sie das interne Tag in das AlgId, schließlich 'OBJ_nid2obj (EVP_PKEY_RSA)' in 'rsa_pub_encode' in' crypto/rsa/rsa_ameth.c', wo 'EVP_PKEY_RSA'' 'define''d als' NID_rsaEncryption' definiert ist, was die NID für die OID ist, die ich angegeben habe. ... –

+0

... Auch hier ist klar, das ist die AlgId für den Schlüssel _in SPKI_. Die AlgId für die Signatur muss 'sha1WithRSA' oder ähnlich sein, und die AlgId im PKCS1-v1_5-Wert muss nur' sha1' oder ähnlich sein. –

Verwandte Themen