์ด ๋ฌธ์์์๋ ๋ค์์ ๋ค๋ฃน๋๋ค.
์ผ๋ฐ์ ์ผ๋ก ASN.1์ ์ํธํ ์์
์ ๊ถ์ฅํ ๊ฐ์น๊ฐ ์์ต๋๋ค. ASN.1๊ณผ ํด๋น ์ฝ๋ฑ์ ๋ณต์กํฉ๋๋ค. ์ด๋ ์ฝ๋๊ฐ ๋จ์ํ์ง ์์ผ๋ฉฐ ํญ์ ์ถ๊ฐ ๊ณต๊ฒฉ ๋ฒกํฐ๊ฐ ๋๋ค๋ ๊ฒ์ ์๋ฏธํฉ๋๋ค. ๊ทธ๋ฅ ๋ด
ASN.1์ ๋ค์ํ ๋ฐฉ๋ฒ/์ฝ๋ฑ์ผ๋ก ์ธ์ฝ๋ฉ๋ ์ ์์ต๋๋ค.
BER (๊ธฐ๋ณธ ์ธ์ฝ๋ฉ ๊ท์น)CER (ํ์ค ์ธ์ฝ๋ฉ ๊ท์น)NS (๊ตฌ๋ณ ์ธ์ฝ๋ฉ ๊ท์น)GSER (์ผ๋ฐ ๋ฌธ์์ด ์ธ์ฝ๋ฉ ๊ท์น)์ ๋ฅด (JSON ์ธ์ฝ๋ฉ ๊ท์น)- LWER(๊ฒฝ๋ ์ธ์ฝ๋ฉ ๊ท์น)
OER (์ฅํ ์ธ์ฝ๋ฉ ๊ท์น)์ํ (ํจํค์ง ์ธ์ฝ๋ฉ ๊ท์น)- SER(ํน์ ์ธ์ฝ๋ฉ ๊ท์น ์ ํธ ์ ๋ฌ)
์ ์ (XML ์ธ์ฝ๋ฉ ๊ท์น)
๊ทธ๋ฆฌ๊ณ ๋ค๋ฅธ ๋ง์ ์ฌ๋๋ค. ๊ทธ๋ฌ๋ ์ํธํ ์์
์์๋ ์ค์ ๋ก BER๊ณผ DER์ด๋ผ๋ ๋ ๊ฐ์ง๊ฐ ์ฌ์ฉ๋ฉ๋๋ค. ์๋ช
๋ XML ๋ฌธ์์์๋(
BER์ ์ด์ง ๋ฐ์ดํธ ์งํฅ(์: PER, ์ ๋ฃฐ๋ฌ ํต์ ์์ ๋๋ฆฌ ์ฌ์ฉ๋๋ ๋นํธ ์งํฅ) TLV ํ์์ ๋๋ค. ๊ฐ ์์๋ ๋ค์๊ณผ ๊ฐ์ด ์ธ์ฝ๋ฉ๋ฉ๋๋ค. ํ๊ทธ(Tag), ์ธ์ฝ๋ฉํ ์์์ ์ ํ(์ ์, ๋ฌธ์์ด, ๋ ์ง ๋ฑ), ๊ธธ์ด(Length) ์ฝํ ์ธ ์ ์ฝํ ์ธ ์์ฒด(V์๋ฃจ). BER์ ํน๋ณํ ๋ฌดํ ๊ธธ์ด ๊ฐ์ ์ค์ ํ๊ณ End-Of-Octets ํ์๋ก End-Of-Octets ๋ฉ์์ง๋ฅผ ์ข ๋ฃํจ์ผ๋ก์จ ๊ธธ์ด ๊ฐ์ ์ง์ ํ์ง ์๋๋ก ์ ํ์ ์ผ๋ก ํ์ฉํฉ๋๋ค. ๊ธธ์ด ์ธ์ฝ๋ฉ ์ธ์๋ BER์ ๋ค์๊ณผ ๊ฐ์ด ๋ฐ์ดํฐ ์ ํ์ ์ธ์ฝ๋ฉํ๋ ๋ฐฉ์์ ๋ง์ ๊ฐ๋ณ์ฑ์ ๊ฐ์ง๊ณ ์์ต๋๋ค.
- INTEGER, OBJECT IDENTIFIER, BIT STRING ๋ฐ ์์ ๊ธธ์ด๋ ์ ๊ทํ๋์ง ์์ ์ ์์ต๋๋ค(์ต์ ํ์์ผ๋ก ์ธ์ฝ๋ฉ๋์ง ์์).
- BOOLEAN์ XNUMX์ด ์๋ ๋ชจ๋ ์ฝํ ์ธ ์ ๋ํด true์ ๋๋ค.
- BIT STRING์๋ "์ถ๊ฐ" XNUMX๋นํธ๊ฐ ํฌํจ๋ ์ ์์ต๋๋ค.
- BIT STRING, OCTET STRING ๋ฐ ๋ ์ง/์๊ฐ์ ํฌํจํ ๋ชจ๋ ํ์ ๋ฌธ์์ด ์ ํ์ ๊ฐ๋ณ ๊ธธ์ด ์ฒญํฌ๋ก ๋๋ ์ ์์ผ๋ฉฐ, ๊ทธ ๊ธธ์ด๋ (๋)์ธ์ฝ๋ฉ ์ ๋ฏธ๋ฆฌ ์ ์ ์์ต๋๋ค.
- UTCTime/GeneralizedTime์๋ ์๊ฐ๋ ์คํ์ ๊ณผ "์ถ๊ฐ" XNUMX๋ถ์จ ์ด๋ฅผ ์ง์ ํ๋ ๋ค์ํ ๋ฐฉ๋ฒ์ด ์์ ์ ์์ต๋๋ค.
- DEFAULT SEQUENCE ๊ฐ์ ์ธ์ฝ๋ฉ๋๊ฑฐ๋ ์ธ์ฝ๋ฉ๋์ง ์์ ์ ์์ต๋๋ค.
- BIT STRING์ ๋ง์ง๋ง ๋นํธ์ ๋ํ ๋ช ๋ช ๋ ๊ฐ์ ์ ํ์ ์ผ๋ก ์ธ์ฝ๋ฉ๋์ง ์์ ์ ์์ต๋๋ค.
- SEQUENCE(OF)/SET(OF)๋ ์์์ ์์๋ก ์์๋ฅผ ๊ฐ์ง ์ ์์ต๋๋ค.
์์ ๋ชจ๋ ์ด์ ๋ก ์ธํด ๋ฐ์ดํฐ๋ฅผ ์๋ณธ ํ์๊ณผ ๋์ผํ๊ฒ ์ธ์ฝ๋ฉํ๋ ๊ฒ์ด ํญ์ ๊ฐ๋ฅํ ๊ฒ์ ์๋๋๋ค. ๋ฐ๋ผ์ ๊ท์น์ ํ์ ์งํฉ์ด ๊ณ ์๋์์ต๋๋ค. DER - ํ๋์ ์ ํจํ ์ธ์ฝ๋ฉ ๋ฐฉ๋ฒ๋ง ์๊ฒฉํ๊ฒ ๊ท์ ํฉ๋๋ค. ์ด๋ ์๋ฅผ ๋ค์ด ๋นํธ ํ๋๋ฅผ ๋ณ๊ฒฝํ๋ฉด ์๋ช ์ด๋ ์ฒดํฌ์ฌ์ด ๋ฌดํจํ๋๋ ์ํธํ ์์ ์ ์ค์ํฉ๋๋ค. DER์๋ ์ค์ํ ๋จ์ ์ด ์์ต๋๋ค. ๋ชจ๋ ์์์ ๊ธธ์ด๋ ์ธ์ฝ๋ฉ ์ ๋ฏธ๋ฆฌ ์๋ ค์ ธ์ผ ํ๋ฉฐ, ์ด๋ ๋ฐ์ดํฐ์ ์คํธ๋ฆผ ์ง๋ ฌํ๋ฅผ ํ์ฉํ์ง ์์ต๋๋ค. CER ์ฝ๋ฑ์๋ ์ด๋ฌํ ๋จ์ ์ด ์์ผ๋ฉฐ ๋ง์ฐฌ๊ฐ์ง๋ก ๋ฐ์ดํฐ์ ๋ช ํํ ํํ์ ๋ณด์ฅํฉ๋๋ค. ๋ถํํ๊ฒ๋(ํน์ ๋ ๋ณต์กํ ๋์ฝ๋๊ฐ ์๋ค๋ ๊ฒ์ด ๋คํ์ธ ๊ฑธ๊น์?) ์ธ๊ธฐ๋ฅผ ๋์ง ๋ชปํ์ต๋๋ค. ๋ฐ๋ผ์ ์ค์ ๋ก๋ BER ๋ฐ DER ์ธ์ฝ๋ฉ ๋ฐ์ดํฐ๊ฐ "ํผํฉ"๋์ด ์ฌ์ฉ๋๋ ๊ฒฝ์ฐ๊ฐ ์์ต๋๋ค. CER๊ณผ DER์ ๋ชจ๋ BER์ ํ์ ์งํฉ์ด๋ฏ๋ก ๋ชจ๋ BER ๋์ฝ๋๊ฐ ์ด๋ฅผ ์ฒ๋ฆฌํ ์ ์์ต๋๋ค.
pyasn1 ๊ด๋ จ ๋ฌธ์
์ง์ฅ์์ ์ฐ๋ฆฌ๋ ์ํธํ์ ๊ด๋ จ๋ ๋ง์ Python ํ๋ก๊ทธ๋จ์ ์์ฑํฉ๋๋ค. ๊ทธ๋ฆฌ๊ณ ๋ช ๋
์ ์๋ ์ฌ์ค์ ๋ฌด๋ฃ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ ํํ ์ ์์์ต๋๋ค. ์ด๋ ์ ์ ๋ฐ ๊ตฌ์กฐ ํค๋์ ๊ฐ์ด ๊ฐ๋จํ ์ธ์ฝ๋ฉ/๋์ฝ๋ฉํ ์ ์๋ ๋งค์ฐ ๋ฎ์ ์์ค์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ด๊ฑฐ๋ ์ด ๋ผ์ด๋ธ๋ฌ๋ฆฌ์
๋๋ค.
๊ทธ๋ฌ๋ ๋จ์ ๊ณผ ๋ฌธ์ ์ , ํ๊ณ๊ฐ ๋๋ฌ๋ฌ๋ค. ๋ถํํ๊ฒ๋ pyasn1์๋ ์ค๋ฅ๊ฐ ์์๊ณ ์ฌ์ ํ ์์ต๋๋ค. ์ด ๊ธ์ ์ฐ๋ ์์ ์์ pyasn1์ ๊ธฐ๋ณธ ์ ํ ์ค ํ๋๋ GeneralizedTime์
๋๋ค.
์ฐ๋ฆฌ ํ๋ก์ ํธ์์๋ ๊ณต๊ฐ์ ์ ์ฝํ๊ธฐ ์ํด ์ฐธ์กฐํ๋ ค๋ ๊ฐ์ฒด์ ํ์ผ ๊ฒฝ๋ก, ์คํ์ ๋ฐ ๊ธธ์ด(๋ฐ์ดํธ)๋ง ์ ์ฅํ๋ ๊ฒฝ์ฐ๊ฐ ๋ง์ต๋๋ค. ์๋ฅผ ๋ค์ด, ์์์ ์๋ช ๋ ํ์ผ์ CMS SignedData ASN.1 ๊ตฌ์กฐ์ ์์ ๊ฐ๋ฅ์ฑ์ด ๋์ต๋๋ค.
0 [1,3,1018] ContentInfo SEQUENCE
4 [1,1, 9] . contentType: ContentType OBJECT IDENTIFIER 1.2.840.113549.1.7.2 (id_signedData)
19-4 [0,0,1003] . content: [0] EXPLICIT [UNIV 16] ANY
19 [1,3, 999] . . DEFINED BY id_signedData: SignedData SEQUENCE
23 [1,1, 1] . . . version: CMSVersion INTEGER v3 (03)
26 [1,1, 19] . . . digestAlgorithms: DigestAlgorithmIdentifiers SET OF
[...]
47 [1,3, 769] . . . encapContentInfo: EncapsulatedContentInfo SEQUENCE
51 [1,1, 8] . . . . eContentType: ContentType OBJECT IDENTIFIER 1.3.6.1.5.5.7.12.2 (id_cct_PKIData)
65-4 [1,3, 751] . . . . eContent: [0] EXPLICIT OCTET STRING 751 bytes OPTIONAL
ะขะฃะข ะกะะะะ ะะะะะ ะะะะะะกะซะะะะะะะ ะคะะะะ ะ ะะะะะ ะะ 751 ะฑะฐะนั
820 [1,2, 199] . . . signerInfos: SignerInfos SET OF
823 [1,2, 196] . . . . 0: SignerInfo SEQUENCE
826 [1,1, 1] . . . . . version: CMSVersion INTEGER v3 (03)
829 [0,0, 22] . . . . . sid: SignerIdentifier CHOICE subjectKeyIdentifier
[...]
956 [1,1, 64] . . . . . signature: SignatureValue OCTET STRING 64 bytes
. . . . . . C1:B3:88:BA:F8:92:1C:E6:3E:41:9B:E0:D3:E9:AF:D8
. . . . . . 47:4A:8A:9D:94:5D:56:6B:F0:C1:20:38:D2:72:22:12
. . . . . . 9F:76:46:F6:51:5F:9A:8D:BF:D7:A6:9B:FD:C5:DA:D2
. . . . . . F3:6B:00:14:A4:9D:D7:B5:E1:A6:86:44:86:A7:E8:C9
65๋ฐ์ดํธ, 751๋ฐ์ดํธ ๊ธธ์ด์ ์คํ์ ์ผ๋ก ์๋ณธ ์๋ช ๋ ํ์ผ์ ์ป์ ์ ์์ต๋๋ค. pyasn1์ ์ด ์ ๋ณด๋ฅผ ๋์ฝ๋ฉ๋ ๊ฐ์ฒด์ ์ ์ฅํ์ง ์์ต๋๋ค. ์์ TLVSeeker๊ฐ ์์ฑ๋์์ต๋๋ค. ์ธํฐํ์ด์ค์์ "๋ค์ ํ๊ทธ๋ก ์ด๋", "ํ๊ทธ ๋ด๋ถ๋ก ์ด๋"(SEQUENCE ๊ฐ์ฒด ๋ด๋ถ๋ก ์ด๋) ๋ช ๋ น์ ๋ด๋ฆฐ ์ธํฐํ์ด์ค์์ ํ๊ทธ์ ๊ฐ์ฒด ๊ธธ์ด๋ฅผ ๋์ฝ๋ฉํ ์ ์๋ ์์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ๋๋ค. "๋ค์ ํ๊ทธ๋ก ์ด๋", "์คํ์ ๊ณผ ์ฐ๋ฆฌ๊ฐ ์๋ ๊ฐ์ฒด์ ๊ธธ์ด๋ฅผ ์๋ ค์ฃผ์ธ์." ์ด๋ ASN.1 DER ์ง๋ ฌํ๋ ๋ฐ์ดํฐ๋ฅผ "์๋"์ผ๋ก ์ดํด๋ณด๋ ๊ฒ์ ๋๋ค. ๊ทธ๋ฌ๋ ์๋ฅผ ๋ค์ด OCTET STRING ๋ฐ์ดํธ ๋ฌธ์์ด์ด ์ฌ๋ฌ ์ฒญํฌ ํํ๋ก ์ธ์ฝ๋ฉ๋ ์ ์๊ธฐ ๋๋ฌธ์ ์ด๋ฌํ ๋ฐฉ์์ผ๋ก BER ์ง๋ ฌํ๋ ๋ฐ์ดํฐ๋ก ์์ ํ๋ ๊ฒ์ ๋ถ๊ฐ๋ฅํ์ต๋๋ค.
pyasn1 ์์
์ ๋ ๋ค๋ฅธ ๋จ์ ์ ์ฃผ์ด์ง ํ๋๊ฐ SEQUENCE์ ์กด์ฌํ๋์ง ์ฌ๋ถ๋ฅผ ๋์ฝ๋ฉ๋ ๊ฐ์ฒด์์ ์ดํดํ ์ ์๋ค๋ ๊ฒ์
๋๋ค. ์๋ฅผ ๋ค์ด, ๊ตฌ์กฐ์ Field SEQUENCE OF Smth OPTIONAL ํ๋๊ฐ ํฌํจ๋ ๊ฒฝ์ฐ ๋ค์ด์ค๋ ๋ฐ์ดํฐ์ ์์ ํ ์์ ์๋ ์๊ณ (OPTIONAL) ์กด์ฌํ ์๋ ์์ง๋ง ๊ธธ์ด๊ฐ 1์ผ ์ ์์ต๋๋ค(๋น ๋ชฉ๋ก). ์ผ๋ฐ์ ์ผ๋ก ์ด๋ ํ์ธํ ์ ์์ต๋๋ค. ๊ทธ๋ฆฌ๊ณ ์ด๋ ์์ ๋ ๋ฐ์ดํฐ์ ์ ํจ์ฑ์ ์๊ฒฉํ๊ฒ ๊ฒ์ฆํ๋ ๋ฐ ํ์ํฉ๋๋ค. ์ผ๋ถ ์ธ์ฆ ๊ธฐ๊ด์ด ASN.XNUMX ์ฒด๊ณ์ ๊ด์ ์์ "์์ ํ ์ ํจํ์ง ์์" ๋ฐ์ดํฐ๊ฐ ํฌํจ๋ ์ธ์ฆ์๋ฅผ ๋ฐ๊ธํ๋ค๊ณ ์์ํด ๋ณด์ญ์์ค! ์๋ฅผ ๋ค์ด, ์ธ์ฆ ๊ธฐ๊ด "TรRKTRUST Elektronik Sertifika Hizmet Saฤlayฤฑcฤฑsฤฑ"๋ ๋ฃจํธ ์ธ์ฆ์์ ํ์ฉ ํ๊ณ๋ฅผ ์ด๊ณผํ์ต๋๋ค.
๋ ๋ค๋ฅธ ์ ํ์ ํน์ ๊ฐ์ฒด๊ฐ ๊ตฌ์กฐ์ ์ด๋ค ํ์(BER/DER)์ผ๋ก ์ธ์ฝ๋ฉ๋์๋์ง ์ฝ๊ฒ ์์๋ผ ์ ์๋ค๋ ๊ฒ์ ๋๋ค. ์๋ฅผ ๋ค์ด, CMS ํ์ค์์๋ ๋ฉ์์ง๊ฐ BER๋ก ์ธ์ฝ๋ฉ๋์ง๋ง ์ํธํ ์๋ช ์ด ์์ฑ๋๋ signedAttrs ํ๋๋ DER์ ์์ด์ผ ํ๋ค๊ณ ๋ช ์ํฉ๋๋ค. DER๋ก ๋์ฝ๋ฉํ๋ฉด CMS ์์ฒด ์ฒ๋ฆฌ์ ์คํจํ๊ฒ ๋๊ณ , BER๋ก ๋์ฝ๋ฉํ๋ฉด signedAttrs๊ฐ ์ด๋ค ํ์์ธ์ง ์ ์ ์๊ฒ ๋ฉ๋๋ค. ๊ฒฐ๊ณผ์ ์ผ๋ก TLVSeeker(pyasn1์๋ ์๋ ๋ก๊ทธ๊ฐ ์์)๋ ๊ฐ signedAttrs ํ๋์ ์์น๋ฅผ โโ์ฐพ์์ผ ํ๋ฉฐ ๋ณ๋๋ก ์ง๋ ฌํ๋ ํํ์์ ๊ฐ์ ธ์ DER๋ก ๋์ฝ๋ฉํด์ผ ํฉ๋๋ค.
๋งค์ฐ ์์ฃผ ๋ฐ์ํ๋ DEFINED BY ํ๋๋ฅผ ์๋์ผ๋ก ์ฒ๋ฆฌํ๋ ๊ธฐ๋ฅ์ ์ฐ๋ฆฌ์๊ฒ ๋งค์ฐ ๋ฐ๋์งํ์ต๋๋ค. ASN.1 ๊ตฌ์กฐ๋ฅผ ๋์ฝ๋ฉํ ํ์๋ ๊ตฌ์กฐ ํ๋์ ์ง์ ๋ OBJECT IDENTIFIER๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ์ ํํ ์ฒด๊ณ์ ๋ฐ๋ผ ์ถ๊ฐ๋ก ์ฒ๋ฆฌํด์ผ ํ๋ ๋ง์ ANY ํ๋๊ฐ ๋จ์ ์ ์์ต๋๋ค. Python ์ฝ๋์์ ์ด๋ if๋ฅผ ์์ฑํ ๋ค์ ANY ํ๋์ ๋ํด ๋์ฝ๋๋ฅผ ํธ์ถํ๋ ๊ฒ์ ์๋ฏธํฉ๋๋ค.
PyDERASN์ ์ถํ
Atlas์์๋ ๋ฌธ์ ๋ฅผ ๋ฐ๊ฒฌํ๊ฑฐ๋ ์ฌ์ฉํ๋ ๋ฌด๋ฃ ํ๋ก๊ทธ๋จ์ ๊ฐ์ ํ ๋ ์ ๊ธฐ์ ์ผ๋ก ํจ์น๋ฅผ ์๋ถ์ ๋ณด๋ ๋๋ค. ์ฐ๋ฆฌ๋ pyasn1์ ๋ํ ๊ฐ์ ์ฌํญ์ ์ฌ๋ฌ ๋ฒ ์ ์ถํ์ง๋ง pyasn1์ ์ฝ๋๋ ์ดํดํ๊ธฐ ๊ฐ์ฅ ์ฝ์ง ์์๊ณ ๋๋ก๋ ์ฐ๋ฆฌ๋ฅผ ๋นํฉํ๊ฒ ๋ง๋๋ ํธํ๋์ง ์๋ API ๋ณ๊ฒฝ ์ฌํญ์ด ์์์ต๋๋ค. ๊ฒ๋ค๊ฐ ์ฐ๋ฆฌ๋ pyasn1์์๋ ๊ทธ๋ ์ง ์์๋ ์์ฑ ํ ์คํธ๋ฅผ ์ฌ์ฉํ์ฌ ํ ์คํธ๋ฅผ ์์ฑํ๋ ๋ฐ ์ต์ํฉ๋๋ค.
์ด๋ ์ข์ ๋ , ๋๋ ๊ทธ๊ฒ์ผ๋ก ์ถฉ๋ถํ๋ค๊ณ ํ๋จํ๊ณ __slot__s, ์คํ์ ๋ฐ ์๋ฆ๋ต๊ฒ ํ์๋ blob์ ์ฌ์ฉํ์ฌ ๋๋ง์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์์ฑํด ๋ณผ ์๊ฐ์ด์์ต๋๋ค! ๋จ์ํ ASN.1 ์ฝ๋ฑ์ ๋ง๋๋ ๊ฒ๋ง์ผ๋ก๋ ์ถฉ๋ถํ์ง ์์ต๋๋ค. ๋ชจ๋ ์ข ์ ํ๋ก์ ํธ๋ฅผ ํด๋น ์ฝ๋ฑ์ผ๋ก ์ ์กํด์ผ ํ๋ฉฐ ์ด๋ ASN.1 ๊ตฌ์กฐ ์์ ์ผ๋ก ๊ฐ๋ ์ฐฌ ์์ญ๋ง ์ค์ ์ฝ๋์ ๋๋ค. ์ฆ, ํ์ฌ pyasn1 ์ฝ๋์ ๋ฒ์ญ ์ฉ์ด์ฑ์ด ์๊ตฌ ์ฌํญ ์ค ํ๋์ ๋๋ค. ํด๊ฐ๋ฅผ ๋ชจ๋ ๋ณด๋ธ ํ ์ด ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์์ฑํ๊ณ ๋ชจ๋ ํ๋ก์ ํธ๋ฅผ ์ด ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ก ์ฎ๊ฒผ์ต๋๋ค. ํ ์คํธ๊ฐ ๊ฑฐ์ 100% ์ ์ฉ๋๋ฏ๋ก ์ด๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๊ฐ ์๋ฒฝํ๊ฒ ์๋ํ๋ค๋ ๊ฒ์ ์๋ฏธํฉ๋๋ค.
๋ง์ฐฌ๊ฐ์ง๋ก PyDERASN์ ๊ฑฐ์ 100% ํ
์คํธ ๋ฒ์๋ฅผ ๊ฐ์ต๋๋ค. ํ๋ฅญํ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ํจ๊ป ์์ฑ ํ
์คํธ๋ฅผ ์ฌ์ฉํฉ๋๋ค.
์์ ์๋ฆฌ๋ pyasn1๊ณผ ์ ์ฌํฉ๋๋ค. ์ฆ, ์์ ์์ค Python ๊ฐ์ฒด๋ก ์์ ํฉ๋๋ค. ASN.1 ์ฒด๊ณ์ ๋ํ ์ค๋ช ์ ์ ์ฌํฉ๋๋ค.
class TBSCertificate(Sequence):
schema = (
("version", Version(expl=tag_ctxc(0), default="v1")),
("serialNumber", CertificateSerialNumber()),
("signature", AlgorithmIdentifier()),
("issuer", Name()),
("validity", Validity()),
("subject", Name()),
("subjectPublicKeyInfo", SubjectPublicKeyInfo()),
("issuerUniqueID", UniqueIdentifier(impl=tag_ctxp(1), optional=True)),
("subjectUniqueID", UniqueIdentifier(impl=tag_ctxp(2), optional=True)),
("extensions", Extensions(expl=tag_ctxc(3), optional=True)),
)
๊ทธ๋ฌ๋ PyDERASN์ ๊ฐ๋ ฅํ ํ์ดํ๊ณผ ์ ์ฌํฉ๋๋ค. pyasn1์์ ํ๋๊ฐ CMSVersion(INTEGER) ์ ํ์ธ ๊ฒฝ์ฐ int ๋๋ INTEGER๋ก ํ ๋น๋ ์ ์์ต๋๋ค. PyDERASN์์๋ ํ ๋น๋ ๊ฐ์ฒด๊ฐ ์ ํํ CMSVersion์ด์ด์ผ ํฉ๋๋ค. Python3 ์ฝ๋๋ฅผ ์์ฑํ๋ ๊ฒ ์ธ์๋ ์ฐ๋ฆฌ๋ ๋ค์์ ์ฌ์ฉํฉ๋๋ค.
๋์์ PyDERASN์ ์ด๋ฌํ ํ์ดํ์ ๋ํด ๋งค์ฐ ํธ๋ฆฌํ ๊ธฐ๋ฅ์ ์ ๊ณตํฉ๋๋ค. pyasn1์ SubjectKeyIdentifier().subtype(implicitTag=Tag(...)) ํ๋๊ฐ ๊ฐ์ฒด๋ฅผ SubjectKeyIdentifier()์ ํ ๋นํ๋ ๊ฒ์ ํ์ฉํ์ง ์์์ผ๋ฉฐ(ํ์ํ IMPLICIT ํ๊ทธ ์์ด) ์ข ์ข ๊ฐ์ฒด๋ฅผ ๋ณต์ฌํ๊ณ ์ฌ์์ฑํด์ผ ํ์ต๋๋ค. ๋ณ๊ฒฝ๋ IMPLICIT/EXPLICIT ํ๊ทธ. PyDERASN์ ๊ธฐ๋ณธ ์ ํ๋ง ์๊ฒฉํ๊ฒ ์ค์ํฉ๋๋ค. ๊ตฌ์กฐ์ ๊ธฐ์กด ASN.1 ์คํค๋ง์์ ํ๊ทธ๋ฅผ ์๋์ผ๋ก ๋์ฒดํฉ๋๋ค. ์ด๋ ์ ํ๋ฆฌ์ผ์ด์ ์ฝ๋๋ฅผ ํฌ๊ฒ ๋จ์ํํฉ๋๋ค.
๋์ฝ๋ฉ ์ค์ ์ค๋ฅ๊ฐ ๋ฐ์ํ๋ฉด pyasn1์์๋ ์ค๋ฅ๊ฐ ๋ฐ์ํ ์์น๋ฅผ ์ ํํ ์ดํดํ๊ธฐ๊ฐ ์ฝ์ง ์์ต๋๋ค. ์๋ฅผ ๋ค์ด ์์์ ์ด๋ฏธ ์ธ๊ธํ ํฐํค ์ธ์ฆ์์์๋ ๋ค์ ์ค๋ฅ๊ฐ ๋ฐ์ํฉ๋๋ค. UTF8String (tbsCertificate:issuer:rdnSequence:3:0:value:DEFINED BY 2.5.4.10:utf8String) (at 138) unsatisfiedbounds: 1 โ 77 โ 64 ASN .1 ๊ตฌ์กฐ๋ฅผ ์์ฑํ ๋ ์ฌ๋๋ค์ ์ค์ํ ์ ์์ผ๋ฉฐ, ์ด๋ก ์ธํด ์์ฉ ํ๋ก๊ทธ๋จ์ ๋๋ฒ๊ทธํ๊ฑฐ๋ ์๋๋ฐฉ์ ์ฝ๋ฉ๋ ๋ฌธ์์ ๋ํ ๋ฌธ์ ๋ฅผ ํ์ ํ๊ธฐ๊ฐ ๋ ์ฌ์์ง๋๋ค.
PyDERASN์ ์ฒซ ๋ฒ์งธ ๋ฒ์ ์ BER ์ธ์ฝ๋ฉ์ ์ง์ํ์ง ์์์ต๋๋ค. ํจ์ฌ ๋์ค์ ๋ฑ์ฅํ์ง๋ง ์ฌ์ ํ ์๊ฐ๋๋ฅผ ์ฌ์ฉํ UTCTime/GeneralizedTime ์ฒ๋ฆฌ๋ฅผ ์ง์ํ์ง ์์ต๋๋ค. ์ด ํ๋ก์ ํธ๋ ์ฃผ๋ก ์ฌ๊ฐ ์๊ฐ์ ์์ฑ๋๊ธฐ ๋๋ฌธ์ ์์ผ๋ก๋ ์ด๋ฐ ์ผ์ด ์ผ์ด๋ ๊ฒ์ ๋๋ค.
๋ํ ์ฒซ ๋ฒ์งธ ๋ฒ์ ์์๋ DEFINED BY ํ๋์ ๋ํ ์์
์ด ์์์ต๋๋ค. ๋ช ๋ฌ ๋ค ์ด
class ContentInfo(Sequence):
schema = (
("contentType", ContentType(defines=((("content",), {
id_authenticatedData: AuthenticatedData(),
id_digestedData: DigestedData(),
id_encryptedData: EncryptedData(),
id_envelopedData: EnvelopedData(),
id_signedData: SignedData(),
}),))),
("content", Any(expl=tag_ctxc(0))),
)
contentType์ ๊ฐ์ด id_signedData์ธ OID๊ฐ ํฌํจ๋ ๊ฒฝ์ฐ ์ฝํ ์ธ ํ๋(๋์ผํ SEQUENCE์ ์์น)๋ SignedData ๊ตฌ์ฑํ์ ๋ฐ๋ผ ๋์ฝ๋ฉ๋์ด์ผ ํฉ๋๋ค. ์ ์ด๋ ๊ฒ ๊ดํธ๊ฐ ๋ง์? EnvelopedData ๊ตฌ์กฐ์ ๊ฒฝ์ฐ์ฒ๋ผ ํ๋๋ ๋์์ ์ฌ๋ฌ ํ๋๋ฅผ "์ ์"ํ ์ ์์ต๋๋ค. ์ ์๋ ํ๋๋ ์์ ๋์ฝ๋ ๊ฒฝ๋ก๋ก ์๋ณ๋ฉ๋๋ค. ์ด๋ ๋ชจ๋ ๊ตฌ์กฐ์ ์๋ ๋ชจ๋ ์์์ ์ ํํ ์์น๋ฅผ ์ง์ ํฉ๋๋ค.
์ด๋ฌํ ์ ์๋ฅผ ๋ค์ด์ด๊ทธ๋จ์ ์ฆ์ ์ถ๊ฐํ ์ ์๋ ๊ธฐํ๊ฐ ํญ์ ์ํ์ง ์๊ฑฐ๋ ํญ์ ์๋ ๊ฒ์ ์๋๋๋ค. OID์ ๊ตฌ์กฐ๊ฐ ํ์ฌ ํ๋ก์ ํธ์๋ง ์๋ ค์ง ์ ํ๋ฆฌ์ผ์ด์ ๋ณ ์ฌ๋ก๊ฐ ์์ ์ ์์ต๋๋ค. PyDERASN์ ๊ตฌ์กฐ๋ฅผ ๋์ฝ๋ฉํ ๋ ๋ฐ๋ก ์ด๋ฌํ ์ ์๋ฅผ ์ค์ ํ๋ ๊ธฐ๋ฅ์ ์ ๊ณตํฉ๋๋ค.
ContentInfo().decode(data, ctx={"defines_by_path": ((
(
"content", DecodePathDefBy(id_signedData),
"certificates", any, "certificate", "tbsCertificate",
"extensions", any, "extnID",
),
((("extnValue",), {
id_ce_authorityKeyIdentifier: AuthorityKeyIdentifier(),
id_ce_basicConstraints: BasicConstraints(),
[...]
id_ru_subjectSignTool: SubjectSignTool(),
}),),
),)})
์ฌ๊ธฐ์๋ ์ฒจ๋ถ๋ ๋ชจ๋ ์ธ์ฆ์์ ๋ํ CMS SignedData์์ ๋ชจ๋ ํ์ฅ(AuthorityKeyIdentifier, BasicConstraints, SubjectSignTool ๋ฑ)์ ๋์ฝ๋ฉํ๋ค๊ณ ๋งํฉ๋๋ค. ๋ง์น ์คํค๋ง์ ์ง์ ๋ ๊ฒ์ฒ๋ผ ์ ์๋ก "๋์ฒด"ํด์ผ ํ๋ ์์๋ฅผ ๋์ฝ๋ ๊ฒฝ๋ก๋ฅผ ํตํด ๋ํ๋ ๋๋ค.
๋ง์ง๋ง์ผ๋ก PyDERASN์๋ ๋ค์์์ ์คํํ ์ ์๋ ๊ธฐ๋ฅ์ด ์์ต๋๋ค.
ํ์๋๋ ์ ๋ณด: ๊ฐ์ฒด ์คํ์
, ํ๊ทธ ๊ธธ์ด, ๊ธธ์ด ๊ธธ์ด, ์ฝํ
์ธ ๊ธธ์ด, EOC ์กด์ฌ ์ฌ๋ถ(์ฅํ
๋), BER ์ธ์ฝ๋ฉ ์์ฑ, ๋ฌดํ ๊ธธ์ด ์ธ์ฝ๋ฉ ์์ฑ, EXPLICIT ํ๊ทธ์ ๊ธธ์ด ๋ฐ ์คํ์
(์๋ ๊ฒฝ์ฐ), ์ค์ฒฉ ๊น์ด ๊ตฌ์กฐ์ ๊ฐ์ฒด, IMPLICIT/EXPLICIT ํ๊ทธ ๊ฐ, ์ฒด๊ณ์ ๋ฐ๋ฅธ ๊ฐ์ฒด ์ด๋ฆ, ๊ธฐ๋ณธ ASN.1 ์ ํ, SEQUENCE/SET OF ๋ด๋ถ์ ์ํ์ค ๋ฒํธ, CHOICE ๊ฐ(์๋ ๊ฒฝ์ฐ), ์ฌ๋์ด ์ฝ์ ์ ์๋ ์ด๋ฆ INTEGER/ENUMERATED/BIT STRING ์ฒด๊ณ์ ๋ฐ๋ฅธ ๋ชจ๋ ๊ธฐ๋ณธ ์ ํ์ ๊ฐ, ์ฒด๊ณ์ DEFAULT/OPTIONAL ํ๋๊ทธ, ๊ฐ์ฒด๊ฐ ์๋์ผ๋ก DEFINED BY๋ก ๋์ฝ๋ฉ๋์๋ค๋ ํ์ ๋ฐ ์ด๋ฌํ ์ผ์ด ๋ฐ์ํ OID๋ก ์ธํด ์ฌ๋์ด ์ฝ์ ์ ์๋ OID.
์์ ์ธ์ ์์คํ
์ ๋ณ๋์ ์๋จ์ ์ฌ์ฉํ์ฌ ์๊ฐํ๋๋ ์ผ๋ จ์ PP ๊ฐ์ฒด๋ฅผ ์์ฑํ๋๋ก ํน๋ณํ ์ค๊ณ๋์์ต๋๋ค. ์คํฌ๋ฆฐ์ท์ ๊ฐ๋จํ ์์์ ํ
์คํธ๋ก ๋ ๋๋ฌ๋ฅผ ๋ณด์ฌ์ค๋๋ค. JSON/HTML ํ์์ ๋ ๋๋ฌ๋ ์์ผ๋ฏ๋ก ๋ค์๊ณผ ๊ฐ์ด ASN.1 ๋ธ๋ผ์ฐ์ ์์ ๊ฐ์กฐ ํ์ํ์ฌ ๋ณผ ์ ์์ต๋๋ค.
๊ธฐํ ๋์๊ด
์ด๊ฒ์ด ๋ชฉํ๋ ์๋์์ง๋ง PyDERASN์ ํฌ๊ฒ ๋ํ๋ฌ์ต๋๋ค
์ฐ๋ฆฌ๋ ์ ๊ฐ ์ธ๊ธํ asn1crypto๋ฅผ ๊ณ ๋ คํ์ง ์์์ต๋๋ค. ์๋ํ๋ฉด ํ๋ก์ ํธ๊ฐ ์์ง ์ด๊ธฐ ๋จ๊ณ์ ์์๊ณ ์ด์ ๋ํด ๋ค์ด๋ณธ ์ ์ด ์์๊ธฐ ๋๋ฌธ์ ๋๋ค. ์ด์ ์ฐ๋ฆฌ๋ ๋์ผํ GeneralizedTime์ด ์์์ ํ์์ ์ทจํ์ง ์๊ณ ์ง๋ ฌํ ์ค์ ์๋์ผ๋ก ๋ช ๋ถ์ 509์ด๋ฅผ ์ ๊ฑฐํ๋ค๋ ๊ฒ์ ์ฆ์ ๋ฐ๊ฒฌํ๊ธฐ ๋๋ฌธ์ ๊ทธ์ ๋ฐฉํฅ์ ๋ณด์ง ์์ ๊ฒ์ ๋๋ค. ์ด๋ X.XNUMX ์ธ์ฆ์ ์์ ์๋ ํ์ฉ๋์ง๋ง ์ผ๋ฐ์ ์ผ๋ก ์๋ํ์ง ์์ต๋๋ค.
ํ์ฌ PyDERASN์ ์ ๊ฐ ์๋ ๊ฐ์ฅ ์๊ฒฉํ ๋ฌด๋ฃ Python/Go DER ๋์ฝ๋์
๋๋ค. ๋ด๊ฐ ์ฌ๋ํ๋ Go์ ์ธ์ฝ๋ฉ/asn1 ๋ผ์ด๋ธ๋ฌ๋ฆฌ์์
ํ๋ก์ ํธ ์ฝ๋๋ ์ต๋ํ ๋จ์ํ๊ฒ ๋ง๋ค๋ ค๊ณ ๋ ธ๋ ฅํฉ๋๋ค. ์ ์ฒด ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ ํ๋์ ํ์ผ์ ๋๋ค. ๋ถํ์ํ ์ฑ๋ฅ ์ต์ ํ์ DRY ์ฝ๋๋ฅผ ๋ฐฐ์ ํ๊ณ ์ดํด์ ์ฉ์ด์ฑ์ ์ค์ ์ ๋๊ณ ์ฝ๋๋ฅผ ์์ฑํ์ต๋๋ค. ์ด๋ฏธ ๋งํ๋ฏ์ด UTCTime/GeneralizedTime ๋ฌธ์์ด์ ๋ฌผ๋ก REAL, RELATIVE OID, EXTERNAL, INSTANCE OF, EMBEDDED PDV, CHARACTER STRING ๋ฐ์ดํฐ ์ ํ์ ์ ์ฒด BER ๋์ฝ๋ฉ์ ์ง์ํ์ง ์์ต๋๋ค. ๋ค๋ฅธ ๋ชจ๋ ๊ฒฝ์ฐ์๋ ๊ฐ์ธ์ ์ผ๋ก Python์์ ๋ค๋ฅธ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ด ์๋ฏธ๊ฐ ์๋ค๊ณ ์๊ฐํฉ๋๋ค.
๋ด ๋ชจ๋ ํ๋ก์ ํธ์ฒ๋ผ
์ถ์ฒ : habr.com