JWK ↔ PEM 변환기

JWK와 PEM(SPKI/PKCS#8) 사이에서 RSA·EC(P-256/384/521)·Ed25519·X25519 키를 양방향 변환합니다 — Web Crypto의 가져오기·내보내기로 만들어 DER이 표준에 맞습니다.

키는 Web Crypto API로 변환됩니다. 개인 키는 비밀로 보관하세요.

이 JWK ↔ PEM 변환기가 하는 일

JWK(JSON Web Key)를 붙여넣어 PEM 블록을 얻거나, 방향을 바꿔 PEM을 붙여넣어 다시 JWK를 얻을 수 있습니다. RSA 키(kty RSA), EC 키(P-256·P-384·P-521 곡선의 kty EC), OKP 키(Ed25519·X25519 곡선의 kty OKP)를 공개 키와 개인 키 모두 처리합니다. 공개 키는 SPKI(-----BEGIN PUBLIC KEY-----), 개인 키는 PKCS#8(-----BEGIN PRIVATE KEY-----)로 출력됩니다. 내부적으로 각 키를 브라우저에 내장된 Web Crypto API로 가져와 다시 내보내므로, PEM 안의 DER은 직접 조립한 것이 아니라 표준을 정확히 따릅니다 — crypto.subtle.exportKey가 만들어내는 바이트와 정확히 일치합니다. 변환할 때마다 결과 위에 키가 무엇인지 한 줄로 알려 줍니다 — 곡선 이름이나 RSA 키 길이를 붙인 유형, 공개 키인지 개인 키인지, 키에 적힌 알고리즘(alg)과 키 ID(kid)입니다.

JWK와 PEM을 왜 변환하나

JWKS 엔드포인트, OIDC 디스커버리 문서, 대부분의 JWT 라이브러리는 키를 JWK로 제공하는 반면, OpenSSL·TLS 설정·SSH 도구·많은 서버 라이브러리는 PEM을 요구합니다 — 그래서 키를 한 형식에서 다른 형식으로 계속 옮겨야 합니다. 이 변환기는 명령줄을 거치지 않고 둘 사이를 이어 줍니다. 모든 처리는 브라우저에서 이뤄지며, 붙여넣은 내용은 업로드·기록·저장되지 않습니다 — 개인 키는 반드시 비밀로 지켜야 하므로 중요한 점입니다. 범위 참고: SPKI 공개 키와 PKCS#8 개인 키(최신 -----BEGIN PUBLIC/PRIVATE KEY----- 라벨)를 다루며, 구형 PKCS#1(-----BEGIN RSA ...-----)이나 SEC1(-----BEGIN EC PRIVATE KEY-----) 형식은 지원하지 않습니다. OKP 키는 Ed25519·X25519를 지원하고 Ed448·X448은 받지 않습니다.

자주 묻는 질문

어떤 키 종류와 PEM 형식을 지원하나요?

RSA 키, EC 키(P-256·P-384·P-521 곡선), OKP 키(Ed25519·X25519)를 지원합니다. 공개 키는 SPKI(-----BEGIN PUBLIC KEY-----), 개인 키는 PKCS#8(-----BEGIN PRIVATE KEY-----)로 상호 변환됩니다. 구형 PKCS#1(-----BEGIN RSA PUBLIC/PRIVATE KEY-----)과 SEC1(-----BEGIN EC PRIVATE KEY-----) 블록은 지원 범위가 아니며, OKP 키 가운데 Ed448·X448도 받지 않습니다.

공개 키인지 개인 키인지 어떻게 판단하나요?

JWK를 PEM으로 변환할 때는, 개인 성분 d가 들어 있는 JWK를 개인 키로 보고 PKCS#8로, 없으면 공개 키로 보고 SPKI로 씁니다. PEM을 JWK로 변환할 때는 -----BEGIN ...----- 라벨로 판단합니다: PUBLIC KEY는 SPKI, PRIVATE KEY는 PKCS#8로 읽습니다.

JWKS 전체를 붙여 넣거나 JWK에 kid를 붙일 수 있나요?

네. 키 세트를 붙여 넣으면 읽어 들이고, 키가 여럿이면 변환할 키를 고르는 선택기가 나옵니다. PEM에서 JWK로 바꿀 때는 체크박스로 RFC 지문으로 계산한 kid를 붙일 수 있고, PKCS#1이나 SEC1 블록은 이름을 알려 주며 변환하는 openssl 한 줄 명령도 함께 보여 줍니다.

Ed25519 키도 변환되나요? alg·use를 정하거나 개인 키의 공개 키만 따로 받을 수 있나요?

네. Ed25519·X25519 곡선의 OKP 키를 공개 키든 개인 키든 양방향으로 변환하며, Ed448·X448은 받지 않습니다. PEM → JWK 방향에서는 "alg (알고리즘)"과 "use (용도)" 선택 상자로 JWK에 두 멤버를 적을 수 있고, 기본값은 둘 다 "넣지 않음"입니다. 키가 할 수 없는 alg나 alg·키와 어긋나는 use는 적지 않고 이유를 알려 주며 거부합니다. 개인 키를 변환하면 어느 방향이든 공개 키 절반이 별도 상자에 함께 나오고, "공개 키 복사"와 "공개 키 다운로드"로 따로 가져갈 수 있습니다.

키가 무엇인지 알려 주거나, JWKS 엔드포인트에 바로 쓸 형태로 복사할 수 있나요?

네. 변환하면 결과 위에 키의 유형(EC P-256 같은 곡선 이름, RSA는 비트 수)과 공개 키·개인 키 여부, 알고리즘(없으면 “키에 적혀 있지 않음”), 키 ID(없으면 “없음”)가 키 자체의 멤버에서 읽혀 한 줄로 나옵니다. PEM → JWK 방향에서는 “JWKS로 복사”가 JWK를 {"keys":[…]} 키 세트로 감싸 복사하고, 개인 키였다면 버튼이 “공개 키를 JWKS로 복사”로 바뀌어 공개 키 절반만 복사합니다. 키 세트는 공개하는 것이기 때문입니다.