2013-07-17 3 views
67

TLS를 사용하여 Java (내부) 서버에서 사용할 개인/공개 키 쌍을 사용하여 새 Java 키 저장소를 만드는 데 다음 단계를 사용했습니다. 인증서가 자체 서명 된 것을 알주십시오)Java 키 스토어에서 개인 키/공용 인증서 쌍 가져 오기

1)

openssl genrsa -aes256 -out server.key 1024 

2 AES256

으로 키를 생성 CA

openssl req -x509 -sha256 -new -key server.key -out server.csr 

3) 생성 자체 서명 만료 시간에 대한 인증서 요청을 생성 십년

openssl x509 -sha256 -days 3652 -in server.csr -signkey server.key -out selfsigned.crt 

4) KeyStoreExplorer과 같은 프로그램을 사용하여 쌍을 가져옵니다 (priva te 키 및 자체 서명 된 인증서) 새 JKS에서

이 작동하지만 GUI를 사용하지 않고 마지막 단계를 구현하고 싶습니다.

// create the keystore and import the public key. THIS WILL NOT IMPORT THE PRIVATE KEY SO THE KEYSTORE CAN'T BE USED ON THE SERVER TO MAKE THE TLS CONNECTION 
/usr/java/jdk1.6.0_45/bin/keytool -import -alias myservercert -file server.crt -keystore mykeystore.jks 

그래서 질문은 다음과 같습니다 : 나는를 사용하지 않고 자바 키 스토어 및 수입 모두 공개 키 인증서와 개인 키를 만드는 방법을

나는 단지 자체 서명 된 인증서를 가져 오는 방법을 알고 GUI?

+1

어쩌면이 "ImportKey"자바 프로그램이 GUI 없이도 작업을 수행 할 수 있습니다. http://www.agentbob.info/agentbob/79-AB.html – sk2212

+0

대상 시스템이 Java 인 경우 사용할 필요가 없습니다. OpenSSL은 키 도구뿐입니다. 예를 들어, 「JSSE 레퍼런스 가이드」또는 keytool의 툴 문서를 참조 해주세요. – EJP

답변

162

개인 키와 공개 인증서를 사용하여 먼저 PKCS12 키 저장소를 만든 다음 JKS로 변환해야합니다. 당신은 아마 인증서 가져 오기이 단계를 수행 할 것,이 자체 서명 된 인증서 아니었다면

keytool -list -v -keystore mykeystore.jks 

:

# Create PKCS12 keystore from private key and public certificate. 
openssl pkcs12 -export -name myservercert -in selfsigned.crt -inkey server.key -out keystore.p12 

# Convert PKCS12 keystore into a JKS keystore 
keytool -importkeystore -destkeystore mykeystore.jks -srckeystore keystore.p12 -srcstoretype pkcs12 -alias myservercert 

는이 명령을 사용할 수 있으며, JKS의 내용을 확인하려면 신뢰할 수있는 CA 인증서까지 이어지는 체인

+10

http://stackoverflow.com/a/8224863/183622 CA 인증서 및 체인 보존이 필요한 경우이를 포함한보다 철저한 예를 보여줍니다. –

0

키 스토어에는 키 스토어 파일이 필요합니다. KeyStore 클래스에는 FileInputStream이 필요합니다. 그러나 FileInputStream 인스턴스 대신 null을 제공하면 empty keystore will be loaded입니다. 키 스토어를 작성한 후에는 keytool을 사용하여 무결성을 검증 할 수 있습니다.

다음 코드는 빈 암호로 빈 키 스토어를 생성

KeyStore ks2 = KeyStore.getInstance("jks"); 
    ks2.load(null,"".toCharArray()); 
    FileOutputStream out = new FileOutputStream("C:\\mykeytore.keystore"); 
    ks2.store(out, "".toCharArray()); 

키 저장소가 있으면, 인증서를 가져 오는 것은 매우 쉽습니다. 샘플 코드는 this link을 확인하십시오.

+0

이를 수행하기 위해 코드를 작성할 필요는 없습니다. 귀하가 인용 한 링크에 심각한 오류가 있습니다. – EJP

+0

@EJB, 블로그에 대한 귀하의 의견을 보았습니다. 이 작업을 수행하는 데 필요한 코드를 작성할 필요가 없음에 동의합니다. 그러나 프로그래밍 방식으로 수행해야하는 경우에는? – Santosh

+1

또한,'InpputStream.available()'에 대한 여러분의 관찰은 정확하지만'FilterInputStream.available()'은 다음과 같이 말합니다. _이 입력 스트림에서 읽거나 건너 뛸 수있는 바이트 수의 추정치를 반환합니다. 경고가 없습니다! 예제 (블로그)에서,'DataInputStream.available()'은 어디서나 사용되며'FilterInputStream'은'DataInputStream'에 의해 확장됩니다. 이 특별한 경우에'available()'를 사용하는 것이 안전하지 않아야합니까? – Santosh

관련 문제