2010-07-13 6 views
7

자체 서명 된 인증서를 사용하는 SSL로 액세스해야하는 리소스가 있습니다. 일반적으로 대부분의 도구에는 오류없이 또는 경고없이 액세스 할 수있는 간단한 설정이 있습니다. 그러나 JVM에서이를 수행하는 올바른 방법은 서명 인증서를 CA로 키 스토어로 가져 오는 것입니다.그루비에서 자체 서명 된 인증서로 SSL을 사용하는 방법은 무엇입니까?

사용하고 싶은 그루비 스크립트가 있지만 키 스토어를 수정하거나 새로운 키 저장소를 배포하지 않고 모든 JVM에서 독립 실행 형 스크립트를 선호합니다. 인증 확인을 무시하는 간단한 방법이 있습니까?

답변

17

약간의 연구를 거친 후, 나는 this post을 발견했습니다. 다음은 내가 사용을 종료 한 이유입니다.

import javax.net.ssl.HostnameVerifier 
import javax.net.ssl.HttpsURLConnection 
import javax.net.ssl.SSLContext 
import javax.net.ssl.TrustManager 
import javax.net.ssl.X509TrustManager 

def nullTrustManager = [ 
    checkClientTrusted: { chain, authType -> }, 
    checkServerTrusted: { chain, authType -> }, 
    getAcceptedIssuers: { null } 
] 

def nullHostnameVerifier = [ 
    verify: { hostname, session -> true } 
] 

SSLContext sc = SSLContext.getInstance("SSL") 
sc.init(null, [nullTrustManager as X509TrustManager] as TrustManager[], null) 
HttpsURLConnection.setDefaultSSLSocketFactory(sc.getSocketFactory()) 
HttpsURLConnection.setDefaultHostnameVerifier(nullHostnameVerifier as HostnameVerifier) 

위험을 감수하면서 사용하십시오.

+3

일반적으로 hvgotcodes가 더 나은 솔루션입니다. 물론 마일리지가 다를 수 있습니다. 솔루션의 문제점은 모든 호스트가 현재 실제로 사용할 수있는 소수의 호스트가 아닌 유효한 호스트라는 것입니다. 코드가 엄격하게 제어되고 "신뢰할 수있는"소스에만 연결될 것이라는 확신이 든다면 괜찮을 것입니다. 그러나 인증서를 트러스트 스토어로 가져올 경우 DNS 오 검색과 보호해야 할 기타 여러 가지 문제에 취약합니다. 보다 동적 인 동작 인 경우 런타임시 javax.net.ssl.trustStore 속성을 설정할 수도 있습니다. –

+0

일반적으로 동의합니다. 그러나 인증서 관리를 완전히 무시하는 것이 바람직한 스크립팅 컨텍스트가 있습니다. 예를 들어 테스트 서버가 동적으로 생성되고 클라이언트의 키 저장소가 지속적으로 동기화되어야하는 경우가 있습니다. 루비 나 파이썬 같은 다른 동적 인 언어는 이것을 간단한 설정으로 만들고 디폴트로 인증서 체인을 강제하지 않는다는 점도 주목할 가치가 있습니다. – ataylor

+2

@ BrianM.Carr의 의견을 거치지 않고 복사/붙여 넣기를하는 독자를 위해이 코드를 굵은 글씨로 표기 해주십시오 : **이 솔루션은 인증서 확인 단계를 모두 불가능하게하므로 MITM 공격 **에 취약 할 수 있습니다. – Bruno

7

나는이 작업을 통해 grails 앱으로 작업해야했습니다. 키 스토어는 한 번만 처리 할 것입니다. 당신이 인증서를 가지고 있다고 가정하고 키 스토어에 넣은 다음 커맨드 라인 소품을 통해 키 저장소에 자신의 jvm을 지정하십시오. ...

편집 - 키 스토어에 대한 필요성을 피할 방법이 없습니다. 하지만 필요한 인증서 만 있으면 생성하고 앱과 함께 전달할 수 있습니다. 당신은 한번만 할 수 있습니다.

편집 편집 - 여기 명령 줄 프로그램을 curl 전화보다는 기본 그루비/JVM 도구를 사용하는 경우

keytool -import -trustcacerts -alias www.the-domain.com -file the-cert.der -keystore store.jks 

-Djavax.net.ssl.trustStore=/path/to/store.jks 
-4

소품 CL은 키 도구와 자바의 명령은, 당신은 인증서 확인을 해제 할 수 명령 줄에서 다음을 실행하여 사용자를 위해 :

$ echo 'insecure' >>~/.curlrc 
+1

이 게시물은 메타에서 논의되었습니다 : http://meta.stackoverflow.com/questions/266368/why-this-post-is-not-very-low-quality –

+2

@staticx 또한, 특히 안전하지 않습니다. 해당 사용자가'curl '을 사용하여 만든 모든 ** 연결에 영향을 미칩니다. – Bruno

+0

@staticx 흠, 네 말이 맞아, 아마 그가 제안한거야. 수정 된 대답. – ataylor

관련 문제