안녕하세요. 퇴근 후 밤마다 사이드 프로젝트를 깎고 있는 로켓다람쥐입니다.
웹에서 시각적으로 인증서 트리를 구성해 볼 수 있는 툴인 x509Lab을 만들어서 운영 중인데요. 이번에 차세대 타원곡선 서명 알고리즘인 Ed25519 지원을 업데이트하면서 겪은 기술적 삽질기를 공유해 보려고 합니다.

1. 왜 Ed25519를 붙였나? 기존에는 RSA와 ECDSA만 지원했습니다. 그런데 최근 TLS 1.3이나 SSH 키 생성, 코드 서명 등에서 Ed25519(Curve25519 기반)가 대세로 자리 잡고 있더라고요. RSA보다 키 사이즈는 훨씬 작으면서 보안성은 뛰어나고, 서명 속도도 빨라서 인프라 세팅하실 때 테스트 용도로 많이 찾으실 것 같아 추가했습니다.


기능은 단순합니다. 캔버스에 Root -> Intermediate -> Leaf 트리를 그리고 Generate 버튼을 누를 때 Ed25519를 선택하면 한 번에 전체 체인을 발급하고 상호 검증까지 마칩니다.
2. 브라우저에서 인증서를 구워내는 삽질 (Web Crypto API) 제 앱은 백엔드 서버가 없습니다. 모든 키 생성과 서명이 브라우저 로컬 환경에서 돌아갑니다.
키 생성 자체는 crypto.subtle API를 호출하면 금방이지만, 이걸 OpenSSL이 인식할 수 있는 표준 X.509 PEM 형식으로 만들어내는(DER 인코딩) 과정이 순수 노가다였습니다.
OID 파싱: 브라우저가 안 해주니 RFC 8410 문서를 보면서 OID
1.3.101.112에 대한 ASN.1 DER 인코딩 구조를 하드코딩으로 짜맞췄습니다.NULL 파라미터의 함정: 가장 애먹은 부분입니다. RSA 인증서를 인코딩할 때는 signature algorithm sequence에 관습적으로 NULL 파라미터가 들어가야 하는데, Ed25519 규격에서는 이게 들어가면 OpenSSL에서 포맷 에러를 뿜습니다. 분기 처리를 꼼꼼하게 해줘야 했습니다.
서명값 포맷: ECDSA는 서명값을 다시 DER로 변환해야 하지만, Ed25519는 raw 64바이트 서명값을 그대로 때려 넣어야 한다는 미묘한 차이도 있었습니다.

결과적으로 GUI 기반 생성뿐만 아니라, 위 사진처럼 현재 트리에 맞는 openssl genpkey -algorithm Ed25519 CLI 명령어 세트도 완벽하게 자동 생성되도록 연동을 마쳤습니다.
보안이나 인프라 쪽에 관심 있으신 개발자분들, 인증서 발급 명령어 칠 때마다 구글링하기 귀찮으셨던 분들은 가볍게 브라우저에서 테스트해 보시길 바랍니다!
시뮬레이터 링크: https://x509lab.vercel.app
로켓다람쥐 블로그 : https://blog.naver.com/hjinha2/224251239906
읽어주셔서 감사합니다. 기술적인 조언이나 피드백은 언제든 환영합니다!
댓글을 남기려면 로그인이 필요합니다.
로그인 후 이 페이지로 돌아와 바로 댓글을 남길 수 있습니다.