키 저장소 유형 : 어떤 것을 사용할까요?


115

java.security내 파일 을 보면 JRE기본적으로 사용할 키 저장소 유형이로 설정되어 있음을 알 수 JKS있습니다. 여기 에는 사용할 수있는 키 저장소 유형 목록이 있습니다.

권장되는 키 저장소 유형이 있습니까? 다양한 키 저장소 유형의 장단점은 무엇입니까?


4
Java 9부터 PKCS12가 기본 키 저장소 유형입니다. 이 변경 사항은 JEP 229 목표 인 "보안 향상. PKCS12는 JKS보다 강력한 암호화 알고리즘을 제공합니다."에 대한 것입니다. 자세한 내용은 "JEP 229 : 기본적으로 PKCS12 키 저장소 만들기", openjdk.java.net/jeps/229를 참조하십시오 . 마지막 액세스 2018 년 2 월 2 일.
buzz3791

답변:


142

링크 한 표준 이름 목록에 나열된 것보다 몇 가지 더 많은 유형이 있습니다. 암호화 공급자 설명서 에서 자세한 내용을 찾을 수 있습니다 . 가장 일반적인 것은 확실히 JKS(기본값) 및 PKCS12(PKCS # 12 파일의 경우, 종종 확장자가 .p12있거나 때로는 .pfx)입니다.

JKS는 Java 세계에 머무르는 경우 가장 일반적입니다. PKCS # 12는 Java 전용이 아니며 브라우저에서 백업하거나 OpenSSL 기반 도구에서 제공되는 인증서 (개인 키 포함)를 사용하는 것이 특히 편리합니다 (키 keytool저장소를 변환하고 Java 6 이전에 개인 키를 가져올 수 없었습니다). , 그래서 다른 도구를 사용해야했습니다).

이미 PKCS # 12 파일이있는 경우 PKCS12유형을 직접 사용하는 것이 더 쉽습니다 . 형식을 변환 할 수 있지만 키 저장소 유형을 직접 선택할 수있는 경우 거의 필요하지 않습니다.

Java 7에서는 개인 키없이 인증서 항목을 저장할 수 없기 때문에 PKCS12주로 키 저장소 로 유용 했지만 신뢰 저장소에 대해서는 덜 유용했습니다 ( 키 저장소와 신뢰 저장소차이점 참조 ). 반대로 JKS각 항목이 개인 키 항목 일 필요가 없으므로 인증서 만 포함 된 항목을 가질 수 있습니다. 이는 신뢰하는 인증서 목록을 저장하는 신뢰 저장소에 유용합니다. 개인 키).

이것은 Java 8에서 변경되었으므로 이제 PKCS12상점에서도 인증서 전용 항목을 가질 수 있습니다. (이러한 변경 사항 및 추가 계획에 대한 자세한 내용은 JEP 229 : 기본적으로 PKCS12 키 저장소 만들기 에서 찾을 수 있습니다 .)

컨텍스트에 따라 덜 자주 사용되는 몇 가지 다른 키 저장소 유형이 있습니다.

  • PKCS11, PKCS # 11 라이브러리의 경우 일반적으로 하드웨어 암호화 토큰에 액세스하지만 Sun 공급자 구현은이를 통해 Mozilla의 NSS 저장소도 지원합니다.
  • BKS, BouncyCastle 공급자 (일반적으로 Android에 사용됨)를 사용합니다.
  • Windows-MY/ Windows-ROOT, Windows 인증서 저장소에 직접 액세스하려는 경우.
  • KeychainStore, OSX 키 체인을 직접 사용하려는 경우.

7
@husayt, PEM 인증서는 키 저장소 유형으로 직접 지원되지 않습니다 ( KeyStore그 효과에 대한 구현을 작성할 수 있다고 가정 합니다). 그러나 ( 이 답변에CertificateFactory 표시된 것처럼 ) 메모리의 키 저장소 인스턴스 (일반적으로 JKS, 기본 유형)로 즉석에서로드 할 수 있습니다 .
Bruno

나는 생각 JKS으로 변경되었습니다JCEKS
amphibient

5
오히려 JKS 키 저장소는 비밀 키를 저장할 수 없습니다. 이 사용 사례의 경우 JCEKS가 적합합니다. 답변에서 이것을 언급 할 가치가 있습니다.
Duncan Jones

1
확인. Java 8에서는 문제없이 단일 인증서로 PKCS # 12 키 저장소를 만들 수 있습니다. P12의 경우 인증서 항목은 암시 적으로 신뢰됩니다. 신뢰할 수없는 인증서가 필요한 경우 여러 키 저장소가있는 체계로 되돌려 야 할 수 있습니다.
Maarten Bodewes

