2009-10-30 4 views
8

요약 : Java 코드를 사용하여 Java에 새 루트 인증서를 설치하려면 어떻게합니까?keytool 명령 줄 유틸리티를 사용하지 않고 새 Java CA 인증서를 가져 오는 방법은 무엇입니까?

Google은 다양한 웹 서비스에 액세스하는 데스크톱 응용 프로그램을 보유하고 있습니다. 최근에 한 명은 SSL 인증서를 Trustwave가 서명 한 인증서로 전환했습니다. Trustwave는 SSL 인증서는 일반 인터넷 브라우저를 사용할 수 있으며, 자바는 필수 루트 인증서와 함께하지 않는 것, 우리는 다음과 같은 오류 메시지와 함께 특정 웹 서비스에 대한 액세스 손실 : 우리는 임시을 가지고

javax.net.ssl.SSLHandshakeException: sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target 

을 공급자가 Verisign으로 다시 전환하도록 유도함으로써 회피하지만, 다시 전환 할 때는 준비가되어야합니다. 따라서 필요에 따라 Trustwave 루트 인증서를 자동으로 설치하려면 데스크톱 소프트웨어가 필요합니다. 우리 고객은 keytool 명령을 사용하기에 충분히 숙련되어 있지 않으며 취약한 솔루션 (Mac과 PC를위한 별도의 구현, Vista 실행 제한에 대한 투쟁, 올바른 JRE를 설치하는 데 어려움을 겪는 문제)로 나를 공격하기 때문에 스크립트를 쓰지 않을 것입니다. , 등).

keytool이 Java를 내부적으로 사용한다고 생각합니다. keytool의 기능을 복제하고 루트 인증서를 프로그래밍 방식으로 설치하려면 Java에서 어떤 명령을 사용할 수 있습니까?

답변

2

가능한지 모르겠지만이 연결이나이 CA를 허용하도록 자체 TrustManager를 구현할 수 있습니다. Here이 기본입니다.

+0

그건 우리에게 도움이 될 수 있습니다. 이 링크는 우리가 정확히 원하는 바가 아닌 검증을 완전히 불가능하게하는 방법을 제안하지만, 보통의 TrustManager가 모든 정규 루트 인증서에 하나를 더한 것을 만드는 것을 허용 할 수는 있습니다. 고마워,이게 유망 해 보인다. –

0

데스크톱 컴퓨터의 신뢰할 수있는 루트 키 저장소에 인증서를 설치하려면 해당 권한을 필요로합니다. keytool의 경우와 마찬가지로 신뢰할 수있는 루트의 키 저장소에 액세스하려면 비밀번호가 필요합니다. 당신이 빠른 앤 더러운 싶은 경우에, 당신은

  • 파일 또는 바이트 스트림 또는 무엇이든에 인증서를 쓸 수
  • 수입 KeyTool 클래스 (sun.security.tools.KeyTool)

그러나 이럴 경우를 사용하여 인증서가 유효하지 않은 경우 신뢰할 수 없습니다. 나는 거기에 좋은 이유가 있다고 말하고 싶다.

+0

Firefox와 Internet Explorer에 따라 유효합니다. 자바는 운영체제를 제공하는 대신 자체 키 스토어를 제공합니다. 자바 버전에는 SSL 시장에 최신 커맨드가 포함되어 있지 않은 것으로 보입니다. –

+0

합리적인 경우가 있습니다. 회사에서 내부적으로 자체 CA를 사용합니다. 기본적으로 신뢰할 수는 없습니다 (브라우저 등). 이 CA 인증서를 가져 오는 것은 모든 곳에서 단일 인증서에 대한 예외를 추가하는 것보다 훨씬 쉽습니다. – sfussenegger

1

썬은 주로 개발자가 신뢰할 수있는 CA 집합을 수정하지 못하도록 API를 통해 keytool을 노출하지 않았습니다. 나는 그러한 코드를 악용 한 공격자들이 트러스트 스토어의 모델을 손상시키는 트러스트 스토어에 자신의 루트 인증서를 삽입하는 것을 상상할 수 있습니다.

