디지털 서명 수동 해시 확인

디지털 서명 수동 해시 확인

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와 인터넷의 많은 다른 사람들이 암호 해독이 일어나지 않았다고 믿는지 혼란스러워요...

관련 정보