<div align="center">
<img src="https://raw.githubusercontent.com/letsseal/letsseal/HEAD/docs/logo.svg" width="84" height="84" alt="Let's Seal" />
<h1>Let's Seal</h1>
<p><strong>모든 것을 봉인(Seal)하세요.</strong></p>
<p>어떤 파일이 진짜인지 증명하기 위한 오픈 표준: 알려진 인증서로 변조되지 않았고, 특정 날짜에 존재했음을 봉인하는 방식입니다.</p>
<p>
<a href="LICENSE"><img src="https://img.shields.io/badge/license-Apache--2.0-blue?style=flat-square" alt="Apache-2.0 라이선스"></a>
<a href="SPEC.md"><img src="https://img.shields.io/badge/standard-SEAL-7c3aed?style=flat-square" alt="SEAL 표준"></a>
<a href="https://www.npmjs.com/package/sealbot"><img src="https://img.shields.io/npm/v/sealbot?style=flat-square&color=cb3837&label=sealbot" alt="npm의 sealbot"></a>
<a href="https://github.com/letsseal/letsseal/releases"><img src="https://img.shields.io/github/downloads/letsseal/letsseal/total?style=flat-square&color=f59e0b&label=%EB%8B%A4%EC%9A%B4%EB%A1%9C%EB%93%9C" alt="다운로드"></a>
<a href="https://letsseal.org"><img src="https://img.shields.io/endpoint?url=https%3A%2F%2Fletsseal.org%2Fapi%2Fstats%2Fbadge&style=flat-square" alt="증명 기록"></a>
</p>
<p>
<a href="https://letsseal.org">웹사이트</a> ·
<a href="SPEC.md">SEAL 표준</a> ·
<a href="https://app.letsseal.org">무료 웹 앱</a> ·
<a href="#quickstart">빠른 시작</a> ·
<a href="#what-it-seals">봉인하는 내용</a> ·
<a href="#how-a-seal-is-made-and-checked">작동 방식</a> ·
<a href="#use-cases">사용 사례</a> ·
<a href="#for-developers">개발자용</a> ·
<a href="#self-host">자체 호스팅</a> ·
<a href="https://verify.letsseal.org">문서 검증하기</a>
</p>
</div>
SEAL은 어떤 파일이 진짜인지 증명하는 오픈 표준입니다. 봉인된 아티팩트 하나, 확인하는 방법 하나로, 누구나 영원히 검증할 수 있습니다. 어떤 규격에 맞는 도구로 봉인하든, 누구든지 다른 도구를 사용해 검증할 수 있습니다.
Let's Seal은 표준인 SEAL(Sealed Evidence Anchored to a Ledger)을 만들었으며, 이를 발행하고 검증하는 무료 네트워크 및 레퍼런스 구현체를 운영합니다. 이 표준이 근간입니다. 이 저장소의 모든 것은 여기에 기반하여 구축되었고 모두 공개되어 있습니다.
이는 문서 증명의 Let's Encrypt와 같습니다. Let's Encrypt는 유료 TLS 인증서를 쓸모없게 만들었습니다. Let's Seal은 유료 문서 봉인(seal)에 대해 같은 일을 하며, Let's Encrypt처럼 스타트업이 아닌 재단의 공익 프로젝트로 무료, 오픈 소스로 운영됩니다.
진위성(Authenticity)은 인프라입니다. 임대할 물건이 아닙니다.
무료로 사용하기
세 가지 방식으로 봉인할 수 있으며, 모두 무료입니다:
- 호스팅 웹 앱: app.letsseal.org. 누구나 브라우저에서 무료로 사용할 수 있으며 설치할 것이 없습니다. 파일을 봉인하고, 서명을 위해 문서를 전송(원격, 대면 또는 이메일 없이)하며, 브랜드가 지정된 인증서와 자격 증명(credentials)을 발행합니다.
- 커맨드 라인 및 API: 터미널용
sealbot과 자체 시스템에 봉인을 통합할 수 있는 REST API 및 SDK를 제공합니다.
- 셀프 호스팅(Self-hosted): 전체 엔진을 직접 운영하고, 자신만의 인증 기관(Certificate Authority) 아래에서 관리할 수 있습니다.
검증은 항상 무료이며 계정이 필요하지 않습니다. verify.letsseal.org 또는 자체 기기에서 오프라인으로 검증할 수 있습니다.
- 영구적으로 무료: 문서당 비용이나 유료 봉인 비용이 없습니다.
- 오픈 소스 (Apache-2.0): 엔진, SDK, 그리고 표준 자체가 오픈 소스입니다.
봉인이 증명하는 것
SEAL 증명은 암호학적으로 세 가지를 확립하고 그 경계를 명확히 설명합니다:
- 변조되지 않음(Unaltered): 해당 파일이 봉인된 이후 단 하나의 바이트도 변경되지 않았음을 의미합니다. 바이트 하나만 변경해도 서명이 깨집니다.
- 시간(Time): OpenTimestamps를 통해 비트코인에 앵커링되어 특정 날짜에 존재했음을 증명하며, 우리에게 신뢰할 필요가 없습니다.
- 발급자(Issuer): 특정 인증서에 의해 봉인되었음을 의미합니다. 조직이 도메인 제어권을 입증한 경우, 해당 봉인은 기계로 검사 가능한 식별자로서 그 도메인을 포함합니다.
모든 봉인(seal)은 또한 비트코인으로 앵커링된 루트를 가진 공개적이고 추가 전용 투명성 로그(RFC 6962)에도 기록됩니다. 따라서 무엇이 봉인되었는지에 대한 기록 자체가 변조가 불가능하며, 누구나 이를 감사할 수 있습니다.
이것이 바로 완전하고 영구적인 전체 보증입니다. 봉인은 무결성, 시간, 그리고 발급된 인증서를 증명합니다. 이것은 공증(notarisation)이 아니며, 개인의 현실 세계 신원을 주장하는 것도 아닙니다. 이 신원 기능은 서비스 제공자가 봉인 시점에 검증한 이메일 주소를 바인딩하며, 이를 지칭하는 정확한 용어는 '서비스 제공자 검증 이메일'이며, 이것이 바로 전달하는 내용입니다.
무엇을 봉인하는가
하나의 표준으로 모든 종류의 파일이 봉인되며, 각 파일은 고유의 네이티브 형식(native format)을 유지하므로 모든 표준 검증기(validator)가 이를 확인할 수 있습니다. 독자를 위한 맞춤형 도구(bespoke tooling)는 필요하지 않으며, 검증을 위해 Let's Seal에 의존할 필요도 없습니다.
| 파일 | 봉인 형식 | 검증 방법 |
|---|
| PDF | PAdES / X.509 서명이 파일 내부에 포함됨 | 모든 표준 PAdES 검증기 또는 여기의 참조 검증기 |
| ... | | |
| 봉인은 각 형식에 네이티브하게 적용되므로, 봉인된 PDF는 여전히 어디서든 열 수 있는 일반적인 PDF이며, 봉인된 이미지는 여전히 어디서나 표시되고, 서명된 아티팩트(artifact)는 평소처럼 설치됩니다. 증거가 그 안에 함께 실립니다. | | |
작동 모습 확인하기
명령줄에서 봉인하고 검증해 보세요:
<p align="center"><img src="https://raw.githubusercontent.com/letsseal/letsseal/HEAD/docs/screenshots/cli-seal.svg" width="720" alt="sealbot이 명령줄에서 문서를 봉인하고 검증하는 모습"></p>
무료 공개 검증 포털, verify.letsseal.org:
<p align="center"><img src="https://raw.githubusercontent.com/letsseal/letsseal/HEAD/docs/screenshots/verify.png" width="860" alt="Let's Seal 검증 포털"></p>
공개 증명 페이지: 누구나 열어볼 수 있는 평이한 설명(plain-English)의 판결문과 그 뒤에 숨겨진 증거를 제공합니다. 주체 및 서명자 세부 정보는 파일을 업로드할 때까지 비공개로 유지됩니다:
<p align="center"><img src="https://raw.githubusercontent.com/letsseal/letsseal/HEAD/docs/screenshots/proof.png" width="860" alt="Let's Seal 증명 페이지"></p>
호스팅되는 앱 app.letsseal.org에서 나머지 작업을 수행합니다: 파일을 봉인(seal)하고, 서명을 위해 문서를 전송하며 (원격, 대면 또는 이메일 없이), 브랜드가 적용된 인증서와 자격을 발급합니다.
빠른 시작 (Quickstart)
verify.letsseal.org에서 무료로 봉인된 문서를 확인하거나, 직접 참조 검증기(reference verifier)를 실행할 수 있습니다:
python spec/verify.py sealed.pdf sealed.pdf.ots
조직 키(organisation key)를 사용하여 호스팅 API로 파일을 봉인합니다:
curl -X POST https://app.letsseal.org/api/v1/seal \
-H "Authorization: Bearer $LETSSEAL_KEY" \
-F [email protected]
또는 명령줄에서 실행합니다:
sealbot seal contract.pdf
sealbot verify contract.sealed.pdf
Python 및 TypeScript용 SDK와 OpenAPI 스키마는 sdk/에 있습니다.
증명(proof)의 모습
봉인된 파일의 증명 페이지를 열거나 검증기를 실행하면, 누구나 재현할 수 있는 증거가 뒷받침되는 단순한 판결을 얻게 됩니다:
Authentic and unaltered
Document contract.pdf
...
이 판결은 의도적으로 엄격합니다. 핀된 루트(pinned root) 체인에 연결되지 않은 인증서의 암호학적으로 유효한 서명은 위조 벡터이며, '통과'가 아닌 '미인식(unrecognised)'으로 보고됩니다.
봉인이 생성되고 확인되는 방법
봉인의 생애 주기: 한 번 생성되어 증거가 확보되고 공개 원장(public ledger)에 고정되며, 다시 제공되고, 영원히 누구나 확인할 수 있습니다.
<p align="center"><img src="https://raw.githubusercontent.com/letsseal/letsseal/HEAD/docs/diagrams/seal-lifecycle.svg" width="920" alt="봉인의 생애 주기: 파일을 봉인하면 증거가 확보되고 공개 원장에 고정되며, 다시 제공되고, 누구나 영원히 확인할 수 있습니다. 진품 = 유효하고 온전하며 신뢰할 수 있음."></p>
무료로 직접 확인하기
두 가지 확인 절차 모두 저희와는 독립적입니다. 봉인은 확인하는 데 필요한 모든 것을 담고 있으므로, 공개된 루트를 한 번 고정(pin)한 다음 어디서든 오프라인으로 영원히 확인할 수 있습니다.
- Root fingerprint (SHA-256):
02:68:6D:EE:20:67:31:C4:59:C1:7A:9F:58:36:7B:0B:0B:BA:5D:24:C6:85:D8:6D:1F:74:49:86:2D:C0:FE:BE, subject CN=Let's Seal Root CA, O=Let's Seal, C=GB. letsseal.org/api/root-ca에서 다운로드할 수 있습니다.
- PDF: 루트를 고정(pinned)한 표준 PAdES 검증기 또는
python spec/verify.py sealed.pdf sealed.pdf.ots를 사용합니다.
- Email 및 detached:
openssl smime -verify -in message.eml -CAfile letsseal-root.crt · openssl cms -verify -inform DER -in file.sig -content file -binary -CAfile letsseal-root.crt를 사용합니다.
- 소프트웨어 및 SBOM: 표준 오픈 아티팩트 서명 도구는 공개된 루트에 대해 서명과 증명을 검증하며, 모든 장치에서 재현 가능합니다.
- 시간: Bitcoin을 기준으로
ots verify sealed.pdf.ots를 실행합니다.
- 투명성 로그:
/api/log/proof?sha256=<hex>에서 포함 증명(inclusion proof)을 가져와서, /api/log/sth에 있는 서명된 트리 헤드와 비교하고 (RFC 6962), /api/log/consistency의 일관성 증명(Consistency proofs)은 로그가 추가 전용(append only)임을 증명합니다.
공개 투명성 로그
모든 봉인(seal)은 추가 전용 머클 로그(Merkle log) (RFC 6962)에 기록되며, 이는 브라우저가 인증서 투명성(Certificate Transparency)을 위해 의존하는 것과 동일한 구조입니다. 이 로그의 루트는 서명되고 자체적으로 Bitcoin에 고정되므로 다음이 가능합니다:
- 누구나 주어진 봉인이 로그에 포함되었음을 증명할 수 있고 (포함 증명, inclusion proof),
- 누구나 로그가 재작성된 적이 없음을 증명할 수 있으며 (일관성 증명, consistency proof),
- 운영자를 신뢰하지 않고도 전체 내용을 감사(audit)할 수 있습니다.
이는 사칭 감사 추적 기록입니다. 만약 인증서가 부적절한 이름으로 무언가를 봉인했다면, 그 증거는 공개적이고 영구적입니다.
발급자 신원
봉인은 항상 어떤 인증서가 그것을 서명했는지 증명합니다. 게다가 조직은 도메인(DNS 레코드 또는 컨트롤러 주소로 전송된 메시지)에 대한 통제권을 증명할 수 있으며, 이 도메인이 dNSName으로 자체적으로 서명 인증서에 바인딩되어 오프플랫폼 검증자가 인증서에서 직접 신원을 읽을 수 있게 합니다.
- 도메인을 검증하지 않은 조직은 '자체 주장(self asserted)'으로 표시되며, 절대로 '검증됨(verified)'으로 표시되지 않습니다.
- 검증된 발급자의 배지는 해당 발급자가 통제하는 도메인이며, 이는 전 세계적으로 고유하고 충돌할 수 없습니다.
- 오용은 공개적으로 신고할 수 있으며, 사칭하는 발급자는 정지될 수 있고, 이 경우 해당 발급자의 키가 중단되고 검증된 배지가 사라집니다.
이는 TLS를 위해 웹이 채택했던 것과 동일한 '도메인 통제 = 신원(identity)' 모델입니다. 이는 사람의 법적 신원을 증명하는 것이 아니라, 봉인을 누가 통제하는지를 증명하며, 이를 명확하게 밝힙니다.
CA 운영 방식
모든 인증서 뒤에 숨겨진 관행들은 완전히 공개됩니다: 계층 구조 및 키 보호 방법, 도메인이 인증서에 바인딩되기 전에 어떻게 검증되는지, 각 인증서 프로필이 무엇을 담고 있는지, 폐기(revocation)가 어떻게 작동하는지, 그리고 각 사유가 얼마나 과거까지 추적될 수 있는지 등입니다. CPS.md를 참조하십시오. 여기는 RFC 3647 프레임워크를 따르며, 이 저장소에서 각 관행을 수행하는 파일을 명시하므로, 여기에 있는 모든 진술은 코드와 대조하여 확인할 수 있습니다.
SEAL 표준
검증 가능하도록 개방되어 있다. 구현하기 위해 개방되어 있다. 독점화될 수 없다.
SEAL은 누구나 기반을 구축할 수 있도록 공개된 사양이며, SPEC.md와 letsseal.org/standard를 참조하십시오. 목표는 특정 제품에 묶이는 것이 아니라, 모든 파일을 봉인하고 검증하는 상호 운용 가능한 단일 방식입니다. SEAL 증명은 무결성(integrity), 시간(time), 투명성(transparency), 그리고 선택적인 검증된 이메일 귀속을 하나의 자체 포함형 아티팩트에서 제공합니다.
이 저장소의 서명 서비스, SDK, 참조 검증기는 참고 구현체입니다. 다른 누구나 자신만의 것을 작성할 자유가 있으며, 한 구현체로 생성된 증명은 다른 모든 구현체에서도 검증됩니다.
사용 사례
이 표준은 모든 파일과 모든 분야에 적합합니다. 일반적인 사용 사례들에 대한 작업 가이드가 제공되며, 각 가이드에는 단계별 지침과 라이브 증명이 포함되어 있습니다: