
클라이언트 측 PKI 도구 상자로, 브라우저에서 X.509, CSR, 체인, CRL, PKCS#7 및 PKCS#12 아티팩트를 디코딩하고, ASN.1을 조회하며, 형식을 변환하고, 자체 서명 인증서를 생성합니다.
PKI 아티팩트를 위한 셀프 호스팅, 100% 클라이언트 측 툴박스: X.509 인증서, PKCS#10 CSR, 체인, CRL, PKCS#7 및 PKCS#12 번들, 원시 ASN.1, 형식 변환, 지문 및 인증서 발급. 온라인 인증서 디코더를 대체하는 프라이버시를 존중하는 셀프 호스팅 가능한 대안입니다.
라이브 데모: https://pki-toolbox.youkyi.net (데모는 아래에서 셀프 호스팅할 수 있는 것과 동일한 정적 빌드이며, 붙여넣는 어떤 것도 브라우저를 벗어나지 않습니다).
모든 바이트는 @peculiar/x509
와 pkijs를 사용하여 브라우저 내부에서 파싱됩니다.
어떤 것도 업로드되지 않으며, 백엔드는 정적 파일만 제공합니다. 이를
그냥 믿을 필요는 없습니다: 아래의 검증 가능한 프라이버시를 참고하세요.
| 도구 | 카테고리 | 설명 |
|---|---|---|
| 인증서 디코더 | 디코딩 | X.509 인증서의 모든 필드: 주체, 발급자, 유효 기간, SAN, 키 사용, 지문 |
| CSR 디코더 | 디코딩 | PKCS#10 요청의 주체, 공개 키, 서명 알고리즘 및 요청된 확장 |
| 체인 디코더 | 디코딩 | 연결된 PEM 번들을 순서가 있는 체인으로 분할하고 모든 발급자-주체 연결을 검증 |
| CRL 디코더 | 디코딩 | 폐기된 항목, 날짜 및 폐기 사유 |
| PKCS#7 디코더 | 디코딩 | PKCS#7 / CMS 번들이 담고 있는 모든 인증서 |
| PKCS#12 디코더 | 디코딩 | 비밀번호로 보호된 .p12 / .pfx 파일 열기 |
| 지문 | 검사 | DER의 SHA-1 / SHA-256 / SHA-512 |
| ASN.1 뷰어 | 검사 | 모든 DER 아티팩트의 확장 가능한 태그/길이/값 트리 |
| 형식 변환 | 변환 | PEM ↔ DER ↔ PKCS#7 |
| 자체 서명 인증서 | 생성 | WebCrypto를 통한 자체 서명 인증서 및 키 쌍 (RSA / EC / Ed25519) |
| CA에서 서명 | 생성 | 기존 CA에서 인증서 발급: 새 키 쌍 또는 CSR, 리프 또는 중간, 바로 사용 가능한 전체 체인 포함 |
카탈로그는 내비게이션 바와 홈 그리드를 구동하는 단일 레지스트리(src/lib/tools.ts)에
있습니다.
도구 자체 외에도:
src/lib/pki/detect.ts 참고) 이를 읽는 도구에서 열립니다./는 입력란에 커서를 놓습니다."브라우저를 벗어나지 않는다"는 주장은 페이지 내부에서 검증할 수 있습니다:
connect-src 지시문을 다시 읽어 보여주고, 붙여넣은 이후 데이터를 외부로 내보낼 수 있는
요청 수를 세며, 브라우저가 거부하는 실시간 시도를 여러분 앞에서 실행하여
차단한 지시문을 인용합니다.항상 고정된 불변 릴리스 태그(vX.Y.Z)를 사용하고, latest는 절대 사용하지 마세요: 움직이는
태그는 감사하거나 롤백할 수 없습니다. 가장 강력한 보장을 위해
이미지 다이제스트(...@sha256:...)를 고정하세요.
docker run -p 8080:8080 ghcr.io/youkyi/pki-toolbox:v2.2.0
그런 다음 http://localhost:8080을 엽니다.
각 릴리스는 동일한 변경 불가능한 vX.Y.Z 태그로 다음 위치에 게시됩니다:
| 레지스트리 | 이미지 |
|---|---|
| GitHub Container Registry | ghcr.io/youkyi/pki-toolbox |
| Docker Hub | youkyi/pki-toolbox |
docker pull ghcr.io/youkyi/pki-toolbox:v2.2.0 # or
docker pull youkyi/pki-toolbox:v2.2.0
services:
pki-toolbox:
image: ghcr.io/youkyi/pki-toolbox:v2.2.0
ports:
- '8080:8080'
restart: unless-stopped
security_opt:
- no-new-privileges:true
cap_drop:
- ALL
read_only: true
docker compose up -d
저장소에는 완전히 강화된 docker-compose.yml(읽기 전용 루트 파일시스템, 기능 제거, 메모리 및 CPU 제한)이 포함되어 있으므로, 이 최소 예제 대신 해당 파일을 직접 사용하십시오.
이미지는 nginx:alpine-slim을 기반으로 빌드되며, 약 25 MB의 크기이고, 비특권 포트 8080에서 수신 대기하며 비루트 사용자로 실행됩니다.
Node 24(이미지와 CI가 빌드하는 버전)와 pnpm 11이 필요합니다. 정확한 pnpm 버전은 package.json의 packageManager 필드에 고정되어 있으므로, corepack enable만으로 충분히 설치할 수 있습니다.
pnpm install
pnpm dev # dev server on http://localhost:5173
pnpm test # unit tests, single run (Vitest)
pnpm test:unit # the same tests, in watch mode
pnpm test:e2e # end-to-end tests (Playwright)
pnpm test:e2e:ui # the same, in the Playwright UI
pnpm check # svelte-check / TypeScript
pnpm lint # Prettier + ESLint
pnpm format # rewrite files with Prettier
pnpm build # static build into ./build
pnpm preview # serve ./build locally
docker build -t pki-toolbox .
docker run -p 8080:8080 pki-toolbox
adapter-static로 순수 HTML/JS로 빌드됩니다. 모든 라우트는 사전 렌더링되며 프로덕션에는 Node 런타임이 없습니다.src/lib/pki/ 아래의 순수하고 테스트 가능한 함수에 있습니다: parse.ts, chain.ts, crl.ts, pkcs7.ts, pkcs12.ts, asn1.ts, convert.ts, format.ts, pem.ts, oids.ts, detect.ts, generate.ts, sign.ts. src/routes/ 아래의 각 라우트는 이들을 감싸는 얇은 UI 셸입니다.@peculiar/x509 v2는 tsyringe를 통해 객체를 생성하는데, 이는 소비자 측에서 Reflect 메타데이터 폴리필을 필요로 하므로, 이 라이브러리를 사용하는 모든 모듈에서 @abraham/reflection을 먼저 import합니다.pkijs를 거치며, Web Crypto 엔진은 src/lib/pki/engine.ts에서 한 번 등록됩니다.tests/pki/(Vitest)에, 브라우저 테스트는 e2e/(Playwright)에 있습니다. 픽스처는 실제 공개 루트(ISRG Root X1/X2)와 생성된 EC 체인 및 CSR이며, scripts/generate-fixtures.mjs를 참고하세요.connect-src 'none'과 함께 <meta> 태그로 내보내며, nginx는 frame-ancestors 'none', X-Frame-Options, X-Content-Type-Options, Referrer-Policy: no-referrer, 제한적인 Permissions-Policy 및 교차 출처 격리 헤더를 추가합니다. Vercel 데모는 동일한 헤더 세트를 전송합니다(vercel.json 참고).docker-compose.yml은 읽기 전용 루트 파일시스템, cap_drop: ALL, no-new-privileges 및 리소스 제한을 추가합니다.trivy fs)와 새로 빌드된 이미지 모두에서 수정 가능한 HIGH/CRITICAL 발견 시 실패하며, 베이스 OS가 수명 종료(EOL)인 경우에도 이미지가 거부됩니다. 이미지는 태그 없는 후보로 푸시되고 다이제스트로 스캔되며, 스캔된 다이제스트만 승격되므로 취약한 이미지는 버전 태그를 받지 않습니다. 라이선스는 별도의 비차단 단계에서 스캔됩니다.이 프로젝트는 Semantic Versioning과 Conventional Commits를 따릅니다. 주요 변경 사항은 CHANGELOG.md에 기록됩니다. 기여 규칙은 CONTRIBUTING.md에 있습니다.
CHANGELOG.md에서 ## [Unreleased] 제목을 오늘 날짜의 새 버전으로 변경하고(예: ## [1.2.3] - 2026-06-01), 그 위에 새 빈 ## [Unreleased]를 추가한 뒤 파일 하단의 링크 참조를 업데이트합니다.package.json의 "version"을 동일한 번호로 올립니다.main에 커밋하고(관례적 커밋, 예: chore(release): 1.2.3) 푸시합니다.git tag -a v1.2.3 -m "pki-toolbox v1.2.3"
git push origin v1.2.3