End-to-end encrypted relays for OCapN
OCapN을 위한 종단간 암호화 릴레이
Spritely는 Goblins 다음 버전에 Noise Protocol 기반의 종단간 암호화 릴레이를 포함한다고 발표했습니다. 릴레이는 무상태·연합형으로 설계하며, Guile과 Hoot에서 쓸 Noise 라이브러리와 다른 OCapN 구현을 위한 명세 및 테스트 지원도 진행합니다.
- 주제
에디터 노트
릴레이가 메시지 내용을 읽거나 변조하지 못하게 하면서도 사용자가 서버를 바꿀 수 있게 만드는 설계가 글의 가장 구체적인 성과입니다. Noise를 기존 netlayer 위에 조합하고 테스트 벡터로 두 실행 환경을 확인한 절차도 설명돼 있습니다. 다만 다음 릴리스와 표준화 작업은 앞으로 진행할 단계이며, 릴레이가 어떤 연결 정보를 관찰할 수 있는지는 자료에 기준이 없습니다. Lobsters의 유일한 댓글은 Goblins와 Hoot를 써보라는 응원이며 구현의 안전성이나 동작을 검증하지는 않습니다. 따라서 현재 자료가 뒷받침하는 내용은 설계와 구현 계획, 라이브러리 테스트까지입니다. 실제 배포된 연합 릴레이의 운영 결과는 다루지 않습니다.
AI 요약
인터넷에서 두 컴퓨터가 직접 연결되기는 어렵습니다. 가정용 네트워크와 통신사급 NAT가 외부에서 들어오는 연결을 막고, NAT 홀 펀칭도 늘 성공하지는 않습니다. Spritely는 이런 환경에서 피어 간 통신을 중계할 릴레이가 필요하다고 설명합니다. Goblins 0.12에 들어간 기존 prelay는 연합형이고 무상태지만 종단간 암호화(E2EE)는 지원하지 않았습니다. NLnet 지원금으로 개발한 새 릴레이를 Goblins 다음 버전에 넣고, OCapN 표준화 그룹에 명세를 제출할 계획입니다.
설계 목표와 피어 인증
릴레이의 목표는 사용자 데이터를 저장하지 않는 무상태 설계, 여러 서버가 참여하는 연합형 구조, 종단간 암호화입니다. 기존 prelay의 릴레이 기능에 Noise Protocol을 조합해 암호화와 인증을 더합니다. Noise는 여러 핸드셰이크 패턴과 암호 구성을 제공하는 프로토콜 프레임워크입니다. Spritely는 직접 암호 프로토콜을 설계하는 대신 널리 쓰이고 검토된 Noise를 선택했습니다.
OCapN 피어의 Locator에는 피어를 식별하는 Designator, 전송 방식인 Transport, IP와 포트 같은 경로 정보인 Hints가 들어갑니다. Designator에는 보통 공개 키가 담깁니다. Noise의 XK 패턴을 사용하면 연결을 시작하는 쪽이 상대 공개 키를 미리 알고 상대를 확인합니다. OCapN은 두 피어 사이에 동시에 연결 하나만 유지하도록 요구합니다. 피어 인증이 없으면 악성 피어가 다른 피어를 사칭해 그 피어의 연결을 방해할 수 있습니다.
Guile과 Hoot용 Noise 구현
Guile에는 기존 Noise 구현이 없어 Spritely가 라이브러리를 작성했습니다. Noise 동작은 암호화와 복호화, 키 갱신을 맡는 CipherState, 키와 해시를 갱신하는 SymmetricState, 핸드셰이크 메시지를 처리하는 HandshakeState로 나뉩니다. Noise는 핸드셰이크 패턴을 작은 연산들의 순서로 정의합니다. XK 패턴은 미리 교환된 상대의 정적 키를 바탕으로 세 메시지를 주고받습니다. 핸드셰이크가 끝나면 양방향 통신에 쓸 CipherState 두 개를 만듭니다.
라이브러리는 Hoot의 SubtleCrypto API와 Guile VM의 GnuTLS를 지원합니다. X25519 키, AES-GCM 암호, SHA256과 SHA512 해시를 제공하며, 지원하는 패턴과 암호 조합의 Noise 테스트 벡터를 두 실행 환경에서 확인합니다. 구현은 Noise의 12개 기본 대화형 패턴을 지원합니다.
기존 릴레이와 Noise의 조합
OCapN은 CapTP와 여러 netlayer로 구성됩니다. Netlayer는 메시지를 특정 전송 매체로 전달하며, 다른 netlayer 위에 추가로 구성하는 meta netlayer도 지원합니다. Noise netlayer를 TCP+TLS 같은 전송 계층이나 기존 prelay 위에 얹으면 기존 전송 방식에 피어 인증과 종단간 암호화를 더할 수 있습니다. 새 릴레이 모듈은 Noise와 prelay를 조합해 사용자가 직접 계층을 연결하지 않아도 암호화된 릴레이를 제공하도록 설계합니다.
릴레이 서버에는 클라이언트가 연결을 등록하고 관리하는 Controller와, 공개 Locator에 담겨 다른 서버에서 접근하는 Endpoint가 있습니다. 서로 다른 릴레이를 쓰는 두 피어가 통신을 요청하면 각 릴레이가 상대 Endpoint와 연결을 만들고, 각 피어의 MyCapN에 연결을 전달합니다. 서버는 사용자 데이터를 저장하지 않으며 메시지를 중계하는 역할만 맡습니다. 따라서 사용자가 다른 릴레이로 옮길 때 새 서버를 선택해 sturdy reference에 반영하면 됩니다.
다음 단계
Spritely는 OCapN 명세와 테스트 스위트에 암호화 릴레이 지원을 추가할 계획입니다. OCapN을 Dart로 구현한 Ridley도 자체 Noise 라이브러리를 준비하고 있습니다. 릴레이를 쉽게 운영하도록 Guix 서비스도 만들 예정입니다.
Lobsters 반응
- @arcade — Spritely 프로젝트를 응원합니다. Goblins와 Hoot를 모두 써보길 권합니다.
원문: Spritely Institute / 번역·요약: Trawling