2016-10-03 3 views
1

임베디드 장치에서 CSR (Certificate Signing Request)을 생성하려고합니다. 하나의 임베디드 장치에서 일부 OpenSSL 기능을 구현했습니다. 불행히도 나는 몇 가지 기능 만 사용할 수 있습니다. 지금까지 RSA 개인 키를 생성 할 수 있었고 이제는 CSR을 생성해야합니다.CSR 서명은 어떻게 구성됩니까?

내 라이브러리에는 X509_REQ_new(), X509_REQ_get_subject_name() 등의 기능이 없습니다. 따라서 DER 파일을 직접 작성하여 CSR을 구축하고 있습니다.

다음과 같이 DER 형식의 CSR은 디코딩 :

  1. ASN1 순서
  2. 버전
  3. 주제 (들)의 이름 (들) 암호화
  4. 계수 & 지수의
  5. 유형 (내 RSA 키에서)
  6. 속성
  7. Signa 내가 X509_REQ_sign(x509_req, pKey, EVP_sha1())를 사용하는 모든 OpenSSL이 기능을 사용할 수 있던 경우에 진짜야는

(내 문제가 자리하고있는 곳 여기에있다),하지만 난이없는 전에 말했듯 X509의 사용 가능한 객체.

부품을 제작하려면 무엇을 로그인해야합니까?

+0

