PyDERASN: ์Šฌ๋กฏ๊ณผ ๋ธ”๋กญ์ด ์žˆ๋Š” ASN.1 ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์ž‘์„ฑํ•œ ๋ฐฉ๋ฒ•

ASN.1 ์ด๋Š” ๊ตฌ์กฐํ™”๋œ ์ •๋ณด๋ฅผ ์„ค๋ช…ํ•˜๋Š” ์–ธ์–ด์˜ ํ‘œ์ค€(ISO, ITU-T, GOST)์ด์ž ์ด ์ •๋ณด๋ฅผ ์ธ์ฝ”๋”ฉํ•˜๋Š” ๊ทœ์น™์ž…๋‹ˆ๋‹ค. ํ”„๋กœ๊ทธ๋ž˜๋จธ์ธ ๋‚˜์—๊ฒŒ ์ด๋Š” JSON, XML, XDR ๋“ฑ๊ณผ ํ•จ๊ป˜ ๋ฐ์ดํ„ฐ๋ฅผ ์ง๋ ฌํ™”ํ•˜๊ณ  ํ‘œ์‹œํ•˜๋Š” ๋˜ ๋‹ค๋ฅธ ํ˜•์‹์ผ ๋ฟ์ž…๋‹ˆ๋‹ค. ์ด๋Š” ์ผ์ƒ ์ƒํ™œ์—์„œ ๋งค์šฐ ํ”ํ•˜๋ฉฐ ์…€๋ฃฐ๋Ÿฌ, ์ „ํ™”, VoIP ํ†ต์‹ (UMTS, LTE, WiMAX, SS7, H.323), ๋„คํŠธ์›Œํฌ ํ”„๋กœํ† ์ฝœ(LDAP, SNMP, Kerberos) ๋“ฑ ๋ชจ๋“  ๋ถ„์•ผ์—์„œ ๋งŽ์€ ์‚ฌ๋žŒ๋“ค์ด ์ง๋ฉดํ•ฉ๋‹ˆ๋‹ค. ์•”ํ˜ธํ™”(X.509, CMS, PKCS ํ‘œ์ค€), ์€ํ–‰ ์นด๋“œ ๋ฐ ์ƒ์ฒด ์ธ์‹ ์—ฌ๊ถŒ ๋“ฑ์— ๊ด€ํ•œ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์ด ๋ฌธ์„œ์—์„œ๋Š” ๋‹ค์Œ์„ ๋‹ค๋ฃน๋‹ˆ๋‹ค. ํ”ผ๋ฐ๋ผ์ŠคN: Python ASN.1 ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋Š” ์•”ํ˜ธํ™” ๊ด€๋ จ ํ”„๋กœ์ ํŠธ์—์„œ ํ™œ๋ฐœํžˆ ์‚ฌ์šฉ๋˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ์•„ํ‹€๋ผ์Šค.

