2011-08-12 3 views
3

localy가 내 컴퓨터에 Apache 2 서버에 설치되었습니다. 먼저 단방향 SSL로 구성하고 Android에서 연결하려고합니다. 내 단방향 SSL Apache 2 서버를 구성하려면 서버 인증서를 만들어야했습니다. 나는 다음의 커멘드로했다 :안드로이드에서의 양방향 SSL : 클라이언트 인증이 작동하지 않음

하려면 openssl genrsa -out은 server.key 2048

하려면 openssl REQ -config ./openssl.cnf -new -key은 server.key -out server.req

OpenSSL을 509 -req -in server.req -CA ca.cer -CAkey ca.key -set_serial 100 -extfile openssl.cnf -Extensions 서버 -days 365 -outform PEM -out server.cer

그런 다음 server.cer 파일을 가져 왔습니다. java keytool을 사용하여 BKS로 변환합니다. Android의 인증이 작동했습니다. 그런 다음 Apache 2 서버 의 양방향 SSL 구성을 계속하고 안드로이드에서 comunicate를 시도했습니다.

하려면 openssl REQ -config ./openssl.cnf -newkey RSA : 나는 ... 작동하도록 을 관리하지 않았다 나는 클라이언트 인증서 만들려면 다음 명령을 사용 2048 -nodes -keyform PEM 을 - KEYOUT ca.key -x509 -days 3650 -Extensions certauth -outform PEM -out ca.cer

하려면 openssl genrsa -out client.key 2048

하려면 openssl REQ -config ./openssl.cnf -new -key client.key-out client.req

ope nssl 509 -req -in client.req -CA ca.cer -CAkey ca.key -set_serial 101 -extfile openssl.cnf -Extensions 클라이언트 -days 365 -outform PEM -out client.cer

에서 OpenSSL PKCS12 - export -inkey client.key -in client.cer -out client.p12

client.p12 파일을 가져온 후 PC 브라우저에서 작동합니다. 안드로이드에서 client.p12 파일을 Portecle 도구를 사용하여 BKS 형식으로 변환했지만 제대로 작동하지 않는 것 같습니다. 변환이 제대로 수행되지 않았을 수 있습니다. 나는 항상 javax.net.ssl.SSLPeerUnverifiedException을 받는다 : 피어 인증서 예외가 없다. 누구든지 문제가 될 수있는 아이디어가 있습니까?

public class SslTestActivity extends Activity { 

@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.main); 

    try { 
     // load truststore certificate 
     InputStream clientTruststoreIs = getResources().openRawResource(
       R.raw.server); 
     KeyStore trustStore = KeyStore.getInstance("BKS"); 
     trustStore.load(clientTruststoreIs, "mypassword".toCharArray()); 

     System.out.println("---- Loaded server certificates: " 
       + trustStore.size()); 



     // load client certificate 
     InputStream keyStoreStream = getResources().openRawResource(
       R.raw.clientt); 
     KeyStore keyStore = KeyStore.getInstance("BKS"); 
     keyStore.load(keyStoreStream, "password".toCharArray()); 
     System.out 
       .println("-------Loaded client certificates: " + keyStore.size()); 


     // initialize SSLSocketFactory to use the certificate 
     SSLSocketFactory socketFactory = new SSLSocketFactory(SSLSocketFactory.TLS, 
       keyStore, "password", trustStore, null, null); 

     // Set basic data 
     HttpParams params = new BasicHttpParams(); 
     HttpProtocolParams.setVersion(params, HttpVersion.HTTP_1_1); 
     HttpProtocolParams.setContentCharset(params, "UTF-8"); 


     // Register http/s shemas! 
     SchemeRegistry schReg = new SchemeRegistry(); 
     schReg.register(new Scheme("http", PlainSocketFactory 
       .getSocketFactory(), 80)); 
     schReg.register(new Scheme("https", socketFactory, 443)); 
     ClientConnectionManager conMgr = new ThreadSafeClientConnManager(
       params, schReg); 
     DefaultHttpClient sClient = new DefaultHttpClient(conMgr, params); 
     try { 
      String res = executeHttpGet(sClient, "https://10.41.0.102/"); 
      System.out.println("------- SSL RESULT IS = " + res); 
     } catch (Exception e) { 
      System.out.println("---- ex " + e.getMessage()); 
      e.printStackTrace(); 
     } 



    } catch (Exception e) { 
     System.out.println("------Exception " + e.getMessage()); 
     e.printStackTrace(); 
    } 
} 

public String executeHttpGet(DefaultHttpClient client, String url) throws Exception { 
    BufferedReader in = null; 
    try { 

     HttpGet request = new HttpGet(); 
     request.setURI(new URI(url)); 
     HttpResponse response = client.execute(request); 

     in = new BufferedReader(new InputStreamReader(response 
       .getEntity().getContent())); 
     StringBuffer sb = new StringBuffer(""); 
     String line = ""; 
     String NL = System.getProperty("line.separator"); 
     while ((line = in.readLine()) != null) { 
      sb.append(line + NL); 
     } 
     in.close(); 
     String result = sb.toString(); 
     return result; 
    } finally { 
     if (in != null) { 
      try { 
       in.close(); 
      } catch (IOException e) { 
       e.printStackTrace(); 
      } 
     } 
    } 
}} 

답변

2

귀하의 코드가 올바른 것 같습니다 주셔서 감사합니다 : 는 여기 안드로이드 코드입니다. 다음은 시도 할 수있는 몇 가지 사항입니다.

  1. Android에서 키 저장소의 내용을 나열하여 올바른 인증서가 있고 파싱 가능한지 확인하십시오.

  2. 서버 측에서 SSL 디버깅 켜고 오류/경고가 있는지 확인하기 위해 로그를

  3. 확인 로그 캣을 확인합니다.
관련 문제