2011-09-28 6 views
5

Http istemcisi aracılığıyla QuickPay hizmetine ("https://secure.quickpay.dk/form") erişmesi gereken bir Android uygulaması geliştiriyorum. Ancak sayfaya erişirken hata yapmaya devam ediyorum. Daha spesifik olarak bir "Hayır Eş Sertifika" hata mesajı alıyorum. Zaten birkaç farklı şey denedim: Kök sertifikayı anahtar depomuma eklemeyi ve bu anahtar deposunu bağlarken, aşağıdaki yordamı izleyerek kullanmaya çalıştım: adding certificate to keystore. Ayrıca, önerilen yöntemi takip ederek tüm sertifikaları kabul etmeyi denedim: accepting certificate for android. Diğer https sitelerine başarıyla bağlandım, ancak buna bağlanamıyorum. Farklı Android cihazlarda denedim (1.6, 2.2 ve 2.3.3). Herkes hızlı ödeme sitesine bağlanmayı başarabilir mi, yoksa olası bir çözümle ilgili herhangi bir çözüm bulabilir mi?Android'deki bu HTTPS sitesine bağlanırken "Akran sertifikası yok" hatası almayı nasıl önleyebilirim?

// Güncelleme: Bu siteye WebView'imle erişirseniz: payment window examples ve düğmelerden birine (önceden tanımlanmış bazı değişkenlerle temelde sadece bir http yayınını başlatır) basıyorum. Android 2.3.3 webview. Ayrıca, Android 3.1'de yukarıdaki uygulamayı başlatmaya çalışırsam siteden bir yanıt aldığımı öğrendim! Baska öneri?

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); 
    } 
} 

}


StackTrace:

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

Sertifika genel site sertifikası aldığınız bir sertifika mıdır, yoksa bu QuickPay'den aldığınız kişisel (veya şirket) bir sertifika mıdır? Hangi format? PKX? p12? –

+1

Lütfen iletinin tamamını ve yığın izlemesini gönderin. – EJP

+0

@PeterKnego, Kök sertifikayı tarayıcımdan QuickPay'in sitesinden indirdim. Sertifika Equifax tarafından verilmiştir. Daha sonra, Android'e yüklemek için sertifikayı bir p12 sertifikasına dönüştürdüm. –

cevap

1

Özetle, bu sorunu WebView yaklaşımına bağlı kalarak çözdüm. API ile etkileşim, bir sunucuya taşınarak sertifika sorunlarını ele alan bir ara iletişim noktası yaratıldı. En zarif çözüm değil ama işe yarıyor :)

0

Bu çok gizemli. Bir HTTPS/SSL sunucusunun bir sertifika göndermekten kaçınabilmesinin tek yolu, her iki tarafın da SSL bağlantısını ters olarak çalıştırmayı kabul etmesi, sunucunun SSL istemcisi olduğu ve istemcinin SSL sunucusu olduğu durumlarda, bu durumda sertifikanın diğer yönde hareket etmesidir. Ancak kodunuzda bu modu etkinleştiren hiçbir şey göremiyorum ve diğer tarafta da etkin olması gerekiyordu. Ve anahtar deponuzdan kendinize bir sertifika vermeniz gerekiyordu ... Çok garip.

+0

"Ham" kaynaklardan yüklediğim "test" adı verilen bir sertifika hazırlıyorum (yukarıdaki kod). Bu, tarayıcımla edindiğim ve kaydettiğim dönüştürülmüş kök sertifikadır. –

0

Bağlantı yapmak için UrlConnection sınıfını kullanmayı deneyin ve bu "no peer certificate" hatası bulunup bulunmadığını görün.