Java ๊ธฐ๋ฐ ์์คํ
์ ์ด์ํ๋ค ๋ณด๋ฉด ๋ณด์ ์ค์ ์ ์ํด์ ์ธ์ฆ์๋ ๋น๋ฐ ํค๋ฅผ ์ ์ฅํ๋ ํค์คํ ์ด๋ฅผ ์์ฃผ ๋ค๋ฃจ๊ฒ ๋๋ค.
ํนํ java.io.IOException: Invalid Keystore Format ์์ธ๋ ์ด์ฉ๋ฉด ๊ฐ์ฅ ์์ฃผ ๋ง์ฃผ์น๋ ์์ธ์ผ ๊ฒ์ด๋ค.
์ด๋ฒ ํฌ์คํ
์์๋ Baeldung์ ์ต์ ๊ฐ์ด๋๋ฅผ ๋ฐํ์ผ๋ก ์ด ์๋ฌ์ ์์ธ์ ํ์
ํ๊ณ ํด๊ฒฐํ๋ ์ค๋ฌด ๋
ธํ์ฐ์ ๋ํด์ ์ ๋ฆฌํ๊ณ ์ ํ๋ค.
์ด ์๋ฌ๋ keystore ํ์ผ ํ์๊ณผ Java ์ฝ๋์์ ๊ธฐ๋ํ๋ ํ์(JKS, PKCS12๋ฑ)์ด ์ผ์นํ์ง ์๊ฑฐ๋ ๋น๋ ๊ณผ์ ๋๋ ์ ์ก ์ค์ ํ์ผ์ด ์์๋ ๊ฒฝ์ฐ ๋ฐ์ํ๋ฉฐ ์ ํํ ์ง๋จ ๋๊ตฌ์ ์ค์ ์ ํตํด ํด๊ฒฐํ ์ ์๋ค.
Invalid Keystore Format Error์ ๋ํ 3๊ฐ์ง ์ฃผ์ ํฌ์ธํธ
๊ฐ๋ฐ์ ์ฌ๋ฌ๋ถ๋ค์ด ์ฃผ๋ชฉํด์ผ ํ ํต์ฌ์ ์ธ ์๋ฌ ์์ธ ๋ฐ ์ง๋จ ๋ฐฉ๋ฒ์ ์ธ๊ฐ์ง๋ก ์ ๋ฆฌํด ๋ณด์๋ค.
์ฝ๋์ ํ์ผ ํ์์ ๋ถ์ผ์น ์ ์ธ
๊ฐ์ฅ ํํ ์์ธ ์ค ํ๋๋ค. ํ์ผ ์์ฒด๋ ์ ํจํ PKCS#12(.p12 ๋๋ ํ์ฅ์๊ฐ ํผ๋๋ .jks) ํ์์ธ๋ฐ ์ฝ๋์์ KeyStore.getInstance(“JKS”)๋ก ๋ก๋ํ๋ ค๊ณ ํ๋ ๊ฒฝ์ฐ๋ค.
์ด ๊ฒฝ์ฐ ํ์ผ์ ํ์์ ๋ง์ถฐ KeyStore.getInstance()์ ํ์
์ ์ ํํ ์ง์ ํด์ผ ํ๋ค. (PKCS12 ๋๋ JKS)
๋จ์ํ ํ์ผ ํ์ฅ์๋ง์ผ๋ก ํ์ธํ ๊ฒ์ด ์๋๋ผ ์ค์ KeyStore ํ์ผ ํ์์ ํ์์ ํ์ธํด์ผ ํ๋ค.
keytool ๋ช ๋ น ํ์ธ
์๋ฐ๊ฐ ์ค์น๋์ด ์๋ค๋ฉด keytool ๋ช ๋ น์ ํตํด ํ์ธํด ๋ณผ ์ ์๋ค.
keytool -list -v -keystore ํ์ผ๋ช
Bashํ์ผ ์๊ทธ๋์ฒ๋ก ํ์ธ
ํ์ผ์ ์ฒซ 4byte ์ ๋ณด(ํ์ผ ์๊ทธ๋์ฒ)๋ฅผ ํตํด์ ํ์ธํ ์ ์๋ค.
๋ฆฌ๋
์ค๋ ๋งฅ ํฐ๋ฏธ๋์์ xxd ๋ช
๋ น์ ํตํด์ ํ์ผ์ ํค๋๋ฅผ ํ์ธํด ๋ณผ ์ ์๋ค.
# ํ์ผ์ ์ฒซ 1์ค(16๋ฐ์ดํธ)๋ง 16์ง์๋ก ์ถ๋ ฅ
xxd -l 16 keystore.p12Bash์ถ๋ ฅ
# JKS ํ์ผ
00000000: feed feed 0000 0002 ...
# PKCS12 ํ์ผ
00000000: 3082 09c0 0201 0330 ...Plaintext๋ฐ์ด๋๋ฆฌ ํ์ผ์ ๋ํ ๋น๋ ๋๊ตฌ์ ํ ์คํธ ํํฐ๋ง ํ์ฑํ
์์ธ๋ก ๋ง์ ๊ฐ๋ฐ์๋ค์ด ๋์น๋ ๋ถ๋ถ์ด๋ค. Maven์ด๋ Gradle ๊ฐ์ ๋น๋ ๋๊ตฌ๊ฐ ๋ฆฌ์์ค๋ฅผ ์ฒ๋ฆฌํ ๋ ๊ธฐ๋ณธ์ ์ผ๋ก ํ
์คํธ ํ์ผ์ ๋ณ์ ์นํ(Filtering)์ ์ ์ฉํ๋ ๊ฒฝ์ฐ๊ฐ ๋ง์๋ฐ ์ด ๋ ๋ฐ์ด๋๋ฆฌ ํ์ผ์ธ keystore ํ์ผ์ด ํ
์คํธ ํํฐ๋ง์ด ๋์ด ๋ด์ฉ์ด ๋ณ์กฐ๋๋ ๊ฒฝ์ฐ๋ค.
pom.xml ํน์ build.gradle ์ค์ ์์ keystore ํ์ผ์ด ํฌํจ๋ ๋๋ ํ ๋ฆฌ ํน์ ํด๋น keystore ํ์ผ์ ๋ํด์๋ ๋ช
์์ ์ผ๋ก ๋ฆฌ์์ค ํํฐ๋ง์ ๋นํ์ฑํ ํด์ผ ํ๋ค.
maven
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-resources-plugin</artifactId>
<configuration>
<nonFilteredFileExtensions>
<nonFilteredFileExtension>p12</nonFilteredFileExtension>
<nonFilteredFileExtension>pfx</nonFilteredFileExtension>
<nonFilteredFileExtension>jks</nonFilteredFileExtension>
</nonFilteredFileExtensions>
</configuration>
</plugin>XMLgradle
processResources {
// ํ
์คํธ ํ์ผ์ ์นํํ๋, ์ธ์ฆ์ ํ์ผ(.p12, .pfx)์ ๊ฑด๋๋ฆฌ์ง ์๋๋ก ์ค์
filesNotMatching(['**/*.p12', '**/*.pfx', '**/*.jks']) {
expand(project.properties)
}
}Groovykeytool ๋ฐ OpenSSL์ ์ด์ฉํ ์ฌ์ ์ง๋จ
์ฝ๋ ์์ ์ด์ ์ ์ฐ์ keystore ํ์ผ ์์ฒด์ ์ ํจ์ฑ๊ณผ ๋ด์ฉ์ ํ์ธํ์ฌ ์ด์์ด ์์์ ์ฐ์ ์ฒดํฌํ๋ค. ์์ ์๊ฐํ keytool ๋ช ๋ น์ ํตํด ํ์ผ ์ ํ๊ณผ ํจ๊ป ์ ํจ์ฑ์ ์ฒดํฌํ ์ ์๋ค.
keytool -list -v -keystore ํ์ผ๋ช
Bashํ์ผ์ด ์ ํจํ๋ฉด ๋น๋ฐ๋ฒํธ ์ ๋ ฅ ์์ฒญ์ด ์๊ธฐ๊ณ keystore์ ๋ํ ์์ธ ์ ๋ณด๋ฅผ ์ถ๋ ฅํ๋ค. ํ์ผ์ด ์๋ชป๋ ํ์์ธ ๊ฒฝ์ฐ์๋ Exception ๋ฉ์์ง๊ฐ ์ถ๋ ฅ๋๋ค.
openssl pkcs12 -info -in xxxx.jksBashํ์ผ ํ์ฅ์๊ฐ jks๋ผ๋ ์ค์ ๋ก๋ PKCS#12 ํ์์ผ ์ ์์ผ๋ฏ๋ก OpenSSL ๋ช ๋ น์ ์ฌ์ฉํด ์ค์ ํ์์ ์ง๋จํ ์ ์๋ค. ์ ๋ช ๋ น์์ ํ์ผ์ ์ฑ๊ณต์ ์ผ๋ก ์ฝ๋ ๋ค๋ฉด xxxx.jks ํ์ผ์ ์ค์ ๋ก PKCS#12 ํ์์์ ํ์ธํ ์ ์๋ค.
์ฝ๋ ์์
์ ๋ด์ฉ์ ํตํด keystore ํ์ผ ์ ํ๊ณผ ์ ํจ์ฑ์ ํ์
ํ๋ค๋ฉด ์ฝ๋ ์์
์ ์ฐฉ์ํ๋ค.
ํ์ผ์ด PKCS#12 ํ์์ด๋ผ๋ฉด ๋ค์๊ณผ ๊ฐ์ด ๋ก๋ฉํ๋ค.
KeyStore ks = KeyStore.getInstance("PKCS12");
ks.load(new FileInputStream("keystore.p12"), "password".toCharArray());Java๊ธฐ์กด์ JKS ํ์์ด๋ผ๋ฉด ๋ค์๊ณผ ๊ฐ์ด ๋ก๋ฉํ๋ค.
KeyStore ks = KeyStore.getInstance("JKS");
ks.load(new FileInputStream("keystore.jks"), "password".toCharArray());Java์์ ์์๋ณธ ๋ฐ์ ๊ฐ์ด ์ฝ๋ ๋ด keystore ํ์์ด ์ค์ ํ์ผ ํ์๊ณผ ์ผ์นํ๋๋ก ํ๋ฉด java๊ฐ ๋ฐ์ดํฐ๋ฅผ ์๋ชป ํด์ํ๋ ๊ฒ์ ๋ฐฉ์งํ๊ณ ํ์ ์ค๋ฅ๋ฅผ ์ ๊ฑฐํ ์ ์๋ค.
ํ์ ๋ณ๊ฒฝ
๊ทธ๋๋ keystore ํ์์ด ์์๋ ๊ฒ๊ณผ ์ผ์นํ์ง ์๋๋ค๋ฉด keytool์ ํตํด ๋ณํํ ์ ์๋ค.
$ keytool -importkeystore \
-srckeystore keystore.p12 -srcstoretype pkcs12 \
-destkeystore keystore.jks -deststoretype jksBash๋ณํ ํ keytool -list ๋ช ๋ น์ ํตํด์ ๋ณํ๋ ํ์ผ์ด ์ด์์์ด ๋ก๋๋๋์ง ํ์ธํ ์ ์๋ค.
keystore ํ์ ์๋ฌ๋ ์์ฃผ ๋ฐ์ํ์ง๋ง ํด๊ฒฐ์ฑ ์ ์์ธ๋ก ๊ฐ๋จํ๋ค. keystore ํ์ผ์ ์ค์ ํ์๊ณผ ์ฝ๋์ ๊ธฐ๋ ํ์์ ์ผ์น์ํค๋ ๊ฒ์ด ์ค์ํ๊ณ ํ์ผ์ด ๋ณ์กฐ๋์ง ์๋๋ก ๊ด๋ฆฌํ๋ ๊ฒ์ด๋ค.
์ฐธ๊ณ ๋งํฌ (๋ฐธ๋ฉ)
https://www.baeldung.com/java-resolve-ioexception-invalid-keystore-format-error