2
적어도 Java 8의 경우 OK PKCS # 12 키 저장소는 여전히 비밀 키 항목을 저장할 수 없습니다 . 그러한 키 저장소 (ugh)를 저장할 때 널 포인터 예외가 발생합니다. 아마도 연관된 인증서를 찾을 수 없기 때문일 것입니다. 누군가가 Fail Fast 코드에 대한 Joshua의 가르침을 건너 뛴 것 같습니다.
Maarten Bodewes

22

다음은 Java의 다양한 유형의 키 저장소와 다양한 유형의 키 저장소 간의 차이점을 소개하는 게시물입니다. http://www.pixelstech.net/article/1408345768-Different-types-of-keystore-in-Java---- 개요

다음은 게시물의 여러 키 저장소에 대한 설명입니다.

JKS, Java 키 저장소. 이 파일은 sun.security.provider.JavaKeyStore에서 찾을 수 있습니다. 이 키 저장소는 Java에만 해당되며 일반적으로 jks의 확장자를 갖습니다. 이 유형의 키 저장소는 개인 키와 인증서를 포함 할 수 있지만 비밀 키를 저장하는 데 사용할 수 없습니다. Java 전용 키 저장소이므로 다른 프로그래밍 언어에서 사용할 수 없습니다.

JCEKS, JCE 키 저장소. 이 파일은 com.sun.crypto.provider.JceKeyStore에서 찾을 수 있습니다. 이 키 저장소에는 jceks의 확장자가 있습니다. JCEKS 키 저장소에 넣을 수있는 항목은 개인 키, 비밀 키 및 인증서입니다.

PKCS12, 이것은 Java 및 기타 언어에서 사용할 수있는 표준 키 저장소 유형입니다. 이 키 저장소 구현은 sun.security.pkcs12.PKCS12KeyStore에서 찾을 수 있습니다. 일반적으로 확장자는 p12 또는 pfx입니다. 이 유형에 개인 키, 비밀 키 및 인증서를 저장할 수 있습니다.

PKCS11, 이것은 하드웨어 키 저장소 유형입니다. Luna, nCipher와 같은 하드웨어 키 저장소 장치와 연결하기위한 Java 라이브러리 용 인터페이스를 제공합니다. 이 구현은 sun.security.pkcs11.P11KeyStore에서 찾을 수 있습니다. 키 저장소를로드 할 때 특정 구성으로 특정 공급자를 만들 필요가 없습니다. 이 키 저장소는 개인 키, 비밀 키 및 인증서를 저장할 수 있습니다. 키 저장소를로드 할 때 항목은 키 저장소에서 검색된 다음 소프트웨어 항목으로 변환됩니다.


@ peci1 이러한 키 저장소를 사용하는 방법에 대한 자습서를 작성할 계획입니다. 지금까지 내가 JKS에 대해 하나 개의 게시물을 작성한에서 찾을하시기 바랍니다 pixelstech.net/article/...
PixelsTech

@PixelsTech 나는 이것을 발견했고 나머지는 어디 있는지 궁금했다 :) 그래서 나는 계속 지켜 볼 것이다;) 감사합니다
Martin

1
@ peci1 오늘 JCEKS와 PKCS12를 다루었습니다. PKCS11의 경우 하드웨어 및 추가 구성이 필요하므로 구성하는 데 더 많은 시간이 필요합니다. pixelstech.net/article/…pixelstech.net/article/…
PixelsTech

와우, 그것은 번개 속도입니다! 매우 감사합니다.
Martin Pecka

5

Java 8 이상을 사용하는 경우 PKCS12Java 9 ( JEP 229 ) 이후 기본값 인을 선택해야합니다 .

과 비교되는 장점 은 다음 JKSJCEKS같습니다.

  • 비밀 키, 개인 키 및 인증서를 저장할 수 있습니다.
  • PKCS12표준 형식이며 다른 프로그램 및 라이브러리에서 읽을 수 있습니다. 1
  • 향상된 보안 : JKS그리고 JCEKS꽤 불안. 이는 특히 Android 개발자에게 인기있는 이러한 키 저장소 유형의 무차별 암호 대입 암호를위한 여러 도구에서 확인할 수 있습니다. 2, 3

1 Java 11에서 수정 된 JDK-8202837 이 있습니다.

2 모든 키 저장소 유형 (PKCS12 포함)에서 사용되는 PBE의 반복 횟수는 다소 주 였지만 ( CVE-2017-10356 ) 9.0.1, 8u151, 7u161 및 6u171에서 수정되었습니다.

3 추가 정보 :

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.