PyDERASN: ์Šฌ๋กฏ๊ณผ ๋ธ”๋กญ์ด ์žˆ๋Š” ASN.1 ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์ž‘์„ฑํ•œ ๋ฐฉ๋ฒ•
์ผ๋ฐ˜์ ์œผ๋กœ ASN.1์€ ์•”ํ˜ธํ™” ์ž‘์—…์— ๊ถŒ์žฅํ•  ๊ฐ€์น˜๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. ASN.1๊ณผ ํ•ด๋‹น ์ฝ”๋ฑ์€ ๋ณต์žกํ•ฉ๋‹ˆ๋‹ค. ์ด๋Š” ์ฝ”๋“œ๊ฐ€ ๋‹จ์ˆœํ•˜์ง€ ์•Š์œผ๋ฉฐ ํ•ญ์ƒ ์ถ”๊ฐ€ ๊ณต๊ฒฉ ๋ฒกํ„ฐ๊ฐ€ ๋œ๋‹ค๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ƒฅ ๋ด ๋ชฉ๋ก์— ASN.1 ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์˜ ์ทจ์•ฝ์ . ๋ธŒ๋ฃจ์Šค ์Šˆ๋‚˜์ด์–ด๋Š” ๊ทธ์˜ ์•”ํ˜ธํ™”๊ณตํ•™ ๋˜ํ•œ ๋ณต์žก์„ฑ ๋•Œ๋ฌธ์— ์ด ํ‘œ์ค€์„ ์‚ฌ์šฉํ•˜์ง€ ๋ง๋ผ๊ณ  ์กฐ์–ธํ•ฉ๋‹ˆ๋‹ค. "๊ฐ€์žฅ ์ž˜ ์•Œ๋ ค์ง„ TLV ์ธ์ฝ”๋”ฉ์€ ASN.1์ด์ง€๋งŒ ์ด๋Š” ์—„์ฒญ๋‚˜๊ฒŒ ๋ณต์žกํ•˜๋ฏ€๋กœ ์šฐ๋ฆฌ๋Š” ์ด๋ฅผ ๊ธฐํ”ผํ•ฉ๋‹ˆ๋‹ค." ํ•˜์ง€๋งŒ ์•ˆํƒ€๊น๊ฒŒ๋„ ์˜ค๋Š˜์€ ๊ณต๊ฐœ ํ‚ค ์ธํ”„๋ผ ์ ๊ทน์ ์œผ๋กœ ์‚ฌ์šฉ๋˜๋Š” ๊ณณ X.509 ์ธ์ฆ์„œ, CRL, OCSP, TSP, CMP ํ”„๋กœํ† ์ฝœ, CMC, ๋ฉ”์‹œ์ง€ CMS, ๊ทธ๋ฆฌ๊ณ  ๋งŽ์€ ํ‘œ์ค€ PKCS. ๋”ฐ๋ผ์„œ ์•”ํ˜ธํ™”์™€ ๊ด€๋ จ๋œ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๋Š” ๊ฒฝ์šฐ ASN.1์„ ์‚ฌ์šฉํ•˜์—ฌ ์ž‘์—…ํ•  ์ˆ˜ ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

ASN.1์€ ๋‹ค์–‘ํ•œ ๋ฐฉ๋ฒ•/์ฝ”๋ฑ์œผ๋กœ ์ธ์ฝ”๋”ฉ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

  • BER (๊ธฐ๋ณธ ์ธ์ฝ”๋”ฉ ๊ทœ์น™)
  • CER (ํ‘œ์ค€ ์ธ์ฝ”๋”ฉ ๊ทœ์น™)
  • NS (๊ตฌ๋ณ„ ์ธ์ฝ”๋”ฉ ๊ทœ์น™)
  • GSER (์ผ๋ฐ˜ ๋ฌธ์ž์—ด ์ธ์ฝ”๋”ฉ ๊ทœ์น™)
  • ์ œ๋ฅด (JSON ์ธ์ฝ”๋”ฉ ๊ทœ์น™)
  • LWER(๊ฒฝ๋Ÿ‰ ์ธ์ฝ”๋”ฉ ๊ทœ์น™)
  • OER (์˜ฅํ…Ÿ ์ธ์ฝ”๋”ฉ ๊ทœ์น™)
  • ์œ„ํ•œ (ํŒจํ‚ค์ง€ ์ธ์ฝ”๋”ฉ ๊ทœ์น™)
  • SER(ํŠน์ • ์ธ์ฝ”๋”ฉ ๊ทœ์น™ ์‹ ํ˜ธ ์ „๋‹ฌ)
  • ์ œ์ž (XML ์ธ์ฝ”๋”ฉ ๊ทœ์น™)

