ECDSA(Elliptic Curve Digital Signature Algorithm)으로 주로 Digital Signature에서 사용되어지며,
이곳에서도 ECDSA 기반의 Certificate 생성 및 분석한다.
ECDSA기반으로 Certificate를 많이 구성하고 사용하는데, 이 기본구조를 알고자 아래와 같이 세부적으로 분석한다.
그리고 더불어 CA기반의 Certificate의 세부구성도 분석하도록 한다.
관련내용
https://crypto.stackexchange.com/questions/33052/is-there-any-difference-between-nist-and-secp-curves-in-terms-of-their-algorithm
https://crypto.stackexchange.com/questions/70889/is-curve-p-384-equal-to-secp384r1
2. ECDSA Certificate 생성방법
ECDSA 기반의 Key 기반으로 Certificate를 생성하는 방법으로 아래 방법으로 간단히 생성이 가능하다.
상위와 같이 Private Key 기반으로 쉽게 Certificate를 생성가능
아래 링크 생성방법과 동일
https://stackoverflow.com/questions/11992036/how-do-i-create-an-ecdsa-certificate-with-the-openssl-command-line
https://zurgl.com/how-to-create-an-ecdsa-certificate/
https://stackoverflow.com/questions/11992036/how-do-i-create-an-ecdsa-certificate-with-the-openssl-command-line
3.2 ECDSA 기반의 CA 와 Certificate 분석
상위 3.1에서 생성된 CA와 Server Certificate 세부적으로 분석해보자
ECDSA는 기본적으로 ECC(Elliptic Curve Cryptography)기반의 Private Key/Public Key 기반으로 동작되어진다.
ECDSA 와 RSA를 비교하면, RSA 비하여 속도가 빠르다고 하며 암호화 용량이 적어 요즘 많이 사용되어진다고 한다.
특히, 임베디드에서는 빠르고, 적은용량으로 고효율을 요구하기 때문이다.
아래에서 각 기본 개념들을 이해해보록하자.
ECC(Elliptic Curve Cryptography)
한글로 번역하면, 타원곡선 암호화이며 관련자료들을 이해해보자.
EC(Elliptic Curve)
ECC를 세부이해하기 위해서 타원곡선이 어떻게 동작하는지 알아보자
RSA-3072bit (384 bytes) 와 ECC-256 bit (32 bytes) 동일급 하며, 아래 링크설명이 너무 좋다.
ECDSA(Elliptic Curve Digital Signature Algorithm)
ECC기반으로 생성된 Digital Signature 알고리즘으로 인증서 내부에 존재함
https://en.wikipedia.org/wiki/Elliptic_Curve_Digital_Signature_Algorithm
https://en.wikipedia.org/wiki/Elliptic_Curve_Digital_Signature_Algorithm
Elliptic-curve Diffie–Hellman (ECDH)
Cipher Suite 키교환알고리즘
TLS 와 SSL의 관련지원사항 및 기본구조확인
전체구성을 알고 싶다면 아래참고
그리고 더불어 CA기반의 Certificate의 세부구성도 분석하도록 한다.
Certificate의 전체구성을 알고자하면 바로 3. Cerficiate Auhtority의 동작을 확인 후 세부적으로 분석하자.
1.1 OpenSSL 기본 지원사항 확인
OpenSSL의 기본지원사항들을 확인해보도록 하자.
1.1 OpenSSL 기본 지원사항 확인
OpenSSL의 기본지원사항들을 확인해보도록 하자.
- OpenSSL 의 기본정보확인
- OpenSSL Version 확인
- ECDSA의 Curves List 확인
$ openssl version OpenSSL 1.1.1b 26 Feb 2019 //ECDSA Key의 동작확인 및 ECDSA List $ openssl ecparam -list_curves // 모든 지원 curves 확인 secp xxx Key Size secp112r1 : SECG/WTLS curve over a 112 bit prime field secp112r2 : SECG curve over a 112 bit prime field secp128r1 : SECG curve over a 128 bit prime field secp128r2 : SECG curve over a 128 bit prime field secp160k1 : SECG curve over a 160 bit prime field secp160r1 : SECG curve over a 160 bit prime field secp160r2 : SECG/WTLS curve over a 160 bit prime field secp192k1 : SECG curve over a 192 bit prime field secp224k1 : SECG curve over a 224 bit prime field secp224r1 : NIST/SECG curve over a 224 bit prime field secp256k1 : SECG curve over a 256 bit prime field //현재 secp256r1 와 다름 주의 secp384r1 : NIST/SECG curve over a 384 bit prime field secp521r1 : NIST/SECG curve over a 521 bit prime field prime192v1: NIST/X9.62/SECG curve over a 192 bit prime field prime192v2: X9.62 curve over a 192 bit prime field prime192v3: X9.62 curve over a 192 bit prime field prime239v1: X9.62 curve over a 239 bit prime field prime239v2: X9.62 curve over a 239 bit prime field prime239v3: X9.62 curve over a 239 bit prime field prime256v1: X9.62/SECG curve over a 256 bit prime field //현재 secp256r1 동일(이름이 변경됨) sect113r1 : SECG curve over a 113 bit binary field sect113r2 : SECG curve over a 113 bit binary field sect131r1 : SECG/WTLS curve over a 131 bit binary field sect131r2 : SECG curve over a 131 bit binary field sect163k1 : NIST/SECG/WTLS curve over a 163 bit binary field sect163r1 : SECG curve over a 163 bit binary field sect163r2 : NIST/SECG curve over a 163 bit binary field sect193r1 : SECG curve over a 193 bit binary field sect193r2 : SECG curve over a 193 bit binary field sect233k1 : NIST/SECG/WTLS curve over a 233 bit binary field sect233r1 : NIST/SECG/WTLS curve over a 233 bit binary field sect239k1 : SECG curve over a 239 bit binary field sect283k1 : NIST/SECG curve over a 283 bit binary field sect283r1 : NIST/SECG curve over a 283 bit binary field sect409k1 : NIST/SECG curve over a 409 bit binary field sect409r1 : NIST/SECG curve over a 409 bit binary field sect571k1 : NIST/SECG curve over a 571 bit binary field sect571r1 : NIST/SECG curve over a 571 bit binary field c2pnb163v1: X9.62 curve over a 163 bit binary field c2pnb163v2: X9.62 curve over a 163 bit binary field c2pnb163v3: X9.62 curve over a 163 bit binary field c2pnb176v1: X9.62 curve over a 176 bit binary field c2tnb191v1: X9.62 curve over a 191 bit binary field c2tnb191v2: X9.62 curve over a 191 bit binary field c2tnb191v3: X9.62 curve over a 191 bit binary field c2pnb208w1: X9.62 curve over a 208 bit binary field c2tnb239v1: X9.62 curve over a 239 bit binary field c2tnb239v2: X9.62 curve over a 239 bit binary field c2tnb239v3: X9.62 curve over a 239 bit binary field c2pnb272w1: X9.62 curve over a 272 bit binary field c2pnb304w1: X9.62 curve over a 304 bit binary field c2tnb359v1: X9.62 curve over a 359 bit binary field c2pnb368w1: X9.62 curve over a 368 bit binary field c2tnb431r1: X9.62 curve over a 431 bit binary field wap-wsg-idm-ecid-wtls1: WTLS curve over a 113 bit binary field wap-wsg-idm-ecid-wtls3: NIST/SECG/WTLS curve over a 163 bit binary field wap-wsg-idm-ecid-wtls4: SECG curve over a 113 bit binary field wap-wsg-idm-ecid-wtls5: X9.62 curve over a 163 bit binary field wap-wsg-idm-ecid-wtls6: SECG/WTLS curve over a 112 bit prime field wap-wsg-idm-ecid-wtls7: SECG/WTLS curve over a 160 bit prime field wap-wsg-idm-ecid-wtls8: WTLS curve over a 112 bit prime field wap-wsg-idm-ecid-wtls9: WTLS curve over a 160 bit prime field wap-wsg-idm-ecid-wtls10: NIST/SECG/WTLS curve over a 233 bit binary field wap-wsg-idm-ecid-wtls11: NIST/SECG/WTLS curve over a 233 bit binary field wap-wsg-idm-ecid-wtls12: WTLS curve over a 224 bit prime field Oakley-EC2N-3: IPSec/IKE/Oakley curve #3 over a 155 bit binary field. Not suitable for ECDSA. Questionable extension field! Oakley-EC2N-4: IPSec/IKE/Oakley curve #4 over a 185 bit binary field. Not suitable for ECDSA. Questionable extension field! brainpoolP160r1: RFC 5639 curve over a 160 bit prime field brainpoolP160t1: RFC 5639 curve over a 160 bit prime field brainpoolP192r1: RFC 5639 curve over a 192 bit prime field brainpoolP192t1: RFC 5639 curve over a 192 bit prime field brainpoolP224r1: RFC 5639 curve over a 224 bit prime field brainpoolP224t1: RFC 5639 curve over a 224 bit prime field brainpoolP256r1: RFC 5639 curve over a 256 bit prime field brainpoolP256t1: RFC 5639 curve over a 256 bit prime field brainpoolP320r1: RFC 5639 curve over a 320 bit prime field brainpoolP320t1: RFC 5639 curve over a 320 bit prime field brainpoolP384r1: RFC 5639 curve over a 384 bit prime field brainpoolP384t1: RFC 5639 curve over a 384 bit prime field brainpoolP512r1: RFC 5639 curve over a 512 bit prime field brainpoolP512t1: RFC 5639 curve over a 512 bit prime field SM2 : SM2 curve over a 256 bit prime field
https://crypto.stackexchange.com/questions/33052/is-there-any-difference-between-nist-and-secp-curves-in-terms-of-their-algorithm
https://crypto.stackexchange.com/questions/70889/is-curve-p-384-equal-to-secp384r1
2. ECDSA Certificate 생성방법
ECDSA 기반의 Key 기반으로 Certificate를 생성하는 방법으로 아래 방법으로 간단히 생성이 가능하다.
- ECDSA 기반의 Certifiace 생성
- ECDSA Private Key 생성방법
- ECDSA Private Key 기반의 Certificate 생성
$ openssl ecparam -out key.pem -name secp256r1 -genkey // Private Key 와 Public Key 생성 $ openssl req -new -key key.pem -x509 -nodes -days 365 -out cert.pem // Key 기반으로 Certificate 생성(1년)
상위와 같이 Private Key 기반으로 쉽게 Certificate를 생성가능
- Private Key(key.pem) 생성
- Cerfiticate(cert.pem) 생성완료 (X.509)
아래 링크 생성방법과 동일
https://stackoverflow.com/questions/11992036/how-do-i-create-an-ecdsa-certificate-with-the-openssl-command-line
https://zurgl.com/how-to-create-an-ecdsa-certificate/
https://stackoverflow.com/questions/11992036/how-do-i-create-an-ecdsa-certificate-with-the-openssl-command-line
ECC Key 생성과 Certificate는 기본구조 세부분석으로 알고 싶지 않다면 , 아래는 보지말고, 그냥 위 Command로만 생성하고 말자.
- ECDSA 기반의 Certificate 분석할 것
2.1 ECSDSA Private Key 생성 및 분석: Private Key 내부구성 및 분석방법
2.2 ECSDSA Certificate Signature 분석: Certificate의 Signature의 구성 및 사용방법
2.2 ECSDSA Certificate 분석: Certificate 생성방법 및 분석방법
2.1 ECDSA의 Private Key 생성 및 분석
Eliptic-curve cryptography 로 Private Key 생성과 분석이므로 분석할 필요가 없다면 넘어가자
ECDSA는 Certifcate에서 사용되어지는 Signature 알고리즘이니, 정확히 말하면, ECDSA가 아니라 ECC(Elliptic Curve Cryptography)의 PrivateKey가 맞겠다.
openssl ecparam manual
https://www.openssl.org/docs/man1.0.2/man1/ecparam.html
EC PRIVATE KEY FORMAT
https://tools.ietf.org/html/rfc5915
https://crypto.stackexchange.com/questions/48707/ecdsa-private-key-format
ASN.1 parse 구조
openssl asn1parse
https://www.openssl.org/docs/manmaster/man1/openssl-asn1parse.html
https://www.obj-sys.com/docs/acv67/JavaRunTime/com/objsys/asn1j/runtime/Asn1Tag.html
이 부분은 아래의 CA의 구조 및 역할을 보면 다시 이해 가능
Sample Data 생성하여 TEST하며, Certificate의 Signature의 원리파악을 해보자
1. TEST DATA or TEXT 생성
Sample Data 생성하여 TEST하며, Certificate의 Signature일 경우 Certificate 정보
생성된 Signature File의 크기 및 구조파악하며 256(32byte) 가 아니며, 72bytes (Certificate의 Signature 와 동일)
4. Signature를 Public Key로 검증(Verification)
To verify: Public Key를 이용하여 yourinput.sha256 Signature로 이를 검증
OpenSSL dgst
https://www.openssl.org/docs/man1.1.0/man1/openssl-dgst.html
Digital Signature Algorithm
Public Key 와 Private Key 기반으로 상위와 같이 구성
https://en.wikipedia.org/wiki/Digital_Signature_Algorithm
https://cryptobook.nakov.com/digital-signatures
https://superuser.com/questions/737574/openssl-ecdsa-sign-and-verify-file
https://medium.com/@skloesch/openssl-and-ecdsa-signatures-db60c005b1f4
https://superuser.com/questions/1258478/how-to-get-ecsda-with-p-256-and-sha256-in-openssl
2.3 ECDSA 기반의 Certificate 분석
이미 위에서 ECDSA의 Private Key/Public Key 기반으로 Certificate 생성했지만, 이를 분석하기 위해서 아래와 같이 다시 생성 후 이를 분석
openssl req manual
https://www.openssl.org/docs/man1.0.2/man1/openssl-req.html
OpenSSL 로 x509로 분석시 옵션
https://www.openssl.org/docs/man1.0.2/man1/openssl-x509.html
openssl asn1parse
https://www.openssl.org/docs/manmaster/man1/openssl-asn1parse.html
3. Certificate Authority 기본동작
아래 그림처럼 CA는 Certificate를 검증하고, CA의 Private Key로 Encryption 하여 나오는 Digital Signature를 Digital Certificate에 추가하여 발행
Digital certificate
https://en.wikipedia.org/wiki/Public_key_certificate
아래의 경우 3단계로 구성이 되어있지만, 글을 읽다보면, 다른 구성도 가능하며, 단계 역시 사용자가 사용하기 나름인 것 같다.
하지만 기본구조를 보면 다음과 같기에 이를 알아두도록하자
Signature 의 경우 CA의 Private Key를 이용하며, 이는 CA가 검증을 할 수 있도록 하는 기능을 하는 구조이며, 이 부분은 상위 Signature 사용방법을 보자
세부내용은 아래링크 참조
https://en.wikipedia.org/wiki/Root_certificate
https://en.wikipedia.org/wiki/Certificate_authority
https://en.wikipedia.org/wiki/Public_key_certificate
3.1 ECDSA 기반의 CA 와 Certificate 생성
상위구조를 이해를 했으면, 나의 경우는 3단계의 구성이 아니라 간단하게 Root CA 와 End Certificate로 두 단계 구성으로 만들어 보자.
CSR(Certificate Signing Request)는 아직 X.509로 Certificate가 아니며 Request 상태
현재 상위 CA와 Server CSR 는 Reference 상태가 아님
openssl req manual
https://www.openssl.org/docs/man1.0.2/man1/openssl-req.html
X.509 확장정보는 아래 참조
https://en.wikipedia.org/wiki/X.509#Extensions_informing_a_specific_usage_of_a_certificate
https://en.wikipedia.org/wiki/X.509
2.2 ECSDSA Certificate Signature 분석: Certificate의 Signature의 구성 및 사용방법
2.2 ECSDSA Certificate 분석: Certificate 생성방법 및 분석방법
- 실제 Certificate의 구성분석
상위를 분석한 후 CA(Cerficiate Autority)의 기본동작을 보도록하자.
3. Certificate Auhoirty 기본동작
Eliptic-curve cryptography 로 Private Key 생성과 분석이므로 분석할 필요가 없다면 넘어가자
**ECDSA Private Key 비대칭 Key이니, 당연히 이 정보 안에 Private Key와 Public Key 정보도 같이 포함되어있다.
ECDSA는 Certifcate에서 사용되어지는 Signature 알고리즘이니, 정확히 말하면, ECDSA가 아니라 ECC(Elliptic Curve Cryptography)의 PrivateKey가 맞겠다.
더불어 생성된 Key 정보를 OpenSSL에서 제공하는 다양한 명령어로 분석해보자
- A. ECDSA Private Key 생성방법
// base64 Encoding에서 아래부분을 반드시 확인하며, 각각 의미를 확인 //-----BEGIN EC PRIVATE KEY----- //-----END EC PRIVATE KEY----- $ openssl ecparam -out key0.pem -name secp256r1 -genkey // ECDSA P-256 (secp256r1 Curve) 사용 using curve name prime256v1 instead of secp256r1 // secp256r1 이 prime256v1 대체됨 $ cat key0.pem // Text기반으로 보기때문에 Base64 Encoding 이됨 -----BEGIN EC PARAMETERS----- BggqhkjOPQMBBw== -----END EC PARAMETERS----- -----BEGIN EC PRIVATE KEY----- MHcCAQEEIIaZ3Q9Yt+Pi0SkX7Qc3+w/qotLCxraj72TUjcrO2K/6oAoGCCqGSM49 AwEHoUQDQgAEZAn9MRJqAwmcbIuV2jFKx4q3C1pwrnPoLJPMJt+lv7wPpYvyzUBj V7WuXWBMk2O7RYLXVCrWUoe8NWsXE+OKOQ== -----END EC PRIVATE KEY----- or $ openssl ecparam -genkey -name prime256v1 -out key1.pem -noout // -noout을 주면 EC PARAMETERS 삭제됨 $ cat key1.pem -----BEGIN EC PRIVATE KEY----- MHcCAQEEIFcRnrEHSiO6Xy47Pu8RdAAg4OgwkR67QLPppNO4uKAGoAoGCCqGSM49 AwEHoUQDQgAEAjoRktPPZCBEd6TiU/g2u+qgkupmVx7XQJJvT6hWockHM6kjWGCm AMMtW/TQ7zloruOe52YNRgxe8vMpjUHU4A== -----END EC PRIVATE KEY----- or $ openssl ecparam -genkey -name secp256r1 | openssl ec -out key2.pem // ECDSA P-256(secp256r1 Curve) 사용 using curve name prime256v1 instead of secp256r1 // 대체되며 동일한 기능임 $ cat key2.pem -----BEGIN EC PRIVATE KEY----- MHcCAQEEIFcRnrEHSiO6Xy47Pu8RdAAg4OgwkR67QLPppNO4uKAGoAoGCCqGSM49 AwEHoUQDQgAEAjoRktPPZCBEd6TiU/g2u+qgkupmVx7XQJJvT6hWockHM6kjWGCm AMMtW/TQ7zloruOe52YNRgxe8vMpjUHU4A== -----END EC PRIVATE KEY-----
openssl ecparam manual
https://www.openssl.org/docs/man1.0.2/man1/ecparam.html
EC PRIVATE KEY FORMAT
https://tools.ietf.org/html/rfc5915
https://crypto.stackexchange.com/questions/48707/ecdsa-private-key-format
상위에서 다양하게 생성된 Private Key 중 하나를 선택하여 이 기반으로 다양하게 분석.
- B. 생성된 Private Key 들 중 key.pem 선택 후 분석
$ mv key0.pem key.pem
or
$ mv key1.pem key.pem // 셋 중 아무거나 사용
- C.1 key.pem 의 ASN.1 Parser 분석
// key.pem (BEGIN EC PRIVATE KEY) // key.der 일경우 base64 encoding 방식이 아니며 binary이므로 -inform DER 추가 $ cat key.pem -----BEGIN EC PRIVATE KEY----- MHcCAQEEIFcRnrEHSiO6Xy47Pu8RdAAg4OgwkR67QLPppNO4uKAGoAoGCCqGSM49 AwEHoUQDQgAEAjoRktPPZCBEd6TiU/g2u+qgkupmVx7XQJJvT6hWockHM6kjWGCm AMMtW/TQ7zloruOe52YNRgxe8vMpjUHU4A== -----END EC PRIVATE KEY----- // ASN.1 으로 Decoding 하면 OCTET STRING의 Hex Dump Private Key정보 존재 와 Public Key 존재 $ openssl asn1parse -in key.pem 0:d=0 hl=2 l= 119 cons: SEQUENCE 2:d=1 hl=2 l= 1 prim: INTEGER :01 5:d=1 hl=2 l= 32 prim: OCTET STRING [HEX DUMP]:57119EB1074A23BA5F2E3B3EEF11740020E0E830911EBB40B3E9A4D3B8B8A006 39:d=1 hl=2 l= 10 cons: cont [ 0 ] 41:d=2 hl=2 l= 8 prim: OBJECT :prime256v1 51:d=1 hl=2 l= 68 cons: cont [ 1 ] 53:d=2 hl=2 l= 66 prim: BIT STRING // OCTET STRING: Private Key // BIT STRING: Public Key $ openssl asn1parse -in key.pem -dump 0:d=0 hl=2 l= 119 cons: SEQUENCE 2:d=1 hl=2 l= 1 prim: INTEGER :01 5:d=1 hl=2 l= 32 prim: OCTET STRING 0000 - 57 11 9e b1 07 4a 23 ba-5f 2e 3b 3e ef 11 74 00 W....J#._.;>..t. 0010 - 20 e0 e8 30 91 1e bb 40-b3 e9 a4 d3 b8 b8 a0 06 ..0...@........ 39:d=1 hl=2 l= 10 cons: cont [ 0 ] 41:d=2 hl=2 l= 8 prim: OBJECT :prime256v1 51:d=1 hl=2 l= 68 cons: cont [ 1 ] 53:d=2 hl=2 l= 66 prim: BIT STRING 0000 - 00 04 02 3a 11 92 d3 cf-64 20 44 77 a4 e2 53 f8 ...:....d Dw..S. 0010 - 36 bb ea a0 92 ea 66 57-1e d7 40 92 6f 4f a8 56 6.....fW..@.oO.V 0020 - a1 c9 07 33 a9 23 58 60-a6 00 c3 2d 5b f4 d0 ef ...3.#X`...-[... 0030 - 39 68 ae e3 9e e7 66 0d-46 0c 5e f2 f3 29 8d 41 9h....f.F.^..).A 0040 - d4 e0 ..
- C.2 key.pem의 TEXT 기반분석
// 상위 key.pem 다름 (BEGIN PRIVATE KEY) 이 정보안에 Private Key 정보포함 // key.der 일경우 base64 encoding 방식이 아니며 binary이므로 -inform DER 추가 $ openssl pkey -in key.pem -text -----BEGIN PRIVATE KEY----- MIGHAgEAMBMGByqGSM49AgEGCCqGSM49AwEHBG0wawIBAQQgVxGesQdKI7pfLjs+ 7xF0ACDg6DCRHrtAs+mk07i4oAahRANCAAQCOhGS089kIER3pOJT+Da76qCS6mZX HtdAkm9PqFahyQczqSNYYKYAwy1b9NDvOWiu457nZg1GDF7y8ymNQdTg -----END PRIVATE KEY----- Private-Key: (256 bit) // 256bit (32byte) priv: // 32bytes 57:11:9e:b1:07:4a:23:ba:5f:2e:3b:3e:ef:11:74: 00:20:e0:e8:30:91:1e:bb:40:b3:e9:a4:d3:b8:b8: a0:06 pub: // 65byte (1+32bytes+32bytes) Public Key A/B 두개의 키로구성 04:02:3a:11:92:d3:cf:64:20:44:77:a4:e2:53:f8: 36:bb:ea:a0:92:ea:66:57:1e:d7:40:92:6f:4f:a8: 56:a1:c9:07:33:a9:23:58:60:a6:00:c3:2d:5b:f4: d0:ef:39:68:ae:e3:9e:e7:66:0d:46:0c:5e:f2:f3: 29:8d:41:d4:e0 ASN1 OID: prime256v1 NIST CURVE: P-256 $ openssl pkey -in key.pem -noout -text Private-Key: (256 bit) // 256bit (32byte) priv: // 32bytes Private Key 57:11:9e:b1:07:4a:23:ba:5f:2e:3b:3e:ef:11:74: 00:20:e0:e8:30:91:1e:bb:40:b3:e9:a4:d3:b8:b8: a0:06 pub: // 65byte (1+32bytes+32bytes) Public Key A/B 두개의 키로구성 04:02:3a:11:92:d3:cf:64:20:44:77:a4:e2:53:f8: 36:bb:ea:a0:92:ea:66:57:1e:d7:40:92:6f:4f:a8: 56:a1:c9:07:33:a9:23:58:60:a6:00:c3:2d:5b:f4: d0:ef:39:68:ae:e3:9e:e7:66:0d:46:0c:5e:f2:f3: 29:8d:41:d4:e0 ASN1 OID: prime256v1 NIST CURVE: P-256
Public Key 65bytes (1+32+32 )
https://davidederosa.com/basic-blockchain-programming/elliptic-curve-keys/
https://davidederosa.com/basic-blockchain-programming/elliptic-curve-keys/
- BEGIN EC PRIVATE KEY 와 BEGIN PRIVATE KEY 차이
- BEGIN EC PRIVATE KEY: ASN.1으로 OCTECT STRING 과 BIT STRING으로 분리됨
- BEGIN PRIVATE KEY: ASN.1의 OCTECT STRING으로 통합되어 쉽게 볼수 있음
// key.der 일경우 base64 encoding 방식이 아니며 binary이므로 -inform DER 추가 $ vi test.pem // Private Key 와 Public Key 같이 가지고 있음 -----BEGIN PRIVATE KEY----- MIGHAgEAMBMGByqGSM49AgEGCCqGSM49AwEHBG0wawIBAQQgVxGesQdKI7pfLjs+ 7xF0ACDg6DCRHrtAs+mk07i4oAahRANCAAQCOhGS089kIER3pOJT+Da76qCS6mZX HtdAkm9PqFahyQczqSNYYKYAwy1b9NDvOWiu457nZg1GDF7y8ymNQdTg -----END PRIVATE KEY----- $ openssl asn1parse -in test.pem // 상위 Private Key 와 Public Key 정보 확인가능 0:d=0 hl=3 l= 135 cons: SEQUENCE 3:d=1 hl=2 l= 1 prim: INTEGER :00 6:d=1 hl=2 l= 19 cons: SEQUENCE 8:d=2 hl=2 l= 7 prim: OBJECT :id-ecPublicKey 17:d=2 hl=2 l= 8 prim: OBJECT :prime256v1 27:d=1 hl=2 l= 109 prim: OCTET STRING [HEX DUMP]:306B020101042057119EB1074A23BA5F2E3B3EEF11740020E0E830911EBB40B3E9A4D3B8B8A006A14403420004023A1192D3CF64204477A4E253F836BBEAA092EA66571ED740926F4FA856A1C90733A9235860A600C32D5BF4D0EF3968AEE39EE7660D460C5EF2F3298D41D4E0 $ openssl asn1parse -in test.pem -dump //혹시 몰라서 전체 dump 0:d=0 hl=3 l= 135 cons: SEQUENCE 3:d=1 hl=2 l= 1 prim: INTEGER :00 6:d=1 hl=2 l= 19 cons: SEQUENCE 8:d=2 hl=2 l= 7 prim: OBJECT :id-ecPublicKey 17:d=2 hl=2 l= 8 prim: OBJECT :prime256v1 27:d=1 hl=2 l= 109 prim: OCTET STRING 0000 - 30 6b 02 01 01 04 20 57-11 9e b1 07 4a 23 ba 5f 0k.... W....J#._ 0010 - 2e 3b 3e ef 11 74 00 20-e0 e8 30 91 1e bb 40 b3 .;>..t. ..0...@. 0020 - e9 a4 d3 b8 b8 a0 06 a1-44 03 42 00 04 02 3a 11 ........D.B...:. 0030 - 92 d3 cf 64 20 44 77 a4-e2 53 f8 36 bb ea a0 92 ...d Dw..S.6.... 0040 - ea 66 57 1e d7 40 92 6f-4f a8 56 a1 c9 07 33 a9 .fW..@.oO.V...3. 0050 - 23 58 60 a6 00 c3 2d 5b-f4 d0 ef 39 68 ae e3 9e #X`...-[...9h... 0060 - e7 66 0d 46 0c 5e f2 f3-29 8d 41 d4 e0 .f.F.^..).A..
ASN.1 parse 구조
- offset:d
- d: depth
- hl: header length (bytes)
- l: length (bytes)
- cons or prim: tags form
openssl asn1parse
https://www.openssl.org/docs/manmaster/man1/openssl-asn1parse.html
https://www.obj-sys.com/docs/acv67/JavaRunTime/com/objsys/asn1j/runtime/Asn1Tag.html
- C.3 key.pem의 TEXT 기반분석
바로 이전과 동일하게 나오며, 쉽게 Private Key와 Public Key 좀 더 쉽게 분석가능
이 Private Key로 2.3 ECDSA 의 Certificate 분석에 사용
openssl ec manual
https://www.openssl.org/docs/man1.0.2/man1/ec.html
openssl ec command 예제
https://wiki.openssl.org/index.php/Command_Line_Elliptic_Curve_Operations
openssl command 예제
https://wiki.openssl.org/index.php/Command_Line_Utilities
https://en.wikipedia.org/wiki/X.690
Base64 Encode/Decode Website
https://base64.guru/converter/encode/hex
https://base64.guru/converter/decode/hex
2.2 ECDSA 의 Certificate Signature 분석
이 부분은 CA가 Certificate 의 Signature 부분을 생성부분을 이해하기 위해서 간단하게 구성한 것이므로, 알면 넘어가자
// key.der 일경우 base64 encoding 방식이 아니며 binary이므로 -inform DER 추가 $ openssl ec -in key.pem -text -noout read EC key Private-Key: (256 bit) priv: 57:11:9e:b1:07:4a:23:ba:5f:2e:3b:3e:ef:11:74: 00:20:e0:e8:30:91:1e:bb:40:b3:e9:a4:d3:b8:b8: a0:06 pub: //Prefix(0x04) and Pair of Coordinates (X,Y) RFC5480 2.2 Subject Public Key 참조 0x04 uncompressed 04:02:3a:11:92:d3:cf:64:20:44:77:a4:e2:53:f8: 36:bb:ea:a0:92:ea:66:57:1e:d7:40:92:6f:4f:a8: 56:a1:c9:07:33:a9:23:58:60:a6:00:c3:2d:5b:f4: d0:ef:39:68:ae:e3:9e:e7:66:0d:46:0c:5e:f2:f3: 29:8d:41:d4:e0 ASN1 OID: prime256v1 NIST CURVE: P-256 $ openssl ec -in key.pem -text read EC key Private-Key: (256 bit) priv: 57:11:9e:b1:07:4a:23:ba:5f:2e:3b:3e:ef:11:74: 00:20:e0:e8:30:91:1e:bb:40:b3:e9:a4:d3:b8:b8: a0:06 pub: //Prefix(0x04) and Pair of Coordinates (X,Y) RFC5480 2.2 Subject Public Key 참조 0x04 uncompressed 04:02:3a:11:92:d3:cf:64:20:44:77:a4:e2:53:f8: 36:bb:ea:a0:92:ea:66:57:1e:d7:40:92:6f:4f:a8: 56:a1:c9:07:33:a9:23:58:60:a6:00:c3:2d:5b:f4: d0:ef:39:68:ae:e3:9e:e7:66:0d:46:0c:5e:f2:f3: 29:8d:41:d4:e0 ASN1 OID: prime256v1 NIST CURVE: P-256 writing EC key -----BEGIN EC PRIVATE KEY----- MHcCAQEEIFcRnrEHSiO6Xy47Pu8RdAAg4OgwkR67QLPppNO4uKAGoAoGCCqGSM49 AwEHoUQDQgAEAjoRktPPZCBEd6TiU/g2u+qgkupmVx7XQJJvT6hWockHM6kjWGCm AMMtW/TQ7zloruOe52YNRgxe8vMpjUHU4A== -----END EC PRIVATE KEY----- $ openssl ec -in key.pem -text -pubout // 실제 Public Key 추출 가능(이는 아래의 Certificate 사용) read EC key Private-Key: (256 bit) priv: 57:11:9e:b1:07:4a:23:ba:5f:2e:3b:3e:ef:11:74: 00:20:e0:e8:30:91:1e:bb:40:b3:e9:a4:d3:b8:b8: a0:06 pub: //Prefix(0x04) and Pair of Coordinates (X,Y) RFC5480 2.2 Subject Public Key 참조 0x04 uncompressed 04:02:3a:11:92:d3:cf:64:20:44:77:a4:e2:53:f8: 36:bb:ea:a0:92:ea:66:57:1e:d7:40:92:6f:4f:a8: 56:a1:c9:07:33:a9:23:58:60:a6:00:c3:2d:5b:f4: d0:ef:39:68:ae:e3:9e:e7:66:0d:46:0c:5e:f2:f3: 29:8d:41:d4:e0 ASN1 OID: prime256v1 NIST CURVE: P-256 writing EC key -----BEGIN PUBLIC KEY----- MFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEAjoRktPPZCBEd6TiU/g2u+qgkupm Vx7XQJJvT6hWockHM6kjWGCmAMMtW/TQ7zloruOe52YNRgxe8vMpjUHU4A== -----END PUBLIC KEY-----
openssl ec manual
https://www.openssl.org/docs/man1.0.2/man1/ec.html
openssl ec command 예제
https://wiki.openssl.org/index.php/Command_Line_Elliptic_Curve_Operations
openssl command 예제
https://wiki.openssl.org/index.php/Command_Line_Utilities
https://en.wikipedia.org/wiki/X.690
- Base64 Code To Hex로 Private Key 재검증
// key.pem (BEGIN EC PRIVATE KEY) MHcCAQEEIFcRnrEHSiO6Xy47Pu8RdAAg4OgwkR67QLPppNO4uKAGoAoGCCqGSM49AwEHoUQDQgAEAjoRktPPZCBEd6TiU/g2u+qgkupmVx7XQJJvT6hWockHM6kjWGCmAMMtW/TQ7zloruOe52YNRgxe8vMpjUHU4A== //base64 to Hex 30770201010420178b69b8b92c8f17366eb7ac816bf04c7410b022c01942a10acc4f791c4a7f9ba00a06082a8648ce3d030107a14403420004353693ac07ddd2e5f1231ef3e86f97fcfd2365653f9bc2c261513e36cdd4b3df1d4b800a5f25a4bc96fa0230c0f4a338837da9c30450cbb8e43ce07a6aede8d0
// key.pem (BEGIN PRIVATE KEY) MIGHAgEAMBMGByqGSM49AgEGCCqGSM49AwEHBG0wawIBAQQgVxGesQdKI7pfLjs+7xF0ACDg6DCRHrtAs+mk07i4oAahRANCAAQCOhGS089kIER3pOJT+Da76qCS6mZXHtdAkm9PqFahyQczqSNYYKYAwy1b9NDvOWiu457nZg1GDF7y8ymNQdTg //base64 to Hex 308187020100301306072a8648ce3d020106082a8648ce3d030107046d306b020101042057119eb1074a23ba5f2e3b3eef11740020e0e830911ebb40b3e9a4d3b8b8a006a14403420004023a1192d3cf64204477a4e253f836bbeaa092ea66571ed740926f4fa856a1c90733a9235860a600c32d5bf4d0ef3968aee39ee7660d460c5ef2f3298d41d4e0
Base64 Encode/Decode Tool 이 없다면 아래의 사이트에서 변경
https://base64.guru/converter/encode/hex
https://base64.guru/converter/decode/hex
2.2 ECDSA 의 Certificate Signature 분석
이 부분은 CA가 Certificate 의 Signature 부분을 생성부분을 이해하기 위해서 간단하게 구성한 것이므로, 알면 넘어가자
이부분은 ECDSA Certificate의 Signature Sign/Verify 부분을 이해하는 것으로, 나중에 구조그림을 보면 쉽게 이해간다.
Signature는 Private Key 기반으로 만들고, Public Key로 검증이 가능하니 아래와 같이 각 Key들을 확인
- Private Key 동일하게 생성
// Create Private key and Public Key (상위와 key.pem 동일) $ openssl ecparam -genkey -name prime256v1 -noout -out private.pem //새로 생성하고 할 경우, 나는 상위 key.pem 복사 $ cat private.pem //기존의 key.pem 과 동일 -----BEGIN EC PRIVATE KEY----- MHcCAQEEIFcRnrEHSiO6Xy47Pu8RdAAg4OgwkR67QLPppNO4uKAGoAoGCCqGSM49 AwEHoUQDQgAEAjoRktPPZCBEd6TiU/g2u+qgkupmVx7XQJJvT6hWockHM6kjWGCm AMMtW/TQ7zloruOe52YNRgxe8vMpjUHU4A== -----END EC PRIVATE KEY----- $ openssl ec -in private.pem -text -pubout //상위 key.pem 과 동일하며, Sign/Verify 테스트 read EC key Private-Key: (256 bit) priv: 57:11:9e:b1:07:4a:23:ba:5f:2e:3b:3e:ef:11:74: //ECC Private Key 256bit (32bytes) 00:20:e0:e8:30:91:1e:bb:40:b3:e9:a4:d3:b8:b8: a0:06 pub: //Prefix(0x04) and Pair of Coordinates (X,Y) RFC5480 2.2 Subject Public Key 참조 0x04 uncompressed 04:02:3a:11:92:d3:cf:64:20:44:77:a4:e2:53:f8: //ECC Public Key X (32bytes) 36:bb:ea:a0:92:ea:66:57:1e:d7:40:92:6f:4f:a8: 56:a1:c9:07:33:a9:23:58:60:a6:00:c3:2d:5b:f4: //ECC Public Key Y (32bytes) d0:ef:39:68:ae:e3:9e:e7:66:0d:46:0c:5e:f2:f3: 29:8d:41:d4:e0 ASN1 OID: prime256v1 NIST CURVE: P-256 writing EC key -----BEGIN PUBLIC KEY----- MFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEAjoRktPPZCBEd6TiU/g2u+qgkupm Vx7XQJJvT6hWockHM6kjWGCmAMMtW/TQ7zloruOe52YNRgxe8vMpjUHU4A== -----END PUBLIC KEY-----
- Private Key에서 Public Key만 추출
// Save public key (Public Key 추출) $ openssl ec -in private.pem -pubout -out public.pem //상위 private.pem 에서 public key만 추출 $ cat public.pem -----BEGIN PUBLIC KEY----- MFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEAjoRktPPZCBEd6TiU/g2u+qgkupm Vx7XQJJvT6hWockHM6kjWGCmAMMtW/TQ7zloruOe52YNRgxe8vMpjUHU4A== -----END PUBLIC KEY----- $ openssl asn1parse -in public.pem -dump //ECC Public key 확인완료 prefix: 0x04 coordinates (x,y) 0:d=0 hl=2 l= 89 cons: SEQUENCE 2:d=1 hl=2 l= 19 cons: SEQUENCE 4:d=2 hl=2 l= 7 prim: OBJECT :id-ecPublicKey 13:d=2 hl=2 l= 8 prim: OBJECT :prime256v1 23:d=1 hl=2 l= 66 prim: BIT STRING 0000 - 00 04 02 3a 11 92 d3 cf-64 20 44 77 a4 e2 53 f8 ...:....d Dw..S. //Public Key X (32bytes) 0010 - 36 bb ea a0 92 ea 66 57-1e d7 40 92 6f 4f a8 56 6.....fW..@.oO.V 0020 - a1 c9 07 33 a9 23 58 60-a6 00 c3 2d 5b f4 d0 ef ...3.#X`...-[... //Public Key Y (32bytes) 0030 - 39 68 ae e3 9e e7 66 0d-46 0c 5e f2 f3 29 8d 41 9h....f.F.^..).A 0040 - d4 e0
- Hash를 이용하여 Signature 생성(Private Key) 및 검증(Public Key)방법
이 부분은 아래의 CA의 구조 및 역할을 보면 다시 이해 가능
준비사항
- private.pem
- public.pem
- yourinputdocument : Test File
SHA-256 Hash
https://ko.wikipedia.org/wiki/SHAWeb SHA-256 Encode-Decode
https://emn178.github.io/online-tools/sha256.html
https://emn178.github.io/online-tools/sha256.html
Sample Data 생성하여 TEST하며, Certificate의 Signature의 원리파악을 해보자
1. TEST DATA or TEXT 생성
Sample Data 생성하여 TEST하며, Certificate의 Signature일 경우 Certificate 정보
$ vi yourinputdocument // 1. TEST DATA 생성
Hellow World !!!!
or
$ cat > yourinputdocument
Hellow World !!!!
- TEST DATA를 SHA256로 Hash를 이용
- 상위에서 생성된 Hash를 Private Key 기반으로 Sign을 하여 Signature를 생성
Sign something: ECDSA의 Private Key를 이용하여 Sign 를 진행하여 yourinput.sha256 Signature 생성
$ openssl dgst -sha256 -sign private.pem -out yourinput.sha256 yourinputdocument // SHA256기반으로 Sign
생성된 Signature File의 크기 및 구조파악하며 256(32byte) 가 아니며, 72bytes (Certificate의 Signature 와 동일)
$ hd yourinput.sha256 // 상위에서 생성된 결과 (Signature) 를 확인 (TEST DATA의 크기를 늘려도 크기는 동일) or $ xxd yourinput.sha256 or $ hexdump yourinput.sha256 //아래의 값은 상위 2.Signature를 생성될때마다 매번 값이 변경됨 0000000 4430 2002 0c3b 1c15 537f 1297 6ac7 575c 0000010 a62a d386 0a3d 3973 aa69 a750 5ffd 1198 0000020 b1dd 30b2 2002 5e55 236b 1188 eea8 6719 0000030 b507 37d2 272e d84a ced1 91fc 59cb 6e9b 0000040 2adc a97d b373 0000046
4. Signature를 Public Key로 검증(Verification)
To verify: Public Key를 이용하여 yourinput.sha256 Signature로 이를 검증
$ openssl dgst -sha256 -verify public.pem -signature yourinput.sha256 yourinputdocument Verified OK
OpenSSL dgst
https://www.openssl.org/docs/man1.1.0/man1/openssl-dgst.html
Digital Signature Algorithm
Public Key 와 Private Key 기반으로 상위와 같이 구성
https://en.wikipedia.org/wiki/Digital_Signature_Algorithm
https://cryptobook.nakov.com/digital-signatures
- Web Site에서 직접 확인방법
- EC Private Key 와 EC Public Key Hex 생성
- Data에서 Signature Algorithm (SHA256 with ECDSA) 를 이용하여 Signature Value생성
- Signature Value(Hash Checksum)기반으로 Data 검증완료
- ECDSA 의 Signature 관련부분 (Data 검증부분)
https://superuser.com/questions/737574/openssl-ecdsa-sign-and-verify-file
https://medium.com/@skloesch/openssl-and-ecdsa-signatures-db60c005b1f4
https://superuser.com/questions/1258478/how-to-get-ecsda-with-p-256-and-sha256-in-openssl
2.3 ECDSA 기반의 Certificate 분석
이미 위에서 ECDSA의 Private Key/Public Key 기반으로 Certificate 생성했지만, 이를 분석하기 위해서 아래와 같이 다시 생성 후 이를 분석
- ECDSA 기반의 Certificate 생성
// 상위에서 생긴 key.pem 기반으로 X.509로 Certificate 생성
$ openssl req -new -key key.pem -x509 -nodes -days 365 -out cert.pem
openssl req manual
https://www.openssl.org/docs/man1.0.2/man1/openssl-req.html
- ECDSA 기반의 Certificate 분석
Private Key는 이곳에 저장하지 못하며, Public Key를 이곳에 저장한다.
$ openssl x509 -in cert.pem -noout -text // 상위 Certifacte 전체 분석 Certificate: Data: Version: 3 (0x2) // 인증서 Version Serial Number: // 인증서 Serial Number로 Unique하며, 매번 CA 생성시마다 다르며, 최대 20bytes 14:ad:af:2e:18:63:68:60:8e:36:be:05:99:66:b2:e6:da:b7:0d:8c Signature Algorithm: ecdsa-with-SHA256 // 인증서 Signature Alogirthm ECDSA 와 SHA256 (아래 값이 나옴) Issuer: C = AU, ST = Some-State, O = Internet Widgits Pty Ltd Validity // 인증서 유효기간 (1년) Not Before: Jul 6 13:34:08 2020 GMT Not After : Jul 6 13:34:08 2021 GMT Subject: C = AU, ST = Some-State, O = Internet Widgits Pty Ltd Subject Public Key Info: Public Key Algorithm: id-ecPublicKey Public-Key: (256 bit) //256bit (32bytes) 상위 key.pem 부분과 동일(상위 key.pem 의 Public Key 만 사용) pub: 04:02:3a:11:92:d3:cf:64:20:44:77:a4:e2:53:f8: //Public Key X (32bytes) 상위와 동일 36:bb:ea:a0:92:ea:66:57:1e:d7:40:92:6f:4f:a8: 56:a1:c9:07:33:a9:23:58:60:a6:00:c3:2d:5b:f4: d0:ef:39:68:ae:e3:9e:e7:66:0d:46:0c:5e:f2:f3: //Public Key Y (32bytes) 상위와 동일 29:8d:41:d4:e0 ASN1 OID: prime256v1 NIST CURVE: P-256 X509v3 extensions: X509v3 Subject Key Identifier: // 상위 Pubic Key의 SHA1 값 (아래에서 확인) 1A:2B:F7:8D:87:A4:E7:35:2E:05:92:C8:60:69:F8:C7:7E:F5:46:FB X509v3 Authority Key Identifier: // Subject Key Identifier 와 Authority Key Identifier 동일값 keyid:1A:2B:F7:8D:87:A4:E7:35:2E:05:92:C8:60:69:F8:C7:7E:F5:46:FB X509v3 Basic Constraints: critical // CA True 이면, Digital Signature 가 아님, 이부분 아래다시 설명 CA:TRUE Signature Algorithm: ecdsa-with-SHA256 //72byte , Signature로 생성될때마다 다르며, Public Key로 검증 30:46:02:21:00:fd:39:0d:c0:cf:72:8c:9d:81:c3:0c:65:0d: 21:50:ac:54:9b:e1:ca:2f:f8:f3:e6:5d:62:36:41:ae:79:57: 20:02:21:00:fc:ef:4e:4a:14:30:0c:5c:a6:96:bb:1c:23:8c: 1c:ba:f0:1b:fa:04:32:ad:c9:3c:45:d3:bc:f6:14:01:be:e5
Subject Key Identifier(SHA1)
//Public Key 04023a1192d3cf64204477a4e253f836bbeaa092ea66571ed740926f4fa856a1c90733a9235860a600c32d5bf4d0ef3968aee39ee7660d460c5ef2f3298d41d4e0 //Subject Key Identifier 1a2bf78d87a4e7352e0592c86069f8c77ef546fb
SHA1 ,Input Type: TEXT->HEX사용
- ECDSA X.509 세부분석
$ openssl x509 -in cert.pem -noout -dates // 날짜 분석 notBefore=Jul 6 13:34:08 2020 GMT notAfter=Jul 6 13:34:08 2021 GMT $ openssl x509 -in cert.pem -noout -pubkey // 상위 PublicKey Base64 Encode -----BEGIN PUBLIC KEY----- MFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEAjoRktPPZCBEd6TiU/g2u+qgkupm Vx7XQJJvT6hWockHM6kjWGCmAMMtW/TQ7zloruOe52YNRgxe8vMpjUHU4A== -----END PUBLIC KEY----- $ openssl asn1parse -in cert.pem //ASN.1 Decode 0:d=0 hl=4 l= 480 cons: SEQUENCE 4:d=1 hl=4 l= 389 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= 20 prim: INTEGER :14ADAF2E186368608E36BE059966B2E6DAB70D8C 35:d=2 hl=2 l= 10 cons: SEQUENCE 37:d=3 hl=2 l= 8 prim: OBJECT :ecdsa-with-SHA256 47:d=2 hl=2 l= 69 cons: SEQUENCE 49:d=3 hl=2 l= 11 cons: SET 51:d=4 hl=2 l= 9 cons: SEQUENCE 53:d=5 hl=2 l= 3 prim: OBJECT :countryName 58:d=5 hl=2 l= 2 prim: PRINTABLESTRING :AU 62:d=3 hl=2 l= 19 cons: SET 64:d=4 hl=2 l= 17 cons: SEQUENCE 66:d=5 hl=2 l= 3 prim: OBJECT :stateOrProvinceName 71:d=5 hl=2 l= 10 prim: UTF8STRING :Some-State 83:d=3 hl=2 l= 33 cons: SET 85:d=4 hl=2 l= 31 cons: SEQUENCE 87:d=5 hl=2 l= 3 prim: OBJECT :organizationName 92:d=5 hl=2 l= 24 prim: UTF8STRING :Internet Widgits Pty Ltd 118:d=2 hl=2 l= 30 cons: SEQUENCE 120:d=3 hl=2 l= 13 prim: UTCTIME :200706133408Z 135:d=3 hl=2 l= 13 prim: UTCTIME :210706133408Z 150:d=2 hl=2 l= 69 cons: SEQUENCE 152:d=3 hl=2 l= 11 cons: SET 154:d=4 hl=2 l= 9 cons: SEQUENCE 156:d=5 hl=2 l= 3 prim: OBJECT :countryName 161:d=5 hl=2 l= 2 prim: PRINTABLESTRING :AU 165:d=3 hl=2 l= 19 cons: SET 167:d=4 hl=2 l= 17 cons: SEQUENCE 169:d=5 hl=2 l= 3 prim: OBJECT :stateOrProvinceName 174:d=5 hl=2 l= 10 prim: UTF8STRING :Some-State 186:d=3 hl=2 l= 33 cons: SET 188:d=4 hl=2 l= 31 cons: SEQUENCE 190:d=5 hl=2 l= 3 prim: OBJECT :organizationName 195:d=5 hl=2 l= 24 prim: UTF8STRING :Internet Widgits Pty Ltd 221:d=2 hl=2 l= 89 cons: SEQUENCE 223:d=3 hl=2 l= 19 cons: SEQUENCE 225:d=4 hl=2 l= 7 prim: OBJECT :id-ecPublicKey 234:d=4 hl=2 l= 8 prim: OBJECT :prime256v1 244:d=3 hl=2 l= 66 prim: BIT STRING 312:d=2 hl=2 l= 83 cons: cont [ 3 ] 314:d=3 hl=2 l= 81 cons: SEQUENCE 316:d=4 hl=2 l= 29 cons: SEQUENCE 318:d=5 hl=2 l= 3 prim: OBJECT :X509v3 Subject Key Identifier 323:d=5 hl=2 l= 22 prim: OCTET STRING [HEX DUMP]:04141A2BF78D87A4E7352E0592C86069F8C77EF546FB 347:d=4 hl=2 l= 31 cons: SEQUENCE 349:d=5 hl=2 l= 3 prim: OBJECT :X509v3 Authority Key Identifier 354:d=5 hl=2 l= 24 prim: OCTET STRING [HEX DUMP]:301680141A2BF78D87A4E7352E0592C86069F8C77EF546FB 380:d=4 hl=2 l= 15 cons: SEQUENCE 382:d=5 hl=2 l= 3 prim: OBJECT :X509v3 Basic Constraints 387:d=5 hl=2 l= 1 prim: BOOLEAN :255 390:d=5 hl=2 l= 5 prim: OCTET STRING [HEX DUMP]:30030101FF 397:d=1 hl=2 l= 10 cons: SEQUENCE 399:d=2 hl=2 l= 8 prim: OBJECT :ecdsa-with-SHA256 409:d=1 hl=2 l= 73 prim: BIT STRING
OpenSSL 로 x509로 분석시 옵션
https://www.openssl.org/docs/man1.0.2/man1/openssl-x509.html
openssl asn1parse
https://www.openssl.org/docs/manmaster/man1/openssl-asn1parse.html
3. Certificate Authority 기본동작
- Certificate Authority 역할 및 동작
아래 그림처럼 CA는 Certificate를 검증하고, CA의 Private Key로 Encryption 하여 나오는 Digital Signature를 Digital Certificate에 추가하여 발행
- 좌측: CA의 의해 Digital Certificate 발행 전
- 우측: CA의 의해 Digital Certificate 발행 후
세부내용은 아래 wiki 참조
CA(Cerficate Authority)
https://en.wikipedia.org/wiki/Certificate_authorityDigital certificate
https://en.wikipedia.org/wiki/Public_key_certificate
- RootCA / SubCA / Digital Signature Sign
- Layer 1: Root CA로 Self로 Private Key로 Signature 생성
- Layer 2: Intermediate Certificate로 Layer 1의 Private Key로 Signature 생성
- Layer 3: End 유저가 사용 Layer 2에 Private Key로 Signature 생성
아래의 경우 3단계로 구성이 되어있지만, 글을 읽다보면, 다른 구성도 가능하며, 단계 역시 사용자가 사용하기 나름인 것 같다.
하지만 기본구조를 보면 다음과 같기에 이를 알아두도록하자
Signature 의 경우 CA의 Private Key를 이용하며, 이는 CA가 검증을 할 수 있도록 하는 기능을 하는 구조이며, 이 부분은 상위 Signature 사용방법을 보자
- Certificate 의 Issuer: 인증서 발급자 (Reference)
- Certificate 의 Subject: 현재 Certificate 소유자
- Public Key의 역할은 Sign이 아니라 Verify용으로 검증
상위 Signature를 이해하면 아래 Sign/Verify를 쉽게 이해
https://en.wikipedia.org/wiki/Root_certificate |
https://en.wikipedia.org/wiki/Root_certificate
https://en.wikipedia.org/wiki/Certificate_authority
https://en.wikipedia.org/wiki/Public_key_certificate
3.1 ECDSA 기반의 CA 와 Certificate 생성
상위구조를 이해를 했으면, 나의 경우는 3단계의 구성이 아니라 간단하게 Root CA 와 End Certificate로 두 단계 구성으로 만들어 보자.
Root CA는 CA로 End Certificate는 Server로 아래와 같이 생성해보자
- ECDSA Private Key 생성 후 CA 생성준비 완료
//GENERATING CERTIFICATE Authority
$ openssl ecparam -genkey -name prime256v1 -out ca.key
$ cat ca.key
-----BEGIN EC PARAMETERS-----
BggqhkjOPQMBBw==
-----END EC PARAMETERS-----
-----BEGIN EC PRIVATE KEY-----
MHcCAQEEIF54a1vqeHiIR3aMKOkBEgVMk/7w12OnO3s89Dq5rO6KoAoGCCqGSM49
AwEHoUQDQgAEXbLvFW468tBNs6r6j8yInfZoTeCTKfdkRIS75r3lin6FGGfGhLml
Z1oO5+nFqcmbEIHBTs5l327iCMuYPq8H8w==
-----END EC PRIVATE KEY-----
- CA(Certificate Authority) 생성완료
/* *Cerificate Authorities Country Name(C): KR State or Province Name(ST):SL Locality Name(L): Seoul Organization Name(O):Jeonghun Organizational Unit Name(OU):JHLEE Common Name(CN):JeonghunCA Email Address: -subj "/C=KR/ST=SL/L=Seoul/O=Jeonghun/OU=JHLEE/CN=JeonghunCA" */ $ openssl req -x509 -new -SHA256 -nodes -key ca.key -days 3650 -out ca.crt -subj "/C=KR/ST=SL/L=Seoul/O=Jeonghun/OU=JHLEE/CN=JeonghunCA" $ cat ca.crt //상위 생성시마다 값이 다르므로 동일값이 나올수 없다 -----BEGIN CERTIFICATE----- MIICGTCCAb+gAwIBAgIUK+hYEK24Ewtrib+XxYcws14T+4gwCgYIKoZIzj0EAwIw YjELMAkGA1UEBhMCS1IxCzAJBgNVBAgMAlNMMQ4wDAYDVQQHDAVTZW91bDERMA8G A1UECgwISmVvbmdodW4xDjAMBgNVBAsMBUpITEVFMRMwEQYDVQQDDApKZW9uZ2h1 bkNBMB4XDTIwMDcwNzA1NTI1MloXDTMwMDcwNTA1NTI1MlowYjELMAkGA1UEBhMC S1IxCzAJBgNVBAgMAlNMMQ4wDAYDVQQHDAVTZW91bDERMA8GA1UECgwISmVvbmdo dW4xDjAMBgNVBAsMBUpITEVFMRMwEQYDVQQDDApKZW9uZ2h1bkNBMFkwEwYHKoZI zj0CAQYIKoZIzj0DAQcDQgAEXbLvFW468tBNs6r6j8yInfZoTeCTKfdkRIS75r3l in6FGGfGhLmlZ1oO5+nFqcmbEIHBTs5l327iCMuYPq8H86NTMFEwHQYDVR0OBBYE FPHSACWs/mXd/PG3IYPEkKn7NTKrMB8GA1UdIwQYMBaAFPHSACWs/mXd/PG3IYPE kKn7NTKrMA8GA1UdEwEB/wQFMAMBAf8wCgYIKoZIzj0EAwIDSAAwRQIgRJsRlghF X7qOod/JlqoKiHuQY0jMuldlbz7W/jGEXPQCIQDxoj/CXkDllYDLy1OM7jLSyTOF hKdgqMjWIUWw2Ui3Mg== -----END CERTIFICATE-----
- Server CSR 생성완료
CSR(Certificate Signing Request)는 아직 X.509로 Certificate가 아니며 Request 상태
현재 상위 CA와 Server CSR 는 Reference 상태가 아님
//CREATING A ECDSA CSR(certificate signing request) $ openssl ecparam -genkey -name prime256v1 -out server.key $ cat server.key -----BEGIN EC PARAMETERS----- BggqhkjOPQMBBw== -----END EC PARAMETERS----- -----BEGIN EC PRIVATE KEY----- MHcCAQEEIC6SklucSfbgPAn+UI6u2bIHdotXOofYam/nqM18R2l6oAoGCCqGSM49 AwEHoUQDQgAEWnx+hVyhasx53hxJ5cWbdde08ZCPvbvdGjIX/RWif1S9ZZ2ZtUGU B592OyuheBVQS6rQZdIgQVIE/QmORQDDOA== -----END EC PRIVATE KEY----- // -subj "/C=KR/ST=SL/L=Seoul/O=Jeonghun/OU=JHLEE/CN=ServerCert" $ openssl req -new -SHA256 -key server.key -nodes -out server.csr -subj "/C=KR/ST=SL/L=Seoul/O=Jeonghun/OU=JHLEE/CN=ServerCert" $ cat server.csr -----BEGIN CERTIFICATE REQUEST----- MIIBHjCBxAIBADBiMQswCQYDVQQGEwJLUjELMAkGA1UECAwCU0wxDjAMBgNVBAcM BVNlb3VsMREwDwYDVQQKDAhKZW9uZ2h1bjEOMAwGA1UECwwFSkhMRUUxEzARBgNV BAMMClNlcnZlckNlcnQwWTATBgcqhkjOPQIBBggqhkjOPQMBBwNCAARafH6FXKFq zHneHEnlxZt117TxkI+9u90aMhf9FaJ/VL1lnZm1QZQHn3Y7K6F4FVBLqtBl0iBB UgT9CY5FAMM4oAAwCgYIKoZIzj0EAwIDSQAwRgIhANK/U6C2NNPFvTTnBqb83wX0 b8xMxIYqrcyS9Qq6tCzAAiEAtVGTBPKLMtu2zYNqd/lO6n1AJq+6tZFkt7RR42L8 oVY= -----END CERTIFICATE REQUEST-----
- Server CSR(Certificate Sigining Request) 분석
/* 생성된 CSR 분석 , Certificate가 아님 - 아직 X.509 Format 이 아님 - 아직 Serial Number 와 Validity 가 없음 */ $ openssl req -in server.csr -noout -text Certificate Request: Data: Version: 1 (0x0) Subject: C = KR, ST = SL, L = Seoul, O = Jeonghun, OU = JHLEE, CN = ServerCert Subject Public Key Info: Public Key Algorithm: id-ecPublicKey Public-Key: (256 bit) pub: 04:5a:7c:7e:85:5c:a1:6a:cc:79:de:1c:49:e5:c5: 9b:75:d7:b4:f1:90:8f:bd:bb:dd:1a:32:17:fd:15: a2:7f:54:bd:65:9d:99:b5:41:94:07:9f:76:3b:2b: a1:78:15:50:4b:aa:d0:65:d2:20:41:52:04:fd:09: 8e:45:00:c3:38 ASN1 OID: prime256v1 NIST CURVE: P-256 Attributes: a0:00 Signature Algorithm: ecdsa-with-SHA256 /* Server Certificate 생성때 다시 변경됨 */ 30:46:02:21:00:d2:bf:53:a0:b6:34:d3:c5:bd:34:e7:06:a6: fc:df:05:f4:6f:cc:4c:c4:86:2a:ad:cc:92:f5:0a:ba:b4:2c: c0:02:21:00:b5:51:93:04:f2:8b:32:db:b6:cd:83:6a:77:f9: 4e:ea:7d:40:26:af:ba:b5:91:64:b7:b4:51:e3:62:fc:a1:56
openssl req manual
https://www.openssl.org/docs/man1.0.2/man1/openssl-req.html
- Server CSR의 확장정보변경준비
$ vi v3.ext // CSR의 추가 확장정보 (CA: FALSE 와 digitalSignature)
authorityKeyIdentifier=keyid,issuer
basicConstraints=CA:FALSE
keyUsage = digitalSignature, nonRepudiation, keyEncipherment, dataEncipherment
subjectAltName = @alt_names
[alt_names]
DNS.1 = ahyuo79.blogspot.com
X.509 확장정보는 아래 참조
https://en.wikipedia.org/wiki/X.509#Extensions_informing_a_specific_usage_of_a_certificate
https://en.wikipedia.org/wiki/X.509
- Server Certificate 최종생성
// CA기반으로 server.crt 발행(issue)
/*
-CA filename : CA filename
-CAkey filename : CA private key를 Sign을 하기 위해서 사용
-CAcreateserial : CA serial file이 존재하지 않는다면 자동생성한 후 CA 02로 되고, CA에 의해 발행된 Certificate는 1을 가짐
-------- 기타 옵션 세부사항은 아래링크 참조
or
-CAserial filename : 본인이 직접 넣어 사용
-set_serial n : -CA와 함께사용하며, 직접 n번째 Sign
-CAform DER|PEM|P12 : 현재 PEM으로 default
*/
$ openssl x509 -req -SHA256 -extfile v3.ext -days 365 -in server.csr -CA ca.crt -CAkey ca.key -CAcreateserial -out server.crt
3.2 ECDSA 기반의 CA 와 Certificate 분석
상위 3.1에서 생성된 CA와 Server Certificate 세부적으로 분석해보자
반드시 상위 3.1에서 CA 와 Server Certificate 생성 후 분석 진행
Key Usage (아래 X.509 분석부분과 같이 확인)
https://tools.ietf.org/html/rfc5280#section-4.2.1.3
- Server Certificate 세부분석 전 알아야 할 사항
- Authority Key Identifier: JeonghunCA의 Public Key Hash Value이며 CA의 Subject Key Id와 동일
- Subject Key Identifier: CA와 다르게 존재하지 않음
- Basic Constraints: CA 인지 아닌지 구분
- Key Usage: 주 목적은 Certificate의 Public Key의 사용용도의 허용기능
- Digital Signature: Digital Signature를 검증하기 위해서 사용이라는데, 이해가 안감
- Non Repudiation: 추후 이해하도록함
- Key Encipherment
- Data Encipherment
- RFC5280의 세부내용
https://tools.ietf.org/html/rfc5280#section-4.2.1.3
Subject Alternative Name (아래 X.509 분석부분과 같이 확인)
https://tools.ietf.org/html/rfc5280#section-4.2.1.6
https://tools.ietf.org/html/rfc5280#section-4.2.1.6
- Server Certificate 세부분석
아래의 CA 세부분석과 같이 비교해보면 분석을 해야하며, Certificate 의 Public Key 부분은 상위에 너무 많이 설명해서 생략
OpenSSL 를 이용한 인증서의 Signature 테스트
openssl x509 manual
https://www.openssl.org/docs/manmaster/man1/openssl-x509.html
openssl asn1parse
https://www.openssl.org/docs/manmaster/man1/openssl-asn1parse.html
X.509 기본구조
https://en.wikipedia.org/wiki/X.509#Structure_of_a_certificate
ECDSA 기반의 CA 와 Certificate 생성방법
https://www.erianna.com/ecdsa-certificate-authorities-and-certificates-with-openssl/
$ openssl pkey -in server.key -noout -text // server.key 분석 Private-Key: (256 bit) priv: 2e:92:92:5b:9c:49:f6:e0:3c:09:fe:50:8e:ae:d9: b2:07:76:8b:57:3a:87:d8:6a:6f:e7:a8:cd:7c:47: 69:7a pub: 04:5a:7c:7e:85:5c:a1:6a:cc:79:de:1c:49:e5:c5: 9b:75:d7:b4:f1:90:8f:bd:bb:dd:1a:32:17:fd:15: a2:7f:54:bd:65:9d:99:b5:41:94:07:9f:76:3b:2b: a1:78:15:50:4b:aa:d0:65:d2:20:41:52:04:fd:09: 8e:45:00:c3:38 ASN1 OID: prime256v1 NIST CURVE: P-256 /* CA가 완전 동일하더라도, 매번 Server Certificate가 생성될 때마다 Validity 가 변경 될 것이며, Serial Number도 Unique 하도록 설정되어 다르므로, Signature Algorithm 의 (signatureValue)값 역시 Server Certificate 생성될때마다 자동 변경된다. */ $ openssl x509 -in server.crt -noout -text // server.crt 분석 Certificate: Data: Version: 3 (0x2) Serial Number: // Unique 해야하며 CA에 의해 할당되어진 값 46:5d:19:4d:d3:40:43:9b:0b:2a:91:2e:55:f8:64:fe:d6:8f:9f:f3 Signature Algorithm: ecdsa-with-SHA256 Issuer: C = KR, ST = SL, L = Seoul, O = Jeonghun, OU = JHLEE, CN = JeonghunCA // 인증서 발급자 (Reference), 즉 CA Validity // 인증서 유효기간 (1년) Not Before: Jul 7 06:01:52 2020 GMT Not After : Jul 7 06:01:52 2021 GMT Subject: C = KR, ST = SL, L = Seoul, O = Jeonghun, OU = JHLEE, CN = ServerCert // 인증서 소유자 Subject Public Key Info: // 인증서 Public Key 정보 (server.key) Public Key Algorithm: id-ecPublicKey Public-Key: (256 bit) pub: 04:5a:7c:7e:85:5c:a1:6a:cc:79:de:1c:49:e5:c5: 9b:75:d7:b4:f1:90:8f:bd:bb:dd:1a:32:17:fd:15: a2:7f:54:bd:65:9d:99:b5:41:94:07:9f:76:3b:2b: a1:78:15:50:4b:aa:d0:65:d2:20:41:52:04:fd:09: 8e:45:00:c3:38 ASN1 OID: prime256v1 NIST CURVE: P-256 X509v3 extensions: // 상위 v3.ext 확인 X509v3 Authority Key Identifier: //CA의 Subject Key Id 동일하며, Server의 Subject Key Id는 없음 keyid:F1:D2:00:25:AC:FE:65:DD:FC:F1:B7:21:83:C4:90:A9:FB:35:32:AB X509v3 Basic Constraints: // CA:FALSE 로 CA가 아니며 Digital Signature 용 사용 CA:FALSE X509v3 Key Usage: //Digital Signature용 Digital Signature, Non Repudiation, Key Encipherment, Data Encipherment X509v3 Subject Alternative Name: //Digital Signature용 DNS에 website 주소 입력 DNS:ahyuo79.blogspot.com Signature Algorithm: ecdsa-with-SHA256 // Certificate를 생성마다 값이 변경되며, 이값을 변경주는 요소 (Validity와 Serial Number 예상) 30:45:02:21:00:e9:ae:29:05:fa:ef:a6:8c:c8:25:06:33:e3: 47:9b:20:34:19:45:18:fa:45:62:f8:91:4b:3f:0c:7e:35:23: ed:02:20:12:d1:84:72:99:bd:ba:bd:c0:cb:b8:78:86:65:2c: 9f:74:0b:0c:bf:a6:b9:20:8d:9d:78:99:f3:8e:cc:b5:82 $ openssl asn1parse -in server.crt //ASN.1으로 분석가능 (너무길어서 생략) $ openssl asn1parse -in server.crt -dump //ASN.1 BIT STRING도 보고 싶다면
- CA(Certificate Authorities) 세부분석
기본정보의 이해
- Issuer: 인증서 발급자
- Subject 인증서 실제 소유자
Self Sign을 했으므로, 동시에 두개의 정보를 가지고 있음
- Authority Key Identifier: 인증서 발급자 (Issuer) Public Key Hash Value
- Subject Key Identifier: 인증서 소유자 Public Key Hash Value
- Basic Constraints : CA 인지 아닌지 구분
$ openssl pkey -in ca.key -noout -text // ca.key 분석 Private-Key: (256 bit) priv: 5e:78:6b:5b:ea:78:78:88:47:76:8c:28:e9:01:12: 05:4c:93:fe:f0:d7:63:a7:3b:7b:3c:f4:3a:b9:ac: ee:8a pub: 04:5d:b2:ef:15:6e:3a:f2:d0:4d:b3:aa:fa:8f:cc: 88:9d:f6:68:4d:e0:93:29:f7:64:44:84:bb:e6:bd: e5:8a:7e:85:18:67:c6:84:b9:a5:67:5a:0e:e7:e9: c5:a9:c9:9b:10:81:c1:4e:ce:65:df:6e:e2:08:cb: 98:3e:af:07:f3 ASN1 OID: prime256v1 NIST CURVE: P-256 $ openssl x509 -in ca.crt -noout -text // ca.crt 분석 Certificate: Data: Version: 3 (0x2) // 인증서 Version Serial Number: // 인증서 Serial Number로 Unique하며, 매번 CA 생성시마다 다르며, 최대 20bytes 2b:e8:58:10:ad:b8:13:0b:6b:89:bf:97:c5:87:30:b3:5e:13:fb:88 Signature Algorithm: ecdsa-with-SHA256 // 인증서 Signature Alogirthm Issuer: C = KR, ST = SL, L = Seoul, O = Jeonghun, OU = JHLEE, CN = JeonghunCA // 인증서 발급자 (Reference) Validity // 인증서 유효기간 (10년) Not Before: Jul 7 05:52:52 2020 GMT Not After : Jul 5 05:52:52 2030 GMT Subject: C = KR, ST = SL, L = Seoul, O = Jeonghun, OU = JHLEE, CN = JeonghunCA // 인증서 소유자,(발급자와 소유자 동일) Subject Public Key Info: // 인증서 Public Key 정보 (ca.key) Public Key Algorithm: id-ecPublicKey Public-Key: (256 bit) // Publickey의 SHA1 Hash값으로 아래의 확장의 Subject Key Identifier 적용 pub: // ca.key가 동일하며 , Public Key와 Subject Key Identifier는 항상동일 04:5d:b2:ef:15:6e:3a:f2:d0:4d:b3:aa:fa:8f:cc: 88:9d:f6:68:4d:e0:93:29:f7:64:44:84:bb:e6:bd: e5:8a:7e:85:18:67:c6:84:b9:a5:67:5a:0e:e7:e9: c5:a9:c9:9b:10:81:c1:4e:ce:65:df:6e:e2:08:cb: 98:3e:af:07:f3 ASN1 OID: prime256v1 NIST CURVE: P-256 X509v3 extensions: // 인증서 확장 X509v3 Subject Key Identifier: // 상위 Public Key의 SHA1 Hash값(20bytes)며, 상위 server.crt 의 Authority Key Id 적용 F1:D2:00:25:AC:FE:65:DD:FC:F1:B7:21:83:C4:90:A9:FB:35:32:AB X509v3 Authority Key Identifier: // Self Sign이므로 Subject Key Id 와 동일 keyid:F1:D2:00:25:AC:FE:65:DD:FC:F1:B7:21:83:C4:90:A9:FB:35:32:AB X509v3 Basic Constraints: critical // 인증서 CA TRUE CA:TRUE Signature Algorithm: ecdsa-with-SHA256 // 인증서 Signature Value (SHA256 적용후 ECDSA 적용) 30:45:02:20:44:9b:11:96:08:45:5f:ba:8e:a1:df:c9:96:aa: 0a:88:7b:90:63:48:cc:ba:57:65:6f:3e:d6:fe:31:84:5c:f4: 02:21:00:f1:a2:3f:c2:5e:40:e5:95:80:cb:cb:53:8c:ee:32: d2:c9:33:85:84:a7:60:a8:c8:d6:21:45:b0:d9:48:b7:32 $ openssl asn1parse -in ca.crt //ASN.1으로 분석가능 (너무길어서 생략) $ openssl asn1parse -in ca.crt -dump //ASN.1 BIT STRING도 보고 싶다면
- CA의 세부사항 확인
//상위 ca.crt의 Public-Key: (256 bit) 값 65(1+32+32) Bytes // 상위 ca.crt의 Public-Key 부분을 ":"로 제거하여 아래와 같이 정리 045db2ef156e3af2d04db3aafa8fcc889df6684de09329f7644484bbe6bde58a7e851867c684b9a5675a0ee7e9c5a9c99b1081c14ece65df6ee208cb983eaf07f3 // 아래 사이트에서 SHA1 Hash 값을 상위 값으로 적용하면 ca.crt의 Subject Key Identifier 와 동일 //ca.crt의 Subject Key Identifier: Public Key 65 bytes SHA1 Hash Value (20bytes, 160bit) f1d20025acfe65ddfcf1b72183c490a9fb3532ab
SHA1 Hash (상위값 적용하면 동일,주의 Input Type: TEXT->HEX사용 )
- CA의 세부항목: Signature Algorithm 의 Signature Value
SHA256를 적용후 256bit가 나온 결과를 ECDSA를 적용하면, R과 S는 나온다고 함
- CA의 Signature 테스트 방법
- CA에서 Public Key 만 추출
- CA의 Private Key 기반으로 Signature 생성
- CA의 Public Key로 검증
상위 2.2 에서 설명한 Certificate Signature 테스트 한 부분과 동일하며 이를 실제로 Server Certificate에서 적용하여 테스트
OpenSSL 를 이용한 인증서의 Signature 테스트
// CA(ca.crt)에서 Public Key 만 추출 $ openssl x509 -pubkey -noout -in ca.crt > ca_pubkey.pem //CA의 Private Key를 이용하여 Sign하여 Signature 생성(sigfile) $ openssl dgst -sha256 -sign ca.key -out sigfile server.crt //간단히 Signature file확인 (실제 인증서 Signature Value 다르며, 상위 에서 생성될때마다 아래의 값이 다름) $ hd sigfile or $ hexdump sigfile //CA의 Public Key(ca_pubkey.pem) 와 Signature(sigfile) 이용하여 간단히 server.crt 검증 $ openssl dgst -verify ca_pubkey.pem -signature sigfile server.crt Verified OK
ECDSA Encrypt/Decrypt 예제
- 관련참고링크사항
openssl x509 manual
https://www.openssl.org/docs/manmaster/man1/openssl-x509.html
openssl asn1parse
https://www.openssl.org/docs/manmaster/man1/openssl-asn1parse.html
X.509 기본구조
https://en.wikipedia.org/wiki/X.509#Structure_of_a_certificate
ECDSA 기반의 CA 와 Certificate 생성방법
https://www.erianna.com/ecdsa-certificate-authorities-and-certificates-with-openssl/