개발

JAVA RSA invalid key format 오류

개미v 2021. 1. 24. 15:06

자바에서 RSA 개인키와 공개키를 사용하려는데 헤맸던 오류입니다.

 

■ 오류

Exception in thread "main" java.security.spec.InvalidKeySpecException: java.security.InvalidKeyException: invalid key format

at sun.security.rsa.RSAKeyFactory.engineGeneratePrivate(RSAKeyFactory.java:252)

at java.security.KeyFactory.generatePrivate(KeyFactory.java:372)

at Main.main(Main.java:43)

Caused by: java.security.InvalidKeyException: invalid key format

at sun.security.pkcs.PKCS8Key.decode(PKCS8Key.java:331)

at sun.security.pkcs.PKCS8Key.decode(PKCS8Key.java:356)

at sun.security.rsa.RSAPrivateCrtKeyImpl.<init>(RSAPrivateCrtKeyImpl.java:130)

at sun.security.rsa.RSAPrivateCrtKeyImpl.newKey(RSAPrivateCrtKeyImpl.java:80)

at sun.security.rsa.RSAKeyFactory.generatePrivate(RSAKeyFactory.java:357)

at sun.security.rsa.RSAKeyFactory.engineGeneratePrivate(RSAKeyFactory.java:248)

... 2 more

■ 원인

자바에서 지원하는 RSA PEM 파일 형식이 맞지 않음

자바는 PKCS#1 지원 안하고, PKCS#8만 지원함

- PEM파일 PKCS#1은 이렇게 생겼음

-----BEGIN RSA PRIVATE KEY-----

.

.

.

-----END RSA PRIVATE KEY-----

- PEM파일 PKCS#8은 이렇게 생겼음

-----BEGIN PRIVATE KEY-----

.

.

.

-----END PRIVATE KEY-----

■ 해결방법

- openssl을 이용해서 RSA 개인키를 PKCS#1에서 PKCS#8으로 변환해서 자바에서 사용

# 개인키 pkcs#8 형식으로 변환
pkcs8 -in private_key1.pem -inform PEM -out private_key8.pem -outform PEM -topk8 -nocrypt

 

- 만약 JAVA 에서 개인키를 생성하였다면 기본적으로 PKCS#8입니다.

형식이 맞으니 다른 원인을 찾도록 해야 합니다.