.cer 인증서를 Java 키 저장소로 가져 오는 방법은 무엇입니까?


226

Java 웹 서비스 클라이언트를 개발하는 동안 문제가 발생했습니다. 웹 서비스 인증은 클라이언트 인증서, 사용자 이름 및 비밀번호를 사용합니다. 웹 서비스 뒤에있는 회사에서받은 클라이언트 인증서의 .cer형식 이 다릅니다 . 텍스트 편집기를 사용하여 파일을 검사하면 다음 내용이 있습니다.

-----BEGIN CERTIFICATE-----
[Some base64 encoded data]
-----END CERTIFICATE-----

Internet Explorer에서이 파일을 인증서로 가져 와서 (암호를 입력하지 않아도 됨) 웹 서비스에서 인증하는 데 사용할 수 있습니다.

먼저 첫 번째 줄과 마지막 줄을 제거하고 유닉스 개행으로 변환하고 base64 디코딩을 실행하여이 인증서를 키 저장소로 가져올 수있었습니다. 결과 파일을 keytool명령을 사용하여 키 저장소로 가져올 수 있습니다 . 키 저장소에 항목을 나열하면이 항목은 유형 trustedCertEntry입니다. 이 항목 유형 (?)으로 인해이 인증서를 사용하여 웹 서비스를 인증 할 수 없습니다. 제공된 인증서가 인증에 사용되는 공용 인증서라고 생각하기 시작했습니다 ...

내가 찾은 해결 방법은 IE에서 인증서를 가져 와서 .pfx파일 로 내보내는 것 입니다. 이 파일은 키 저장소로로드 될 수 있으며 웹 서비스를 인증하는 데 사용될 수 있습니다. 그러나 고객이 새 인증서를받을 때마다 이러한 단계를 수행 할 것으로 기대할 수 없습니다. 그래서 .cer파일을 Java로 직접 로드하고 싶습니다 . 이견있는 사람?

추가 정보 : 웹 서비스 뒤에있는 회사는 나중에 인증서를 가져올 PC 및 사용자에게 인증서를 요청해야한다고 IE와 웹 사이트를 사용하여 알려줍니다.

답변:


317
  • 인증하려면 개인 키가 필요합니다. 다른 옵션은 없습니다.
  • 인증서는 추가 속성 (예 : 회사 이름, 국가 등)이있는 공개 키로, 첨부 된 속성이 사실임을 보증하는 일부 인증 기관에서 서명합니다.
  • .CER파일은 인증서이며 개인 키가 없습니다. 개인 키는.PFX keystore 일반적으로 파일 됩니다. 실제로 인증 한 경우 개인 키를 이미 가져 왔기 때문입니다.
  • 일반적으로 .CER문제없이 인증서를 가져올 수 있습니다

    keytool -importcert -file certificate.cer -keystore keystore.jks -alias "Alias" 

3
개인 키가 IE 플러그인에 의해 생성되고 있음을 나타냅니다. 현재 유일한 해결책은 IE에서 인증서를 가져오고 .pfx 파일을 내보내는 것입니다.
Jan-Pieter

5
.CER 파일에는 공개 키가 있습니다. 개인 키가 없습니다. 편집 제안 ..
KyleM

6
별명은 여기서 무엇을합니까?

