2012-12-17 2 views
6

먼저 모든 인증서를 수락하면 보안이없는 것으로 간주 될 수 있음을 인정해야합니다. 우리는 "실제"Certs 있지만 우리의 라이브 시스템에만 있습니다. 테스트 시스템의 인증서는 자체 서명되어 있습니다. 그래서 우리가 개발하는 동안 테스트 서버를 사용해야하는데, 이는 무능력한 인증서를 사용하게합니다.자체 서명 SSL 인증서 허용 -> 기본 TrustManager를 설정할 위치

저는 Stackoverflow에서 많은 토픽을 보았습니다. 그리고 모든 시도를하는 모든 웹에서 동일한 작업을 수행합니다. SSL 인증서 수락. 그러나 나는이 질문들 중 어느 것도 대답을 적용하지 않는다. 나는 HTTPSUrlConnections을 망치고 있지 않다. 나는 (clearification에 대한 주석) 코드는 일반적으로 다음과 같습니다 요청을하고있어 경우

는 :

//creates an HTTP-Post with an URL 
HttpPost post = createBaseHttpPost(); 
//loads the request Data inside the httpPost 
post.setEntity(getHttpPostEntity()); 
//appends some Headers like user-agend or Request UUIDs 
appendHeaders(post); 

HttpClient client = new DefaultHttpClient(); 
//mResponse is a custom Object which is returned 
//from the custom ResponseHandler(mResponseHandler) 
mResponse = client.execute(post, mResponseHandler); 
return mResponse; 

은 내가 TrustManagerX509HostnameVerivier 내 자신을 주입해야한다는 읽어 보시기 바랍니다.

private static final TrustManager[] TRUST_ALL_CERTS = new TrustManager[]{ 
     new X509TrustManager() { 

      public X509Certificate[] getAcceptedIssuers() { 
       return new X509Certificate[]{}; 
      } 

      public void checkServerTrusted(X509Certificate[] chain, String authType) 
        throws CertificateException { 
      } 

      public void checkClientTrusted(X509Certificate[] chain, String authType) 
        throws CertificateException { 
      } 
     } 

    }; 

    private static X509HostnameVerifier ACCEPT_ALL_HOSTNAMES = 
      new X509HostnameVerifier() { 

       public void verify(String host, String[] cns, String[] subjectAlts) 
         throws SSLException { 
       } 

       public void verify(String host, X509Certificate cert) throws SSLException { 
       } 

       public void verify(String host, SSLSocket ssl) throws IOException { 
       } 

       public boolean verify(String host, SSLSession session) { 
        return true; 
       } 
      }; 

내가 (클라이언트가 위에서 DefaultHttpClient입니다)

SSLSocketFactory ssl = (SSLSocketFactory)client.getConnectionManager().getSchemeRegistry().getScheme("https").getSocketFactory(); 
ssl.setHostnameVerifier(ACCEPT_ALL_HOSTNAMES); 

응답이 "호스트 이름 ** 일치하지 않습니다"에서 회전과 같은 내 요청 내부의 HostnameVerifier를 주입하는 경우 :이처럼 만들어 "잘못된 요청". 나는 TrustManager를 설정해야만한다고 생각하지만, 내가 요청한 곳의 HttpsUrlConnections를 사용하지 않아서 내 요청에 그것을 설정해야하는 곳이 없다.

+0

어떤 cert (어떤 코드도 제거 할 수없는, 특히 마감 시간이되면 잊어 버릴 수있는 코드)을 추가하는 대신에, 자신 만의 실행을 고려할 수 있습니다 테스트 CA. 테스트 CA 인증서를 트러스트 스토어에서 가져와야하지만 호스트 이름을 포함하여 더 현실적인 테스트입니다 (출시 된 제품에 불량 코드를 남기지 않는 경향이 있음). 작은 CA를 관리하는 데 도움이되는 도구가 있습니다. – Bruno

답변

9

아니요, 유효성 검사를 사용하지 않도록 설정하지 않습니다. 유효성 검사를 올바르게 구현해야합니다. 은 맹목적으로 모든 인증서를 수락하지 마십시오. 아니요, 귀하의 사례가 다른 것은 아닙니다. 안드로이드가 기본적으로 신뢰하지 않는 인증서를 신뢰하면됩니다.

당신은 HttpClient를를 사용하는, 그래서 트러스트 매니저를 설정하기위한 API는 HttpsURLConnection보다 다소 다르지만, 절차는 같습니다 : 신뢰할 수있는 인증서 (서버의 자체 서명 된 인증서와

  1. 로드 키 스토어 파일)
  2. KeyStore으로 초기화하십시오.
  3. 는 SSL 소켓을 만들 때 사용하는 KeyStore 2에서
  4. 설정하여 HTTP 클라이언트 라이브러리를 사용하여 SocketFactory 만듭니다.

이 안드로이드의 문서에 설명되어 있습니다 : http://developer.android.com/reference/org/apache/http/conn/ssl/SSLSocketFactory.html

주제에 대한 더 자세한 기사는 신뢰 저장 파일을 만드는 방법을 보여줍니다 : http://blog.crazybob.org/2010/02/android-trusting-ssl-certificates.html

일부 배경 정보와 예제 코드 : http://nelenkov.blogspot.com/2011/12/using-custom-certificate-trust-store-on.html

이것은 HttpClient를 초기화하는 데 필요한 코드입니다.

KeyStore localTrustStore = KeyStore.getInstance("BKS"); 
InputStream in = getResources().openRawResource(R.raw.mytruststore); 
localTrustStore.load(in, TRUSTSTORE_PASSWORD.toCharArray()); 

SchemeRegistry schemeRegistry = new SchemeRegistry(); 
schemeRegistry.register(new Scheme("http", PlainSocketFactory 
       .getSocketFactory(), 80)); 
SSLSocketFactory sslSocketFactory = new SSLSocketFactory(localTrustStore); 
schemeRegistry.register(new Scheme("https", sslSocketFactory, 443)); 
HttpParams params = new BasicHttpParams(); 
ClientConnectionManager cm = 
    new ThreadSafeClientConnManager(params, schemeRegistry); 

HttpClient client = new DefaultHttpClient(cm, params); 

이 시점에서 모든 인증서를 트러스트 할 이유가 없습니다.만약 당신이 그렇게한다면 :