๊ทธ๋ฆฌ๊ณ  ๋‹ค๋ฅธ ๋งŽ์€ ์‚ฌ๋žŒ๋“ค. ๊ทธ๋Ÿฌ๋‚˜ ์•”ํ˜ธํ™” ์ž‘์—…์—์„œ๋Š” ์‹ค์ œ๋กœ BER๊ณผ DER์ด๋ผ๋Š” ๋‘ ๊ฐ€์ง€๊ฐ€ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค. ์„œ๋ช…๋œ XML ๋ฌธ์„œ์—์„œ๋„(XMLDSig, XAdES) JSON ์ง€ํ–ฅ ํ”„๋กœํ† ์ฝœ์—์„œ์™€ ๊ฐ™์ด ์—ฌ์ „ํžˆ Base64๋กœ ์ธ์ฝ”๋”ฉ๋œ ASN.1 DER ๊ฐœ์ฒด๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ์ ˆ์ • Let's Encrypt์—์„œ. ๊ธฐ์‚ฌ์™€ ์ฑ…์—์„œ ์ด๋Ÿฌํ•œ ๋ชจ๋“  ์ฝ”๋ฑ๊ณผ BER/CER/DER ์ฝ”๋”ฉ ์›์น™์„ ๋” ์ž˜ ์ดํ•ดํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ฐ„๋‹จํ•œ ๋‹จ์–ด๋กœ ASN.1, ASN.1 โ€” Olivier Dubuisson์˜ ์ด๊ธฐ์ข… ์‹œ์Šคํ…œ ๊ฐ„ ํ†ต์‹ , ASN.1 John Larmouth ๊ต์ˆ˜ ์ž‘์„ฑ.

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 ํ”„๋กœ๊ทธ๋žจ์„ ์ž‘์„ฑํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๋ช‡ ๋…„ ์ „์—๋Š” ์‚ฌ์‹ค์ƒ ๋ฌด๋ฃŒ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์„ ํƒํ•  ์ˆ˜ ์—†์—ˆ์Šต๋‹ˆ๋‹ค. ์ด๋Š” ์ •์ˆ˜ ๋ฐ ๊ตฌ์กฐ ํ—ค๋”์™€ ๊ฐ™์ด ๊ฐ„๋‹จํžˆ ์ธ์ฝ”๋”ฉ/๋””์ฝ”๋”ฉํ•  ์ˆ˜ ์žˆ๋Š” ๋งค์šฐ ๋‚ฎ์€ ์ˆ˜์ค€์˜ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์ด๊ฑฐ๋‚˜ ์ด ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์ž…๋‹ˆ๋‹ค. ํ„์Šค1. ์šฐ๋ฆฌ๋Š” ๋ช‡ ๋…„ ๋™์•ˆ ์ด ์ž‘์—…์„ ์ˆ˜ํ–‰ํ–ˆ์œผ๋ฉฐ ์ฒ˜์Œ์—๋Š” ์ƒ์œ„ ์ˆ˜์ค€ ๊ฐœ์ฒด์™€ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ASN.1 ๊ตฌ์กฐ๋กœ ์ž‘์—…ํ•  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ๋งค์šฐ ๊ธฐ๋ปค์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, ๋””์ฝ”๋”ฉ๋œ X.509 ์ธ์ฆ์„œ ๊ฐœ์ฒด๋ฅผ ํ†ตํ•ด ํ•ด๋‹น ํ•„๋“œ์— ์•ก์„ธ์Šคํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์‚ฌ์ „ ์ธํ„ฐํŽ˜์ด์Šค: cert[โ€œtbsCertificateโ€] ["serialNumber"]๋Š” ์ด ์ธ์ฆ์„œ์˜ ์ผ๋ จ ๋ฒˆํ˜ธ๋ฅผ ํ‘œ์‹œํ•ฉ๋‹ˆ๋‹ค. ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ๋ณต์žกํ•œ ๊ฐ์ฒด๋ฅผ ๋ชฉ๋ก, ์‚ฌ์ „์œผ๋กœ ์ž‘์—…ํ•˜์—ฌ "์กฐ๋ฆฝ"ํ•œ ๋‹ค์Œ pyasn1.codec.der.encoder.encode ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•˜๊ณ  ๋ฌธ์„œ์˜ ์ง๋ ฌํ™”๋œ ํ‘œํ˜„์„ ์–ป์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๊ทธ๋Ÿฌ๋‚˜ ๋‹จ์ ๊ณผ ๋ฌธ์ œ์ , ํ•œ๊ณ„๊ฐ€ ๋“œ๋Ÿฌ๋‚ฌ๋‹ค. ๋ถˆํ–‰ํ•˜๊ฒŒ๋„ 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ฤฑ"๋Š” ๋ฃจํŠธ ์ธ์ฆ์„œ์˜ ํ—ˆ์šฉ ํ•œ๊ณ„๋ฅผ ์ดˆ๊ณผํ–ˆ์Šต๋‹ˆ๋‹ค. RFC 5280 ๋Œ€์ƒ ๊ตฌ์„ฑ ์š”์†Œ์˜ ๊ธธ์ด์— ๋Œ€ํ•œ ์ œํ•œ - ๊ตฌ์„ฑํ‘œ์— ๋”ฐ๋ผ ์ •์งํ•˜๊ฒŒ ๋””์ฝ”๋”ฉํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. DER ์ฝ”๋ฑ์€ ๊ฐ’์ด DEFAULT์™€ ๋™์ผํ•œ ํ•„๋“œ๊ฐ€ ์ „์†ก ์ค‘์— ์ธ์ฝ”๋”ฉ๋˜์ง€ ์•Š๋„๋ก ์š”๊ตฌํ•ฉ๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ๋ฌธ์„œ๋Š” ์‹ค์ œ๋กœ ๋ฐœ์ƒํ•˜๋ฉฐ PyDERASN์˜ ์ฒซ ๋ฒˆ์งธ ๋ฒ„์ „์€ ์˜๋„์ ์œผ๋กœ ์ด๋Ÿฌํ•œ ์œ ํšจํ•˜์ง€ ์•Š์€(DER ๊ด€์ ์—์„œ ๋ณผ ๋•Œ) ๋™์ž‘์„ ํ—ˆ์šฉํ•˜๊ธฐ๋„ ํ–ˆ์Šต๋‹ˆ๋‹ค. ํ•˜์œ„ ํ˜ธํ™˜์„ฑ.

