2011-09-28 3 views
5

Http-client를 통해 QuickPay의 서비스 ("https://secure.quickpay.dk/form")에 액세스해야하는 Android 애플리케이션을 개발 중입니다. 하지만 페이지에 액세스 할 때 오류가 계속 발생합니다. 더 구체적으로 "No Peer Certificate"오류 메시지가 나타납니다. 나는 이미 여러 가지를 시도했다. 키 스토어에 루트 인증서를 추가하고이 키 스토어를 연결하는 데이 절차를 따르면서 시도했다 : adding certificate to keystore. 또한 제안 된 방법 (여기에서 accepting certificate for android)에 따라 모든 인증서를 수락하려했습니다. 다른 https 사이트에 성공적으로 연결했지만이 사이트에 연결할 수 없습니다. 다른 Android 기기 (1.6, 2.2 및 2.3.3)에서 시험해 보았습니다. 누구든지 quickpay의 사이트에 연결하는 데 성공할 수 있습니까? 아니면 누군가가 가능한 해결책/수정을 제안 할 수 있습니까?Android에서이 HTTPS 사이트에 연결할 때 "피어 인증서 없음"오류가 발생하지 않도록하려면 어떻게해야합니까?

// 업데이트 : WebView : payment window examples으로이 사이트에 액세스하고 단추 중 하나를 누르면 (기본적으로 일부 미리 정의 된 변수가있는 http 게시가 시작됨) 사이트에 연결할 수 있습니다. 안드로이드 2.3.3에서 webview. 또한 Android 3.1에서 위의 응용 프로그램을 시작하려고하면 사이트에서 답장을 얻습니다. 어떤 제안?

public class MyHttpClient extends DefaultHttpClient { 

final Context context; 

public MyHttpClient(Context context) { 
    this.context = context; 
    loadHttps(); 
} 

private void loadHttps() { 
    String url = "https://secure.quickpay.dk/form"; 
    HttpPost httpPost = new HttpPost(url); 
    try { 
     System.out.println("Executing"); 
     this.execute(httpPost); 
    } catch (UnsupportedEncodingException e) { 
     System.out.println(e.getMessage()); 
    } catch (ClientProtocolException e) { 
     System.out.println(e.getMessage()); 
    } catch (IOException e) { 
     System.out.println(e); 
    } 
} 

@Override 
protected ClientConnectionManager createClientConnectionManager() { 
    SchemeRegistry registry = new SchemeRegistry(); 
    registry.register(new Scheme("http", PlainSocketFactory.getSocketFactory(), 80)); 
    registry.register(new Scheme("https", newSslSocketFactory(), 443)); 
    return new SingleClientConnManager(getParams(), registry); 
} 

private SSLSocketFactory newSslSocketFactory() { 
    try { 
     KeyStore trusted = KeyStore.getInstance("BKS"); 
     InputStream in = context.getResources().openRawResource(R.raw.test); 
     try { 
      trusted.load(in, "mysecret".toCharArray()); 
     } finally { 
      in.close(); 
     } 
     SSLSocketFactory sf = new SSLSocketFactory(trusted); 
     return sf; 
    } catch (Exception e) { 
     throw new AssertionError(e); 
    } 
} 

}


스택 트레이스 :

WARN/System.err(8459)  at org.apache.harmony.xnet.provider.jsse.SSLSessionImpl.getPeerCertificates(SSLSessionImpl.java 258) 
WARN/System.err(8459)  at org.apache.http.conn.ssl.AbstractVerifier.verify(AbstractVerifier.java 93) 
WARN/System.err(8459)  at org.apache.http.conn.ssl.SSLSocketFactory.createSocket(SSLSocketFactory.java 381) 
WARN/System.err(8459)  at org.apache.http.impl.conn.DefaultClientConnectionOperator.openConnection(DefaultClientConnectionOperator.java 177) 
WARN/System.err(8459)  at org.apache.http.impl.conn.AbstractPoolEntry.open(AbstractPoolEntry.java 164) 
WARN/System.err(8459)  at org.apache.http.impl.conn.AbstractPooledConnAdapter.open(AbstractPooledConnAdapter.java 119) 
WARN/System.err(8459)  at org.apache.http.impl.client.DefaultRequestDirector.execute(DefaultRequestDirector.java 359) 
WARN/System.err(8459)  at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java 555) 
WARN/System.err(8459)  at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java 487) 
WARN/System.err(8459)  at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java 465) 
WARN/System.err(8459)  at test.https.MyHttpClient.loadHttps(MyHttpClient.java 34) 
WARN/System.err(8459)  at test.https.MyHttpClient.<init>(MyHttpClient.java 26) 
WARN/System.err(8459)  at test.https.HttpsTesterActivity.onCreate(HttpsTesterActivity.java 60) 
WARN/System.err(8459)  at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java 1047) 
WARN/System.err(8459)  at android.app.ActivityThread.performLaunchActivity(ActivityThread.java 1615) 
WARN/System.err(8459)  at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java 1667) 
WARN/System.err(8459)  at android.app.ActivityThread.access$1500(ActivityThread.java 117) 
WARN/System.err(8459)  at android.app.ActivityThread$H.handleMessage(ActivityThread.java 935) 
WARN/System.err(8459)  at android.os.Handler.dispatchMessage(Handler.java 99) 
WARN/System.err(8459)  at android.os.Looper.loop(Looper.java 123) 
WARN/System.err(8459)  at android.app.ActivityThread.main(ActivityThread.java 3687) 
WARN/System.err(8459)  at java.lang.reflect.Method.invokeNative(Native Method)  
WARN/System.err(8459)  at java.lang.reflect.Method.invoke(Method.java 507) 
WARN/System.err(8459)  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java 842) 
WARN/System.err(8459)  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java 600) 
+0

일반 사이트 인증서를 얻고있는 인증서입니까 아니면 QuickPay에서 가져온 개인 인증서 (또는 회사)입니까? 어떤 형식입니까? pkx? p12? –

+1

전체 메시지 및 스택 추적을 게시하십시오. – EJP

+0

@ PeterKnego, QuickPay의 사이트에서 루트 인증서를 내 브라우저를 통해 다운로드했습니다. 인증서는 Equifax에서 제공 한 것입니다. 그런 다음 인증서를 Android로로드하기 위해 p12 인증서로 변환했습니다. –

답변

1

요약하면 WebView 방식을 고수하여이 문제를 해결했습니다. API와의 상호 작용이 서버로 이동하여 인증서 문제를 처리하는 중간 통신 지점을 만들었습니다. 가장 우아한 해결책은 아니지만 작동합니다.

0

이 매우 신비입니다. HTTPS/SSL 서버가 인증서를 보내는 것을 피할 수있는 유일한 방법은 서버가 SSL 클라이언트이고 클라이언트가 SSL 서버 인 반대 방향에서 SSL 연결을 작동하는 데 동의하면 인증서가 다른 방향으로 이동하는 것입니다. 하지만 당신의 코드에서 그 모드를 가능하게하는 것을 볼 수 없으며, 반대쪽에서도 활성화되어야합니다. 그리고 키 스토어에서 직접 인증서를 제공해야합니다 ... 아주 이상합니다.

+0

"원시"리소스 (위의 코드 참조)에서로드하는 "test"라는 인증서를 제공합니다. 이것은 브라우저에서 가져 와서 저장 한 변환 된 루트 인증서입니다. –

0

UrlConnection 클래스를 사용하여 연결을 시도하고이 "no peer certificate"오류를 피할 수 있는지 확인하십시오.

관련 문제