HOWTO · Java

기본 Java 키 저장소 암호

이 자습서에서는 Java 키 저장소의 암호를 변경하는 단계를 안내합니다.

이 페이지의 내용

Java 애플리케이션은 키 저장소(keystore)에 암호화 키와 인증서를 보관하며, 모든 키 저장소는 비밀번호로 보호됩니다. JDK의 신뢰 저장소(trust store)에 포함된 기본 Java 키 저장소 비밀번호는 changeit입니다. 이 값은 공개적으로 문서화되어 있으므로 실제 보호가 필요한 키 저장소에는 적합하지 않습니다.

이 튜토리얼에서는 Java 키 저장소가 무엇인지 설명하고, keytool 명령줄 유틸리티로 비밀번호를 변경하는 방법을 보여주며, 새 비밀번호가 제대로 작동하는지 확인하는 과정까지 안내합니다.

Java 키 저장소란 무엇인가요?

Java 키 저장소는 개인 키와 해당 인증서 체인, 신뢰할 수 있는 공개 인증서 같은 암호화 자료를 저장하는 파일입니다. Java 키 저장소에는 여러 형식이 있으며 JKS와 PKCS12가 가장 일반적입니다. Java Development Kit(JDK)에 포함된 keytool가 이 파일들을 읽고 씁니다.

JDK에는 Java가 기본적으로 신뢰하는 인증 기관을 담은 cacerts라는 신뢰 저장소가 포함되어 있습니다. 위치는 Java 설치 환경에 따라 달라집니다. JDK 8에서는 jre/lib/security 아래에 두고, 그보다 최신 JDK에서는 JAVA_HOME 안의 lib/security 아래에 둡니다. 특정 애플리케이션용으로 만든 키 저장소는 디스크 어디에나 있을 수 있으므로, 비밀번호를 변경하기 전에 애플리케이션이 실제로 로드하는 파일이 무엇인지 반드시 확인하세요.

Java 키 저장소의 기본 비밀번호는 무엇인가요?

JDK의 cacerts 신뢰 저장소의 기본 비밀번호는 changeit입니다. 널리 알려진 관례이기 때문에 오히려 보안 수단으로는 취약합니다. Java에 익숙한 사람이라면 누구나 이 비밀번호를 그대로 쓰는 키 저장소를 열거나 수정할 수 있습니다.

changeit는 JDK에 포함된 cacerts 파일에만 적용된다는 점을 기억하세요. 사용자나 조직이 직접 만든 키 저장소는 생성 시점에 지정한 비밀번호를 가지며, 사용자 지정 비밀번호를 잊어버렸을 때 복구할 방법은 없습니다. 반드시 안전한 곳에 보관하세요.

keytool로 키 저장소 비밀번호 변경하기

키 저장소의 비밀번호는 keytool -storepasswd로 변경합니다. 실제 사용 중인 키 저장소라면 대화형으로 명령을 실행하세요. keytool -storepasswd -keystore /path/to/keystore.jks에서 /path/to/keystore.jks를 실제 파일 경로로 바꿔 실행하면, 비밀번호가 셸 히스토리에 남는 대신 프롬프트에서 직접 입력됩니다. keytool는 먼저 Enter keystore password: 프롬프트로 현재 비밀번호(수정되지 않은 cacerts 파일이라면 changeit)를 묻고, 이어서 New keystore password:와 Re-enter new password:로 새 비밀번호를 두 번 입력받습니다.

몇 가지 주의할 점이 있습니다.

  • -keystore에는 애플리케이션이 실제로 로드하는 파일을 정확히 지정하세요. JDK 버전과 배포판마다 레이아웃이 다르므로 JAVA_HOME/jre/lib/security/cacerts라는 고정된 경로를 가정해서는 안 됩니다.
  • -storepass와 -new 옵션은 비대화형 사용을 위해 현재 비밀번호와 새 비밀번호를 명령 인수로 받습니다. 이 경우 비밀번호가 셸 히스토리와 프로세스 목록에 노출되므로, 일회용 파일이나 보안이 확보된 자동화 환경에서만 사용하세요.
  • 대화형 실행은 입력을 받기 위해 멈추므로, 아래 스크립트는 일회용 자체 서명 인증서로 만든 임시 파일에서 동일한 -storepasswd 작업을 무인으로 수행합니다.

다음 예제를 실행해 보세요.

이 섹션의 코드와 표시되는 레이블 또는 출력은 영어로 유지됩니다.