๋˜ ๋‹ค๋ฅธ ์ œํ•œ์€ ํŠน์ • ๊ฐ์ฒด๊ฐ€ ๊ตฌ์กฐ์— ์–ด๋–ค ํ˜•์‹(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% ํ…Œ์ŠคํŠธ ๋ฒ”์œ„๋ฅผ ๊ฐ–์Šต๋‹ˆ๋‹ค. ํ›Œ๋ฅญํ•œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์™€ ํ•จ๊ป˜ ์ƒ์„ฑ ํ…Œ์ŠคํŠธ๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ๊ฐ€์„ค. ์‹ค์‹œ๋˜๊ธฐ๋„ ํ–ˆ์Šต๋‹ˆ๋‹ค ํผ์ง€ py-afl- ๋‚˜๋Š” 32๊ฐœ์˜ ํ•ต๊ธฐ๊ณ„๋ฅผ ๋จน์–ด์š”. ์‹ค์ œ๋กœ Python2 ์ฝ”๋“œ๊ฐ€ ์ „ํ˜€ ๋‚จ์ง€ ์•Š์•˜์Œ์—๋„ ๋ถˆ๊ตฌํ•˜๊ณ  PyDERASN์€ ์—ฌ์ „ํžˆ โ€‹โ€‹PythonXNUMX ์ฝ”๋“œ์™€์˜ ํ˜ธํ™˜์„ฑ์„ ์œ ์ง€ํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ์—ฌ์„ฏ ํƒ๋‹‰. ๊ฒŒ๋‹ค๊ฐ€, ๊ทธ๊ฒƒ์€ ํ…Œ์ŠคํŠธ๋ฅผ ๊ฑฐ์ณค์Šต๋‹ˆ๋‹ค. ASN.1:2008 ๊ทœ์ • ์ค€์ˆ˜ ํ…Œ์ŠคํŠธ ๋ชจ์Œ.

์ž‘์—… ์›๋ฆฌ๋Š” 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 ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜๋Š” ๊ฒƒ ์™ธ์—๋„ ์šฐ๋ฆฌ๋Š” ๋‹ค์Œ์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ์ฃผ์„ ์ž…๋ ฅ, ๋”ฐ๋ผ์„œ ์šฐ๋ฆฌ ํ•จ์ˆ˜์—๋Š” def func(serial,contents)์™€ ๊ฐ™์€ ๋ชจํ˜ธํ•œ ์ธ์ˆ˜๊ฐ€ ์—†์ง€๋งŒ def func(serial: CertificateSerialNumber, content: EncapsulatedContentInfo) ๋ฐ PyDERASN์€ ์ด๋Ÿฌํ•œ ์ฝ”๋“œ๋ฅผ ์œ ์ง€ํ•˜๋Š” ๋ฐ ๋„์›€์ด ๋ฉ๋‹ˆ๋‹ค.

๋™์‹œ์— 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 ํ•„๋“œ์— ๋Œ€ํ•œ ์ž‘์—…์ด ์—†์—ˆ์Šต๋‹ˆ๋‹ค. ๋ช‡ ๋‹ฌ ๋’ค ์ด ๊ธฐํšŒ๊ฐ€ ์ƒ๊ฒผ๋‹ค ์ ๊ทน์ ์œผ๋กœ ์‚ฌ์šฉ๋˜๊ธฐ ์‹œ์ž‘ํ•˜์—ฌ ์‘์šฉ ํ”„๋กœ๊ทธ๋žจ ์ฝ”๋“œ๋ฅผ ํฌ๊ฒŒ ์ค„์˜€์Šต๋‹ˆ๋‹ค. ํ•œ ๋ฒˆ์˜ ๋””์ฝ”๋”ฉ ์ž‘์—…์œผ๋กœ ์ „์ฒด ๊ตฌ์กฐ๋ฅผ ๋งค์šฐ ๊นŠ์ด๊นŒ์ง€ ๋ถ„ํ•ดํ•˜๋Š” ๊ฒƒ์ด ๊ฐ€๋Šฅํ–ˆ์Šต๋‹ˆ๋‹ค. ์ด๋ฅผ ์œ„ํ•ด ์Šคํ‚ค๋งˆ๋Š” ์–ด๋–ค ํ•„๋“œ๊ฐ€ ๋ฌด์—‡์„ "์ •์˜"ํ•˜๋Š”์ง€ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด CMS ๊ตฌ์„ฑํ‘œ์— ๋Œ€ํ•œ ์„ค๋ช…์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

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์—๋Š” ๋‹ค์Œ์—์„œ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ๋Š” ๊ธฐ๋Šฅ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ๋ช…๋ น์ค„ ASN.1 ํŒŒ์ผ์„ ๋””์ฝ”๋”ฉํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋˜๋ฉฐ ํ’๋ถ€ํ•œ ๊ธฐ๋Šฅ์„ ๊ฐ–์ถ”๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ์œ ์ธ์‡„. ์ž„์˜์˜ ASN.1์„ ๋””์ฝ”๋”ฉํ•˜๊ฑฐ๋‚˜ ๋ช…ํ™•ํ•˜๊ฒŒ ์ •์˜๋œ ์ฒด๊ณ„๋ฅผ ์ง€์ •ํ•˜๊ณ  ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๋‚ด์šฉ์„ ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

PyDERASN: ์Šฌ๋กฏ๊ณผ ๋ธ”๋กญ์ด ์žˆ๋Š” ASN.1 ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์ž‘์„ฑํ•œ ๋ฐฉ๋ฒ•

ํ‘œ์‹œ๋˜๋Š” ์ •๋ณด: ๊ฐ์ฒด ์˜คํ”„์…‹, ํƒœ๊ทธ ๊ธธ์ด, ๊ธธ์ด ๊ธธ์ด, ์ฝ˜ํ…์ธ  ๊ธธ์ด, 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 ๋ธŒ๋ผ์šฐ์ €์—์„œ ๊ฐ•์กฐ ํ‘œ์‹œํ•˜์—ฌ ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. asn1js ํ”„๋กœ์ ํŠธ.

๊ธฐํƒ€ ๋„์„œ๊ด€

์ด๊ฒƒ์ด ๋ชฉํ‘œ๋Š” ์•„๋‹ˆ์—ˆ์ง€๋งŒ PyDERASN์€ ํฌ๊ฒŒ ๋‚˜ํƒ€๋‚ฌ์Šต๋‹ˆ๋‹ค ๋” ๋น ๋ฅด๊ฒŒ pyasn1๋ณด๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด ๋ฉ”๊ฐ€๋ฐ”์ดํŠธ ํฌ๊ธฐ์˜ CRL ํŒŒ์ผ์„ ๋””์ฝ”๋”ฉํ•˜๋Š” ๋ฐ ์‹œ๊ฐ„์ด ๋„ˆ๋ฌด ์˜ค๋ž˜ ๊ฑธ๋ฆด ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ ์ค‘๊ฐ„ ๋ฐ์ดํ„ฐ ์ €์žฅ ํ˜•์‹(๋น ๋ฆ„)์„ ๊ณ ๋ คํ•˜๊ณ  ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์•„ํ‚คํ…์ฒ˜๋ฅผ ๋ณ€๊ฒฝํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. pyasn1์€ CRL์„ ๋””์ฝ”๋”ฉํ•ฉ๋‹ˆ๋‹ค. CACert.org ๋‚ด ๋…ธํŠธ๋ถ์—์„œ๋Š” 20๋ถ„ ์ด์ƒ ๊ฑธ๋ฆฌ๋Š” ๋ฐ˜๋ฉด, PyDERASN์€ 28์ดˆ๋ฐ–์— ๊ฑธ๋ฆฌ์ง€ ์•Š์Šต๋‹ˆ๋‹ค! ํ”„๋กœ์ ํŠธ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค asn1์•”ํ˜ธํ™”, ์•”ํ˜ธํ™” ๊ตฌ์กฐ๋ฅผ ์‚ฌ์šฉํ•œ ๋น ๋ฅธ ์ž‘์—…์„ ๋ชฉํ‘œ๋กœ ํ•ฉ๋‹ˆ๋‹ค. 29์ดˆ ๋งŒ์— ๋™์ผํ•œ CRL์„ (์™„์ „ํžˆ, ๊ฒŒ์œผ๋ฅด๊ฒŒ ๋””์ฝ”๋”ฉํ•˜์ง€ ์•Š์Œ) ๋””์ฝ”๋”ฉํ•˜์ง€๋งŒ Python3(983MiB ๋Œ€ 498)์—์„œ ์‹คํ–‰ํ•  ๋•Œ ๊ฑฐ์˜ ๋‘ ๋ฐฐ์˜ RAM์„ ์†Œ๋น„ํ•˜๊ณ  Python3.5(2)์—์„œ๋Š” 1677๋ฐฐ ๋” ๋งŽ์€ RAM์„ ์†Œ๋น„ํ•ฉ๋‹ˆ๋‹ค. ๋Œ€ 488), pyasn1์€ 4.3๋ฐฐ ๋” ๋งŽ์ด ์†Œ๋น„ํ•ฉ๋‹ˆ๋‹ค(2093 ๋Œ€ 488).