질문을 분석하는 데 어려움을 겪고 있습니다. 도서관이 무엇을해야합니까? 또는 OpenSSL 질문이 아니라면 OpenSSL 태그가 붙은 이유는 무엇입니까? 귀하의 질문이 문자 그대로 * "그 부분을 만들기 위해 로그인하려면 무엇이 필요합니까?"*, [RFC 5280, Internet X.509 공개 키 기반 구조 인증서 및 인증서]에서 *** "tbsCertificate"***. 인증서 해지 목록 (CRL) 프로필] (https://tools.ietf.org/html/rfc5280). – jww

+0

[RFC 2986, 인증 요청 구문 사양] (https://tools.ietf.org/html/rfc2986) 및 [초안 Gutmann SCEP, 간단한 인증서 등록 프로토콜] (http : //tools.ietf. org/html/draft-gutmann-scep-03). – jww

+0

내 질문에 명확하지 않은 경우 죄송합니다. 일부 OpenSSL 기능을 사용하고 있기 때문에 태그를 추가했습니다. 이 포럼을 처음 사용하기 때문에 필요한 경우 태그를 제거하여 더 나은 환경을 만들 수 있습니다. 이제 CSR 파일을 하나 작성하려고합니다. 그래서 그것을하기 위해 모든 구성 요소 (버전, 제목, 암호화 유형 등)를 추가하고 있습니다. 이 CSR의 마지막 구성 요소는 서명입니다. 하지만 DER 파일에서 마지막 부분을 가질 수 있도록 서명하려면 무엇이 필요한지 모르겠습니다. CSR에 대해 더 잘 이해하기 위해 RFC2986을 점검 할 것입니다. 답변이 매우 유용합니다! –

답변

2

'구현 된'이란 말 자체적으로 코딩했거나 OpenSSL 소스에서 청크를 선택 했습니까? 후자의 경우에는 제한된 장치에서 컴파일되지 않더라도 볼 수있는 전체 소스를 가지고 있다고 가정합니다. 추운 및 서명이 개별 아이템 본문에 SEQUENCE 외부 안쪽 불구 것을

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 

참고

CSR을 (X.509) 인증서 표시 및 CRL과 같은 공통의 최상위 레벨 구조를 사용 최상위 순차.

CSR의 경우 이는 PKCS # 10에서 보다 안정적으로 사용할 수 있습니다. RFC2986; 4 절을 참조하십시오.

특히 "4 - 암호화 유형"은 RSA가 서명으로 사용 되더라도 역사적인 이유로 RSA가 OID rsaEncryption = 1.2.840.113549.1.1.1 인 공개 키 알고리즘에 대한 AlgorithmIdentifier입니다. 암호화와 "5.- Modulus & Exponent"는 실제로 두 개의 INTEGER를 포함하는 SEQUENCE 인 PKCS # 1 공개 키의 DER 인코딩을 포함하는 BIT STRING이며 4와 5는 SEQUENCE로 그룹화되어 SubjectPublicKeyInfo .

섹션 4.2에서 설명했듯이 'body'부분 (certificationRequestInfo)은 DER로 인코딩되며 해당 인코딩은 개인 키에 의해 서명됩니다. PKCS1-v1_5를 사용하는 RSA의 경우 다른 RSA 서명 체계가 정의되어 있지만 . 그 서명 구조는 BIT STRING의 값으로 사용되는 옥텟 스트링 (일반적인 의미에서 ASN.1 타입이 아님)을 생성한다.

사용중인 기본 요소에 따라 PKCS1-v1_5는 메시지 (여기에서는 certificationRequestInfo)를 해시하고 해시에 대한 AlgId와 함께 ASN.1 SEQUENCE에서 해당 해시를 인코딩하고 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! 
$ 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          .& 

이 외부 SEQUENCE 태그 & 길이로 구성, 다음 TBS 나 : 내가 당신이 무엇을하고 있는지 명확하게하는


귀하의 의견은 그래서 여기에 유효한 예는, 너무 모호 0x16E에 최대 0x17D 행합니다 ('외부'추운 일명) 서명을 위해 추운 하였다

$ 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 ] 

이 DER 인코딩 인 본체 0x16E 최대 4에서 (certificationRequestInfo)

다음에 0x182부터 0x282까지의 서명 값을 포함하는 비트 문자열이 뒤 따른다.

$ 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의 서명 이후

우리가 같은 서명을 다시 만들 수 있습니다 결정적이다 : 이것은 TBS의 서명으로 확인 할 수있다, 마지막으로

$ 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.& 

를이 (대부분 같은) RSA 서명 이후 (때로는 오해 '공개 키 암호 해독'이라고 함) '복구'우리는 값 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. 

이 유형-01 패딩 구성 참조 SHA1에 대한 AlgId와 실제 해시를 포함하는 OCTET STRING이 포함 된 ASN.1 SEQUENCE 중 하나입니다.

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

답장을 보내 주셔서 대단히 감사합니다. 예, 저는 직접 함수를 코딩하고 있습니다. "4 - 암호화 유형"에 관해서는이 AlgorithmIdentifier를 생성 한 RSA 키에서 검색 할 수 있습니다. RFC2986을 검토하여 서명해야 할 항목을 파악합니다. 이 시점 이전에 나는 CSR을 구축하는 데 필요한 정보를 가지고있다 (DER에서). 결과를 알려 드리겠습니다. 감사합니다. –

+0

@ Mr.Bogus : 생성 된 내용에 따라 다릅니다.RSA_generate_key [_ex]는 RSA 번호 (n = pq, e, d, dmp1, dmq1, qinv) 만 생성합니다. 'EVP_PKEY_keygen'은 RSA를위한 내부 태그를 추가하지만 이것은 ASN.1 AlgId가 아닙니다. 'i2d_ [RSA_] PUBKEY *'또는'PEM_write * [RSA_] PUBKEY'로 인코딩하거나 RSA 타입의 EVP_PKEY를 포함하는'X509' 또는'X509_REQ'를 인코딩하면 내부 태그를 AlgId, 궁극적으로'crypto/rsa/rsa_ameth.c'의'rsa_pub_encode'에서'OBJ_nid2obj (EVP_PKEY_RSA)'를 사용합니다. 여기서'EVP_PKEY_RSA'는'#define'으로'OID에 대한 NID입니다. ... –

+0

... 또한 분명히하려면이 키는 AlgId _ SPKI_입니다. 서명을위한 AlgId는'sha1WithRSA' 또는 유사해야하며, PKCS1-v1_5 값의 AlgId는 단지'sha1' 또는 유사 할 필요가 있습니다. –

관련 문제