set -e
TMP="$(mktemp -d)"
cat > "$TMP/demo.crt" <<'PEM'
-----BEGIN CERTIFICATE-----
MIIC/zCCAeegAwIBAgIUa9tUIt8iYx/aaMtcdywj4SboyakwDQYJKoZIhvcNAQEL
BQAwDzENMAsGA1UEAwwEZGVtbzAeFw0yNjEwMzAxMjIyMjRaFw0zNjEwMjcxMjIy
MjRaMA8xDTALBgNVBAMMBGRlbW8wggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEK
AoIBAQCsMo66EXV3Ic75iT7RamlTZYn3RkhqEAKYHNLDe1pIf4ovN0tDhoP1Ce99
BtP6UNLds86BLB9S9n+LHwOsdu5NxerqXGLY3+6n3LpQRy+nH1iCO+j+W51xhqN7
JCpu7ckwCGd1lWcFFInIRhQ7oNsobbTI5NB+k84Kh+U5cyr5eYVCvbvROi/l5P0J
wyaggYOKn8l+33kmBOopXso2I7FRcSXLNYQkQBw/oCjikpdWR/RwtwLZuxssOP3Y
GsFZYVqPjkDt2WcUSuM+CoFFNudQXkI4V3OQTe4P5tFNATOV+uwmHFIKvcaEv9W5
/SckhD979tYNikl/9TzSmeqP8XdNAgMBAAGjUzBRMB0GA1UdDgQWBBQBwJRi578D
+rJwBEsFH2kk4q42/zAfBgNVHSMEGDAWgBQBwJRi578D+rJwBEsFH2kk4q42/zAP
BgNVHRMBAf8EBTADAQH/MA0GCSqGSIb3DQEBCwUAA4IBAQBspuqrqHp3p4TKiuZm
Rh0xsR2PTjP/IycwWwNXK0F7zUgvEIw49o3QSgaOBz1x+DDGYQ0mjUZo6WlJ2A6z
vaYp13E7y40maTxccMS3UEzkJx7A0p9JkbrK+HwBLHN85YUwn/A1BW197+9eJpET
ilivdUYGUfBzcNS4dwk8YjDCJmycy/5KqN8xp4jFX9NN0aHT28SkmYzMrXJS/6qV
bdS6KoKbZJ+4BGPSS4G2JthX8oD85Ve/6AquFX25FpIomUgW7u9f3TQXsgS/Y3mx
bnDIVFsuA+E23baxwOq+LfBUcGSWbtwnt+ftarRmebfiE/3GZQ7aim7xHgKQxtYe
7YVQ
-----END CERTIFICATE-----
PEM
keytool -importcert -alias demo -file "$TMP/demo.crt" \
  -storetype JKS -keystore "$TMP/demo.jks" \
  -storepass changeit -noprompt > /dev/null 2>&1
keytool -storepasswd -keystore "$TMP/demo.jks" -storetype JKS \
  -storepass changeit -new newStorePass1 2>/dev/null
echo "keystore password changed"
keystore password changed

이 스크립트는 실제 기본값과 동일하게 시작 비밀번호가 changeit인 새 JKS 키 저장소에 일회용 인증서를 가져온 다음, 프롬프트 없이 저장소 비밀번호를 newStorePass1로 변경합니다. 인증서를 가져오는 방식은 데모를 빠르고 프롬프트 없이 진행하기 위한 것이며, 실제 키 저장소에서는 위에서 설명한 대화형 프롬프트 방식을 사용하는 것이 좋습니다. 예제 코드와 출력에 표시되는 프롬프트와 레이블은 원본과 동일하게 영어로 유지됩니다.

새 키 저장소 비밀번호 확인하기

새 비밀번호로 키 저장소 내용을 나열해 변경을 확인할 수 있습니다. keytool -list -keystore /path/to/keystore.jks를 실행하면 Enter keystore password: 프롬프트가 표시되고, 비밀번호가 맞으면 키 저장소 유형과 항목들이 출력됩니다. 비대화형으로 실행할 때는 -storepass로 비밀번호를 전달합니다.

다음 예제를 실행해 보세요.

이 섹션의 코드와 표시되는 레이블 또는 출력은 영어로 유지됩니다.

