PKI를 배우려고 하는데 해시를 비교하여 디지털 인증서에 대한 이해를 확인하는 테스트를 하고 싶습니다... 설명하겠습니다.
제가 이해한 바에 따르면, 서버에 대해 공개 서명된 디지털 인증서가 있는 경우 해당 서버 인증서에는 CA에서 생성한 디지털 서명이 포함됩니다. 예를 들어, https를 통해 해당 서버를 탐색하면 내 컴퓨터는 신뢰 체인을 확인하여 인증서를 확인합니다. 따라서 디지털 인증서를 가져와서 이를 해독하고(CA의 공개 키를 사용하여) 해시 값을 표시합니다. 이 값을 서명된 데이터의 해시와 비교하여 일치하면 신뢰할 수 있는 소스에서 인증서에 서명한 것입니다.
이제 제가 시도하고 시뮬레이션하고 싶은 것은 openssl을 사용하여 내 컴퓨터에서 생성한 디지털 서명을 수동으로 확인하는 것입니다. 그래서 나는 다음을 수행했습니다.
## Create a key pair
$ openssl genrsa -aes128 -passout pass:Test123 -out private.pem 4096
$ openssl rsa -in private.pem -passin pass:Test123 -pubout -out public.pem
## Create a file as something to sign
$ touch filex
$ echo "some data" > filex
## Sign the file
$ openssl dgst -sha256 -sign private.pem -out data.txt.signature filex
## Verify the signature
$ openssl dgst -sha256 -verify public.pem -signature data.txt.signature filex
Verified OK
따라서 이것은 내가 원하는 것을 확인합니다(여기에는 CA가 없지만). 내가 원하는 것은 디지털 서명을 해독할 때 계산하는 실제 해시를 확인하여 "filex"에서 sha256sum을 실행하고 둘을 비교할 수 있는 것입니다. 그러나 나는 이것을 할 방법을 찾지 못하는 것 같습니다. 누구든지 내가 이것을 달성할 수 있는 방법을 찾도록 도와줄 수 있습니까?
업데이트: 누군가 이전에 비슷한 질문에 대한 링크를 게시했기 때문에 이 방법을 시도했지만 제대로 작동하지 못했습니다. 따라서 아래에서 수행한 단계를 복사하겠습니다.
먼저 브라우저에서 stackexchange.pem 및 CA의 E1.pem 파일을 가져와 다운로드했습니다.
$ openssl asn1parse -i -in stackexchange.pem
0:d=0 hl=4 l= 947 cons: SEQUENCE
4:d=1 hl=4 l= 824 cons: SEQUENCE
8:d=2 hl=2 l= 3 cons: cont [ 0 ]
10:d=3 hl=2 l= 1 prim: INTEGER :02
13:d=2 hl=2 l= 18 prim: INTEGER :035FE125AEA1239BD263714150F2D8EE3C0F
33:d=2 hl=2 l= 10 cons: SEQUENCE
35:d=3 hl=2 l= 8 prim: OBJECT :ecdsa-with-SHA384
45:d=2 hl=2 l= 50 cons: SEQUENCE
47:d=3 hl=2 l= 11 cons: SET
49:d=4 hl=2 l= 9 cons: SEQUENCE
51:d=5 hl=2 l= 3 prim: OBJECT :countryName
56:d=5 hl=2 l= 2 prim: PRINTABLESTRING :US
60:d=3 hl=2 l= 22 cons: SET
62:d=4 hl=2 l= 20 cons: SEQUENCE
64:d=5 hl=2 l= 3 prim: OBJECT :organizationName
69:d=5 hl=2 l= 13 prim: PRINTABLESTRING :Let's Encrypt
84:d=3 hl=2 l= 11 cons: SET
86:d=4 hl=2 l= 9 cons: SEQUENCE
88:d=5 hl=2 l= 3 prim: OBJECT :commonName
93:d=5 hl=2 l= 2 prim: PRINTABLESTRING :E1
97:d=2 hl=2 l= 30 cons: SEQUENCE
99:d=3 hl=2 l= 13 prim: UTCTIME :231117014719Z
114:d=3 hl=2 l= 13 prim: UTCTIME :240215014718Z
129:d=2 hl=2 l= 28 cons: SEQUENCE
131:d=3 hl=2 l= 26 cons: SET
133:d=4 hl=2 l= 24 cons: SEQUENCE
135:d=5 hl=2 l= 3 prim: OBJECT :commonName
140:d=5 hl=2 l= 17 prim: PRINTABLESTRING :stackexchange.com
159:d=2 hl=2 l= 89 cons: SEQUENCE
161:d=3 hl=2 l= 19 cons: SEQUENCE
163:d=4 hl=2 l= 7 prim: OBJECT :id-ecPublicKey
172:d=4 hl=2 l= 8 prim: OBJECT :prime256v1
182:d=3 hl=2 l= 66 prim: BIT STRING
250:d=2 hl=4 l= 578 cons: cont [ 3 ]
254:d=3 hl=4 l= 574 cons: SEQUENCE
258:d=4 hl=2 l= 14 cons: SEQUENCE
260:d=5 hl=2 l= 3 prim: OBJECT :X509v3 Key Usage
265:d=5 hl=2 l= 1 prim: BOOLEAN :255
268:d=5 hl=2 l= 4 prim: OCTET STRING [HEX DUMP]:03020780
274:d=4 hl=2 l= 29 cons: SEQUENCE
276:d=5 hl=2 l= 3 prim: OBJECT :X509v3 Extended Key Usage
281:d=5 hl=2 l= 22 prim: OCTET STRING [HEX DUMP]:301406082B0601050507030106082B06010505070302
305:d=4 hl=2 l= 12 cons: SEQUENCE
307:d=5 hl=2 l= 3 prim: OBJECT :X509v3 Basic Constraints
312:d=5 hl=2 l= 1 prim: BOOLEAN :255
315:d=5 hl=2 l= 2 prim: OCTET STRING [HEX DUMP]:3000
319:d=4 hl=2 l= 29 cons: SEQUENCE
321:d=5 hl=2 l= 3 prim: OBJECT :X509v3 Subject Key Identifier
326:d=5 hl=2 l= 22 prim: OCTET STRING [HEX DUMP]:0414ABB9D50E8357BF0921BC299E1B83B6ED2A1BB326
350:d=4 hl=2 l= 31 cons: SEQUENCE
352:d=5 hl=2 l= 3 prim: OBJECT :X509v3 Authority Key Identifier
357:d=5 hl=2 l= 24 prim: OCTET STRING [HEX DUMP]:301680145AF3ED2BFC36C23779B95230EA546FCF55CB2EAC
383:d=4 hl=2 l= 85 cons: SEQUENCE
385:d=5 hl=2 l= 8 prim: OBJECT :Authority Information Access
395:d=5 hl=2 l= 73 prim: OCTET STRING [HEX DUMP]:3047302106082B060105050730018615687474703A2F2F65312E6F2E6C656E63722E6F7267302206082B060105050730028616687474703A2F2F65312E692E6C656E63722E6F72672F
470:d=4 hl=2 l= 75 cons: SEQUENCE
472:d=5 hl=2 l= 3 prim: OBJECT :X509v3 Subject Alternative Name
477:d=5 hl=2 l= 68 prim: OCTET STRING [HEX DUMP]:304282182A2E6D6574612E737461636B65786368616E67652E636F6D82132A2E737461636B65786368616E67652E636F6D8211737461636B65786368616E67652E636F6D
547:d=4 hl=2 l= 19 cons: SEQUENCE
549:d=5 hl=2 l= 3 prim: OBJECT :X509v3 Certificate Policies
554:d=5 hl=2 l= 12 prim: OCTET STRING [HEX DUMP]:300A3008060667810C010201
568:d=4 hl=4 l= 260 cons: SEQUENCE
572:d=5 hl=2 l= 10 prim: OBJECT :CT Precertificate SCTs
584:d=5 hl=3 l= 245 prim: OCTET STRING [HEX DUMP]:0481F200F000770048B0E36BDAA647340FE56A02FA9D30EB1C5201CB56DD2C81D9BBBFAB39D884730000018BDB2CF9BB0000040300483046022100D3057AB69D47FA324E26A59D5210029843F17CA8034FD70045A2F6514098434B022100A693797A5A0EE660AC1C4D904079FC367F921826980340F6ED9C5D580C63CFC7007500EECDD064D5DB1ACEC55CB79DB4CD13A23287467CBCECDEC351485946711FB59B0000018BDB2CF9D1000004030046304402206044A6FAE9C47837ABA50300BFC5C2EBBD33705697EB5C7DB40BDAAC4638E16D02205EB94A42B09FFDE5277C7A2B02BCA288EA859E114B71B4C41D022CC3FFB6D427
832:d=1 hl=2 l= 10 cons: SEQUENCE
834:d=2 hl=2 l= 8 prim: OBJECT :ecdsa-with-SHA384
844:d=1 hl=2 l= 105 prim: BIT STRING
내 점수는 4와 844입니다(844 = sig 이후).
서명할 데이터를 가져와 바이너리 형식으로 남겨둡니다.
$ openssl asn1parse -in stackexchange.pem -strparse 4 -out stackexchange.tbs
디지털 서명 받기
$ openssl asn1parse -in stackexchange.pem -strparse 844 -out stackexchange.sig
CA의 pem 파일에서 공개 키 가져오기
$openssl x509 -in E1.pem -noout -pubkey > e1.pub
출력을 확인하세요
$ openssl pkey -in e1.pub -pubin -text
-----BEGIN PUBLIC KEY-----
MHYwEAYHKoZIzj0CAQYFK4EEACIDYgAEJFwtoir9HEumXZdzJzGssqBpYu9l6Kaw
8KxLn/8cC3AP05gvTfwPAJs38HQFVzKXLgXvKkMlo/tuNCcT9k9+adMCmV7rJEeS
wSSb5rEhj8EkgfxozB9pulj1GSL3dMYW
-----END PUBLIC KEY-----
Public-Key: (384 bit)
pub:
04:24:5c:2d:a2:2a:fd:1c:4b:a6:5d:97:73:27:31:
ac:b2:a0:69:62:ef:65:e8:a6:b0:f0:ac:4b:9f:ff:
1c:0b:70:0f:d3:98:2f:4d:fc:0f:00:9b:37:f0:74:
05:57:32:97:2e:05:ef:2a:43:25:a3:fb:6e:34:27:
13:f6:4f:7e:69:d3:02:99:5e:eb:24:47:92:c1:24:
9b:e6:b1:21:8f:c1:24:81:fc:68:cc:1f:69:ba:58:
f5:19:22:f7:74:c6:16
ASN1 OID: secp384r1
NIST CURVE: P-384
서명할 필드를 바이너리 파일로 해시합니다.
$ openssl sha384 <stackexchange.tbs -binary >hash
이제 수동 확인을 수행하세요.
$ openssl pkeyutl -verify -in hash -sigfile stackexchange.sig -inkey e1.pub -pubin -pkeyopt digest:sha384
Signature Verified Successfully
아 젠장, 이 게시물을 편집하고 Dave가 연결한 메서드가 작동하지 않는 것에 대해 업데이트하려고 했을 때 구현에 실수가 있었다는 것을 깨달았습니다. 따라서 이 게시물을 편집하면서 나는 실제로 이 업데이트된 질문 대신에 내가 원했던 정확한 답변을 제공했습니다. 이제 그것이 성공적으로 검증되는 것을 볼 수 있기 때문입니다.
나는 제안에 열려 있기 때문에 @u1686_grawity가 암호 해독이 확인에 참여하지 않는다고 생각하는 이유를 여전히 이해하고 싶습니다. 그러나 내 업데이트에 따르면 인증서의 서명될 모든 필드를 "해시"라는 파일에 수동으로 해시한 다음 다음을 사용하여 공용 인증서(원본 인증서의 CA) pem 파일에 대한 E1.pem을 얻었습니다. 이를 암호 해독 키로 입력하고 .sig 파일에 대해 실행합니다. 내 해시 결과와 복호화된 해시가 일치하므로 원본 pem 파일에서 추출한 서명이 CA에 의해 확실히 검증되었으며 정품임을 의미합니다. 그래서 나는 왜 u1686_grawity와 인터넷의 많은 다른 사람들이 암호 해독이 일어나지 않았다고 믿는지 혼란스러워요...