실제로 KeyTool 클래스 (sun.security.tools 패키지)의 소스를 보면 최종 버전 일뿐만 아니라 호출자가 KeyTool 클래스의 인스턴스를 만들지 못하게하는 개인 생성자도 있습니다. 암호. KeyTool에는 CommandTool (따라서 OS 사용자)이 KeyTool을 초기화하고 통신 할 수있는 유일한 방법 일 수있는 주요 방법이 있습니다.

유일한 (단순한)이 될 것입니다 왼쪽 접근 방법 :

  • 응용 프로그램에서 프로세스로 키 도구 초기화 및 루트 CA 인증서를 설치하는 명령 행 인수를 전달합니다. 이것만으로는 좋은 생각이 아니므로 사용자에게 발생하는 사항을 알리는 것이 좋습니다.
  • keytool을 사용하지 말고 Keyman 또는 KeyTool IUI을 사용하여 루트 CA를 설치하는 방법에 대한 지침을 사용자에게 제공하십시오. 여기서 나 자신을 위해 말하면, 나는 후자를 선호한다.
+1

사용자의 기술 수준에 대한 자동 질문이 없으면 "응용 프로그램이 고장났습니다."라는 지원 질문에서 벗어날 수있는 유일한 옵션입니다. –

+0

응용 프로그램이 키 스토어를 수정할 수 있는지 여부에 대한 철학적 질문에 대해서는 물론 대답이 있어야합니다. 그렇지 않으면 키 도구 자체가 작동하지 않을 수 있습니다. 운영에 대한 액세스는 보안 관리자가 제어 할 수 있습니다. 아아아, 나는 빗 나간다. 이것의 뒤에 디자인 결정은 실용적인 해결책을 찾기만큼 중요하지 않다. 포인터를 주셔서 감사드립니다. –

+3

나는 당신이 원하는 모든 루트 CA를 포함 할 수있는 자신의 트러스트 스토어를 사용하여 다른 대안을 언급하는 것을 잊어 버렸습니다. javax.net.ssl.trustStore 속성을 통해 해당 트러스트 스토어를 사용하도록 JVM을 가져올 수 있습니다. –

1

언제든지 Runtime.exec(...) 프로세스로 KeyTool을 호출 할 수 있습니다.

0

Command-line solution. Mac의 Java 홈은/Library/Java/Home입니다. 시도 : 경로와

$ sudo -i 
# cd /Library/Java/Home 
# keytool -import -trustcacerts -alias CAName -file CA.crt -keystore lib/security/cacerts 

대용하여 CA의 이름 CAName 및 CA.crt를 인증서 파일 (PEM 작동). 키 저장소 비밀번호를 묻는 메시지가 표시됩니다. 기본 암호는 링크 된 기사에서 제공됩니다.

RapidSSL의 CA 인증서 중 하나에 대해이 작업을 수행해야했습니다. 현재 디렉토리에

https://code.google.com/p/java-use-examples/source/browse/trunk/src/com/aw/ad/util/InstallCert.java

새의 cacerts가 지정됩니다 jssecacerts에 :

+0

내가 가장 좋아하는 부분은 keytool을 사용하지 않고 그것을하고 싶다고 말했고 keytool을 사용하라고했다.) –

+0

True. 하지만 Java TrustManager를 작성하고 그 응용 프로그램을 배포하는 것이 혼합 된 환경에서도 keytool을 사용하는 스크립트 솔루션보다 쉽다는 것을 상상할 수 없습니다. – farcepest

0

일 모든 인증서 표시와 HTTPS를 실행하는 대상 호스트에 따라 cacerts 파일의 업데이트 된 버전을 만들려면이 코드를 발표했다. 새 파일을 jre/lib/security/cacerts 파일로 복사하십시오.

새 cacerts 파일의 보안에 대해서는 언급하지 않습니다.

관련 문제