์šฐ๋ฆฌ๋Š” ์ œ๊ฐ€ ์–ธ๊ธ‰ํ•œ asn1crypto๋ฅผ ๊ณ ๋ คํ•˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค. ์™œ๋ƒํ•˜๋ฉด ํ”„๋กœ์ ํŠธ๊ฐ€ ์•„์ง ์ดˆ๊ธฐ ๋‹จ๊ณ„์— ์žˆ์—ˆ๊ณ  ์ด์— ๋Œ€ํ•ด ๋“ค์–ด๋ณธ ์ ์ด ์—†์—ˆ๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ์ด์ œ ์šฐ๋ฆฌ๋Š” ๋™์ผํ•œ GeneralizedTime์ด ์ž„์˜์˜ ํ˜•์‹์„ ์ทจํ•˜์ง€ ์•Š๊ณ  ์ง๋ ฌํ™” ์ค‘์— ์ž๋™์œผ๋กœ ๋ช‡ ๋ถ„์˜ 509์ดˆ๋ฅผ ์ œ๊ฑฐํ•œ๋‹ค๋Š” ๊ฒƒ์„ ์ฆ‰์‹œ ๋ฐœ๊ฒฌํ–ˆ๊ธฐ ๋•Œ๋ฌธ์— ๊ทธ์˜ ๋ฐฉํ–ฅ์„ ๋ณด์ง€ ์•Š์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ด๋Š” X.XNUMX ์ธ์ฆ์„œ ์ž‘์—…์—๋Š” ํ—ˆ์šฉ๋˜์ง€๋งŒ ์ผ๋ฐ˜์ ์œผ๋กœ ์ž‘๋™ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