5
:(-> keytool 오류 : java.lang.Exception : X.509 인증서가 아님
necromancer

1
@hop Java 키 저장소에는이를 식별하기 위해 별명이 다른 여러 인증서가있을 수 있습니다. 이를 참조로 사용하여 식별하거나 별명으로 프로그래밍 방식으로 검색 할 수 있습니다.
lujop

85

.cer브라우저에서 다운로드 한 인증서 파일 (url을 열고 세부 정보를 보려면 dig)을 cacerts 키 저장소 로 가져 오면 java_home\jre\lib\security내 키 저장소를 생성하여 사용하려는 것과는 대조적으로 제게 도움이되었습니다.

  1. 당신의 java_home\jre\lib\security
  2. ( Windows ) cmdCTRL+를 사용하여 관리자 명령 줄을 엽니 다.SHIFT +를ENTER
  3. keytool을 실행하여 인증서를 가져 오십시오.
    • (대체 yourAliasName하고 path\to\certificate.cer각각)

 ..\..\bin\keytool -import -trustcacerts -keystore cacerts -storepass changeit -noprompt -alias yourAliasName -file path\to\certificate.cer

이 방법으로 추가 JVM 옵션을 지정할 필요가 없으며 JRE에서 인증서를 인식해야합니다.


path \ to \ cert. 파일이 데스크탑에있는 경우 어떻게 경로를 지정할 수 있습니까? C : / user / desktop / 또는 ../../../../desktop/ 파일 이름
Jesse

MacOS / Linux에서이 명령은 sudo와 함께 작동합니다. 감사. 그러나 noprompt param은 무엇입니까? 나는 그것을 사용하지 않고 여전히 성공했습니다.
Evgeniy Mishustin

개발에 JDK를 사용할 때 올바른 경로는 java_home\jdk_x.xx\jre\lib\security 절대 경로입니다. 백 슬래시를 사용하십시오. 예를 들어 "C:\myCert.crt"경로에 공백이없는 경우 따옴표는 선택 사항입니다.
jp-jee

백만 번 감사합니다.
vikingsteve

질문 : 개인 키는 어떻습니까? 클라이언트 인증서에 대한 설명입니다. 내 이해는 개인 키로 CSR을 만든 다음 원격 웹 사이트 회사에서 클라이언트 인증서를 받고 클라이언트 인증서를 개인 키와 일치시켜야한다는 것입니다. 귀하의 답변에 개인 키에 대한 언급이없는 것 같습니다. 그냥 물어 보는 건데.
user2367418 2016 년

51

다음은 프로그래밍 방식으로 .cer 파일을 새 KeyStore로 가져 오는 데 사용했던 코드입니다.

import java.io.BufferedInputStream;
import java.io.IOException;
import java.io.InputStream;
//VERY IMPORTANT.  SOME OF THESE EXIST IN MORE THAN ONE PACKAGE!
import java.security.GeneralSecurityException;
import java.security.KeyStore;
import java.security.cert.Certificate;
import java.security.cert.CertificateFactory;

//Put everything after here in your function.
KeyStore trustStore  = KeyStore.getInstance(KeyStore.getDefaultType());
trustStore.load(null);//Make an empty store
InputStream fis = /* insert your file path here */;
BufferedInputStream bis = new BufferedInputStream(fis);

CertificateFactory cf = CertificateFactory.getInstance("X.509");

while (bis.available() > 0) {
    Certificate cert = cf.generateCertificate(bis);
    trustStore.setCertificateEntry("fiddler"+bis.available(), cert);
}

20

인증서를 변경할 필요가 없습니다. 올바른 가져 오기 명령을 실행하고 있습니까?

다음은 나를 위해 작동합니다.

keytool -import -alias joe -file mycert.cer -keystore mycerts -storepass changeit

mycert.cer에는 다음이 포함됩니다.

-----BEGIN CERTIFICATE-----
MIIFUTCCBDmgAwIBAgIHK4FgDiVqczANBgkqhkiG9w0BAQUFADCByjELMAkGA1UE
BhMCVVMxEDAOBgNVBAgTB0FyaXpvbmExEzARBgNVBAcTClNjb3R0c2RhbGUxGjAY
...
RLJKd+SjxhLMD2pznKxC/Ztkkcoxaw9u0zVPOPrUtsE/X68Vmv6AEHJ+lWnUaWlf
zLpfMEvelFPYH4NT9mV5wuQ1Pgurf/ydBhPizc0uOCvd6UddJS5rPfVWnuFkgQOk
WmD+yvuojwsL38LPbtrC8SZgPKT3grnLwKu18nm3UN2isuciKPF2spNEFnmCUWDc
MMicbud3twMSO6Zbm3lx6CToNFzP
-----END CERTIFICATE-----

2
수정되지 않은 인증서를 키 저장소로 가져 오려고하면 "keytool 오류 : java.lang.Exception : X.509 인증서가 아닙니다"라는 오류가 발생합니다. 내 게시물에 설명 된 방식으로 인증서를 수정 한 후 사용자와 비슷한 명령으로 오류없이 인증서를 가져올 수 있습니다. 그러나 trustedCertEntry로 가져 와서 웹 서비스에 액세스 할 때는 사용되지 않습니다.
Jan-Pieter

질문에 예외를 명령으로 추가 할 수 있습니까? 가져 오기 명령에 별명을 지정 하시겠습니까?
dogbane

Windows를 사용하는 경우 관리자
권한

9

keystore-explorer.org 에서 오픈 소스 GUI 도구를 사용할 수 있습니다.

키 스토어 탐색기

KeyStore Explorer는 Java 명령 행 유틸리티 keytool 및 jarsigner를 대체하는 오픈 소스 GUI입니다. KeyStore Explorer는 직관적 인 그래픽 사용자 인터페이스를 통해 기능 등을 제공합니다.

다음 화면이 도움이 될 것입니다 (공식 사이트에서 제공)

명령을 실행하여 얻는 기본 화면 :

shantha@shantha:~$./Downloads/kse-521/kse.sh

여기에 이미지 설명을 입력하십시오

ExamineExamine a URL옵션으로 이동 한 다음 가져올 웹 URL을 제공하십시오.

Google 사이트 링크를 제공하면 결과 창은 아래와 같습니다. 여기에 이미지 설명을 입력하십시오

이것은 유스 케이스 중 하나이며 나머지는 사용자에게 달려 있습니다 (모든 크레딧은 keystore-explorer.org 로 이동하십시오 )


7

이미 가지고있는 인증서는 아마도 서버의 인증서이거나 서버의 인증서에 서명하는 데 사용 된 인증서 일 것입니다. 웹 서비스 클라이언트가 서버를 인증 할 수 있도록해야합니다.

그러나 SSL을 사용하여 클라이언트 인증을 추가로 수행해야하는 경우 웹 서비스 클라이언트를 인증하려면 자체 인증서를 가져와야합니다. 이를 위해 인증서 요청을 작성해야합니다. 이 과정에는 자체 개인 키와 해당 공개 키를 생성하고 해당 공개 키와 일부 정보 (이메일, 이름, 도메인 이름 등)를 인증서 요청이라는 파일에 첨부하는 과정이 포함됩니다. 그런 다음 해당 인증서 요청을 이미 요청한 회사에 보내면 개인 키로 공개 키에 서명하여 인증서를 만들고 인증서와 함께 X509 파일을 다시 보내줍니다. 이제 키 저장소에 추가하면 클라이언트 인증이 필요한 SSL을 사용하여 웹 서비스에 연결할 수 있습니다.

인증서 요청을 생성하려면 "keytool -certreq -alias -file -keypass -keystore"를 사용하십시오. 결과 파일을 서명 할 회사로 보냅니다.

인증서를 받으면 "keytool -importcert -alias -keypass -keystore"를 실행하십시오.

키 스토어가 보호되어있는 경우 두 가지 경우 모두 -storepass를 사용해야합니다 (좋은 아이디어).


5

다음은 현재 디렉토리의 많은 crt 파일을 Java 키 저장소로 일괄 가져 오기하는 데 사용한 스크립트입니다. 이것을 인증서와 같은 폴더에 저장하고 다음과 같이 실행하십시오.

./import_all_certs.sh

import_all_certs.sh

KEYSTORE="$(/usr/libexec/java_home)/jre/lib/security/cacerts";

function running_as_root()
{
  if [ "$EUID" -ne 0 ]
    then echo "NO"
    exit
  fi

  echo "YES"
}

function import_certs_to_java_keystore
{
  for crt in *.crt; do 
    echo prepping $crt 
    keytool -import -file $crt -storepass changeit -noprompt --alias alias__${crt} -keystore $KEYSTORE
    echo 
  done
}

if [ "$(running_as_root)" == "YES" ]
then
  import_certs_to_java_keystore
else
  echo "This script needs to be run as root!"
fi

1

이것이 나를 위해 일한 방법은 다음과 같습니다.

  1. 텍스트 편집기에서 다음 형식으로 인증서 데이터를 .txt로 저장하십시오.

    ----- BEGIN CERTIFICATE ----- [Microsoft에서 직렬화 된 데이터] ----- END CERTIFICATE -----

  2. 크롬 브라우저 열기 (이 단계는 다른 브라우저에서도 작동 할 수 있음) 설정> 고급 설정 표시> HTTPS / SSL> 인증서 관리 1 단계에서 .txt 가져 오기
  3. Base-64로 인코딩 된 형식으로 해당 인증서를 선택하고 내보내십시오. .cer로 저장
  4. 이제 keytool 또는 Portecle을 사용하여 Java 키 저장소로 가져올 수 있습니다
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.