자바에서 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입니다.
형식이 맞으니 다른 원인을 찾도록 해야 합니다.
'개발' 카테고리의 다른 글
RSA - javax.crypto.IllegalBlockSizeException: Data must not be longer than 245 bytes 오류 (0) | 2021.02.02 |
---|---|
JAVA object to byte[] 변환 방법 (0) | 2021.01.30 |
openssl, java에서 RSA 개인키, 공개키 생성, 전자서명 방법 (0) | 2021.01.24 |
jQuery window load 에러 - SCRIPT438: 개체가 'indexOf' 속성이나 메서드를 지원하지 않습니다. (0) | 2020.05.26 |
Spring Websocket info 404 에러 나는 경우 (0) | 2020.05.11 |