ํ˜„์žฌ PyDERASN์€ ์ œ๊ฐ€ ์•„๋Š” ๊ฐ€์žฅ ์—„๊ฒฉํ•œ ๋ฌด๋ฃŒ Python/Go DER ๋””์ฝ”๋”์ž…๋‹ˆ๋‹ค. ๋‚ด๊ฐ€ ์‚ฌ๋ž‘ํ•˜๋Š” Go์˜ ์ธ์ฝ”๋”ฉ/asn1 ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์—์„œ ์—„๊ฒฉํ•œ ๊ฒ€์‚ฌ๋Š” ์•„๋‹ˆ์ง€๋งŒ OBJECT IDENTIFIER ๋ฐ UTCTime/GeneralizedTime ๋ฌธ์ž์—ด. ๋•Œ๋กœ๋Š” ์—„๊ฒฉํ•จ์ด ๋ฐฉํ•ด๊ฐ€ ๋  ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ(์ฃผ๋กœ ์•„๋ฌด๋„ ๊ณ ์น  ์ˆ˜ ์—†๋Š” ์ด์ „ ์‘์šฉ ํ”„๋กœ๊ทธ๋žจ๊ณผ์˜ ํ•˜์œ„ ํ˜ธํ™˜์„ฑ์œผ๋กœ ์ธํ•ด) PyDERASN์€ ํ†ต๊ณผํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋‹ค์–‘ํ•œ ์„ค์ • ์•ฝํ™” ์ˆ˜ํ‘œ.

