Go, X.509 인증서 검증, 숨겨진 함정: ASN.1 타입 불일치

by DD
3개월 전
조회수 10

Go 언어의 X.509 인증서 검증 시, 예상치 못한 오류 발생

openssl은 성공, Go 프로그램은 실패하는 상반된 결과

ASN.1 데이터 타입(Data Type)의 미세한 차이가 원인으로 밝혀짐

UTF8StringPrintableString 간의 불일치로 인해 검증 실패

ASN.1 인코딩(Encoding)과 Go의 엄격한 검증

Go 언어의 X.509 인증서 검증은 ASN.1(Abstract Syntax Notation One) 데이터 타입의 엄격한 일치를 요구한다. 특히, Subject 및 Issuer 필드에서 UTF8StringPrintableString 간의 차이를 민감하게 감지한다. 이러한 엄격함은 보안을 강화하는 측면이 있지만, openssl과 같은 다른 도구와의 호환성 문제를 야기할 수 있다. 데이터 격리 아키텍처(Data Isolation Architecture) 관점에서, Go는 잠재적인 취약점을 사전에 차단하는 방식을 선택한 것으로 볼 수 있다.

openssl과 Go의 상반된 동작 원리

openssl은 다양한 ASN.1 문자열 타입을 관대하게 처리하여 인증서 검증에 성공하지만, Go는 엄격한 비교를 수행하여 실패한다. 이는 openssl이 호환성(Compatibility)을 우선시하는 반면, Go는 보안(Security)을 최우선으로 고려하기 때문이다. 기술적으로 보면, openssl은 Subject와 Issuer 필드의 데이터 타입이 달라도 검증을 통과시키지만, Go는 이러한 미세한 차이에도 오류를 발생시킨다.

인증서 생성 도구의 중요성

인증서 검증 실패는 인증서 생성 도구의 일관성 부족에서 기인할 수 있다. CA(Certificate Authority) 인증서와 리프(Leaf) 인증서를 생성하는 도구가 다르면, Subject 및 Issuer 필드의 데이터 타입이 달라질 수 있다. 따라서, 일관된 인증서 생성 프로세스(Consistent Certificate Generation Process)를 유지하는 것이 중요하다. 특히, 리프 인증서의 수명이 CA 인증서보다 짧으므로, 도구 변경에 따른 영향을 주의해야 한다.

Go의 fail-closed 방식과 시스템 안정성

Go의 엄격한 인증서 검증은 fail-closed 방식으로, 잠재적인 보안 취약점을 사전에 차단한다. 이는 시스템의 안정성(Stability)을 높이는 데 기여하지만, 인증서 생성 및 관리 과정에서 세심한 주의를 요구한다. 만약 인증서 검증 실패로 인해 서비스 중단이 발생한다면, 이는 심각한 가용성(Availability) 문제를 야기할 수 있다. 따라서, 인증서 검증 오류에 대한 적절한 모니터링 및 대응 체계를 구축해야 한다.

Fooling Go's X.509 Certificate Verification