set -e
TMP="$(mktemp -d)"
cat > "$TMP/demo.crt" <<'PEM'
-----BEGIN CERTIFICATE-----
MIIC/zCCAeegAwIBAgIUa9tUIt8iYx/aaMtcdywj4SboyakwDQYJKoZIhvcNAQEL
BQAwDzENMAsGA1UEAwwEZGVtbzAeFw0yNjEwMzAxMjIyMjRaFw0zNjEwMjcxMjIy
MjRaMA8xDTALBgNVBAMMBGRlbW8wggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEK
AoIBAQCsMo66EXV3Ic75iT7RamlTZYn3RkhqEAKYHNLDe1pIf4ovN0tDhoP1Ce99
BtP6UNLds86BLB9S9n+LHwOsdu5NxerqXGLY3+6n3LpQRy+nH1iCO+j+W51xhqN7
JCpu7ckwCGd1lWcFFInIRhQ7oNsobbTI5NB+k84Kh+U5cyr5eYVCvbvROi/l5P0J
wyaggYOKn8l+33kmBOopXso2I7FRcSXLNYQkQBw/oCjikpdWR/RwtwLZuxssOP3Y
GsFZYVqPjkDt2WcUSuM+CoFFNudQXkI4V3OQTe4P5tFNATOV+uwmHFIKvcaEv9W5
/SckhD979tYNikl/9TzSmeqP8XdNAgMBAAGjUzBRMB0GA1UdDgQWBBQBwJRi578D
+rJwBEsFH2kk4q42/zAfBgNVHSMEGDAWgBQBwJRi578D+rJwBEsFH2kk4q42/zAP
BgNVHRMBAf8EBTADAQH/MA0GCSqGSIb3DQEBCwUAA4IBAQBspuqrqHp3p4TKiuZm
Rh0xsR2PTjP/IycwWwNXK0F7zUgvEIw49o3QSgaOBz1x+DDGYQ0mjUZo6WlJ2A6z
vaYp13E7y40maTxccMS3UEzkJx7A0p9JkbrK+HwBLHN85YUwn/A1BW197+9eJpET
ilivdUYGUfBzcNS4dwk8YjDCJmycy/5KqN8xp4jFX9NN0aHT28SkmYzMrXJS/6qV
bdS6KoKbZJ+4BGPSS4G2JthX8oD85Ve/6AquFX25FpIomUgW7u9f3TQXsgS/Y3mx
bnDIVFsuA+E23baxwOq+LfBUcGSWbtwnt+ftarRmebfiE/3GZQ7aim7xHgKQxtYe
7YVQ
-----END CERTIFICATE-----
PEM
keytool -importcert -alias demo -file "$TMP/demo.crt" \
  -storetype JKS -keystore "$TMP/demo.jks" \
  -storepass changeit -noprompt > /dev/null 2>&1
keytool -storepasswd -keystore "$TMP/demo.jks" -storetype JKS \
  -storepass changeit -new newStorePass1 2>/dev/null
keytool -list -keystore "$TMP/demo.jks" -storetype JKS \
  -storepass newStorePass1 > "$TMP/demo.list" 2>/dev/null
grep "keystore contains" "$TMP/demo.list"
Your keystore contains 1 entry

grep은 실제 목록 출력에서 항목 수를 나타내는 줄만 출력합니다. 목록이 성공적으로 출력되면 새 비밀번호가 해당 파일을 여는 데 유효하다는 것이 확인됩니다. keytool가 비밀번호를 거부했다면 명령이 실패했을 것입니다. 다만 이것이 키 저장소의 내용이 예상과 일치하는지, 또는 이를 사용하는 애플리케이션이 올바르게 구성되었는지까지 보증하는 것은 아닙니다. 보안 감사가 아닌 접근 확인 절차로 이해하세요.

중요한 제한 사항과 보안 수칙

키 저장소 비밀번호 변경은 키 저장소를 보호하는 여러 작업 중 하나일 뿐입니다. 다음 사항을 기억하세요.

  • 추측하기 어려운 고유한 비밀을 사용하세요. 다른 곳에서 재사용하는 패턴보다는 생성된 값이나 긴 패스프레이즈가 낫습니다. keytool는 짧은 비밀번호도 경고만 표시하고 허용하므로, 최소 요건을 맞추는 것 자체가 보안 목표는 아닙니다.
  • 키 저장소 비밀번호는 키 비밀번호와 다릅니다. -storepasswd는 저장소를 여는 비밀번호만 변경합니다. 개인 키 항목은 -keypasswd로 관리하는 별도의 비밀번호를 가지며, 두 비밀번호가 같아야 한다고 가정하는 도구도 있고 별개로 취급하는 도구도 있습니다. 하나만 변경하기 전에 사용 중인 도구의 동작을 확인하세요.
  • 비밀번호뿐 아니라 파일 자체도 보호하세요. 키 저장소 백업은 안전한 위치에 보관하고, 꼭 필요한 계정만 읽을 수 있도록 파일 시스템 권한을 제한하며, 해당 파일에 대해 keytool를 실행할 수 있는 사람도 제한하세요.
  • 이유가 있을 때만 교체하세요. 노출이 의심되거나 담당 인력이 바뀐 경우에 비밀번호를 변경하면 됩니다. 고정된 주기로 무조건 교체하는 것이 항상 이롭지는 않습니다.

비밀번호 변경만으로 애플리케이션이 안전해지는 것은 아닙니다. 보호된 백업, 엄격한 접근 제어, 비밀 자체의 적절한 보관을 함께 적용하세요.