ํ”„๋กœ์ ํŠธ ์ฝ”๋“œ๋Š” ์ตœ๋Œ€ํ•œ ๋‹จ์ˆœํ•˜๊ฒŒ ๋งŒ๋“ค๋ ค๊ณ  ๋…ธ๋ ฅํ•ฉ๋‹ˆ๋‹ค. ์ „์ฒด ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋Š” ํ•˜๋‚˜์˜ ํŒŒ์ผ์ž…๋‹ˆ๋‹ค. ๋ถˆํ•„์š”ํ•œ ์„ฑ๋Šฅ ์ตœ์ ํ™”์™€ DRY ์ฝ”๋“œ๋ฅผ ๋ฐฐ์ œํ•˜๊ณ  ์ดํ•ด์˜ ์šฉ์ด์„ฑ์— ์ค‘์ ์„ ๋‘๊ณ  ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ–ˆ์Šต๋‹ˆ๋‹ค. ์ด๋ฏธ ๋งํ–ˆ๋“ฏ์ด UTCTime/GeneralizedTime ๋ฌธ์ž์—ด์€ ๋ฌผ๋ก  REAL, RELATIVE OID, EXTERNAL, INSTANCE OF, EMBEDDED PDV, CHARACTER STRING ๋ฐ์ดํ„ฐ ์œ ํ˜•์˜ ์ „์ฒด BER ๋””์ฝ”๋”ฉ์„ ์ง€์›ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋‹ค๋ฅธ ๋ชจ๋“  ๊ฒฝ์šฐ์—๋Š” ๊ฐœ์ธ์ ์œผ๋กœ Python์—์„œ ๋‹ค๋ฅธ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ์˜๋ฏธ๊ฐ€ ์—†๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

๋‚ด ๋ชจ๋“  ํ”„๋กœ์ ํŠธ์ฒ˜๋Ÿผ PyGOST, GoGOST, NCCP, GoVPN, PyDERASN์€ ์™„์ „ํžˆ ๋ฌด๋ฃŒ ์†Œํ”„ํŠธ์›จ์–ด, ์•ฝ๊ด€์— ๋”ฐ๋ผ ๋ฐฐํฌ๋จ LGPLv3+, ๋ฌด๋ฃŒ๋กœ ๋‹ค์šด๋กœ๋“œํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์‚ฌ์šฉ ์‚ฌ๋ก€๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค ์—ฌ๊ธฐ์— ๊ณผ PyGOST ํ…Œ์ŠคํŠธ.

์„ธ๋ฅด๊ฒŒ์ด ๋งˆํŠธ ๋น„ํ”„, ์‚ฌ์ดํผํŽ‘ํฌํšŒ์› SPO์žฌ๋‹จ, Python/Go ๊ฐœ๋ฐœ์ž, ์ˆ˜์„ ์ „๋ฌธ๊ฐ€ FSUE "STC "์•„ํ‹€๋ผ์Šค".

์ถœ์ฒ˜ : habr.com

์ฝ”๋ฉ˜ํŠธ๋ฅผ ์ถ”๊ฐ€