2015-06-11 4 views
6

Ich habe eine .p12-Zertifikatsdatei, und ich verwende die SSL Converter, um es in eine .pem-Zertifikatsdatei zu konvertieren. Dann benutze ich diese PM-Zertifikat-Datei in meinem Android-Code wie folgt:So erstellen Sie https-Anfrage mit SSL-Zertifikat in Retrofit

OkHttpClient okHttpClient = new OkHttpClient(); 
     try { 
      CertificateFactory cf = CertificateFactory.getInstance("X.509"); 
      InputStream instream = context.getResources().openRawResource(R.raw.pem_certificate); 
      Certificate ca; 
      ca = cf.generateCertificate(instream); 
      KeyStore kStore = KeyStore.getInstance(KeyStore.getDefaultType()); 
      kStore.load(null, null); 
      kStore.setCertificateEntry("ca", ca); 
      TrustManagerFactory tmf = TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm()); 
      tmf.init(kStore); 
      SSLContext sslContext = SSLContext.getInstance("TLS"); 
      sslContext.init(null, tmf.getTrustManagers(), null); 
      okHttpClient.setSslSocketFactory(sslContext.getSocketFactory()); 
     } catch (CertificateException 
       | KeyStoreException 
       | NoSuchAlgorithmException 
       | IOException 
       | KeyManagementException e) { 
      e.printStackTrace(); 
     } 

     baseURL = endpoint; 
     RestAdapter restAdapter = new RestAdapter.Builder() 
       .setEndpoint(baseURL) 
       .setClient(new OkClient(okHttpClient)) 
       .build(); 

     service = restAdapter.create(DishService.class); 

Aber dieser Code funktioniert nicht. Es war gescheitert an der Linie "ca = cfygenerateCertificate (instream);" mit CertificateException Nachricht.

+1

Bitte nehmen Sie sich einen Blick auf diese Antwort: http://stackoverflow.com/a/31436459/4261176. –

+0

https://gist.github.com/erikcaffrey/10af1cc0b99a54f5b9a8a7614cca6f0a Ich hoffe, es hilft jemandem! –

+0

Verwenden Sie diese einfachste Lösung: https://stackoverflow.com/a/45855405/3448003 –

Antwort

3

Vielleicht haben Sie ein Problem in R.raw.pem_certificate ...

1) Versuchen Sie, ein rohes öffentliches Zertifikat von Server zu erhalten mit openssl: openssl s_client -connect {HOST}: {PORT } -showcerts

(Details siehe hier bitte: https://superuser.com/questions/97201/how-to-save-a-remote-server-ssl-certificate-locally-as-a-file)

2) Wie Setup Retrofit2 mit einem benutzerdefinierten SSL sertificate https://adiyatmubarak.wordpress.com/tag/add-ssl-certificate-in-retrofit-2/

oder Retrofit1: https://number1.co.za/use-retrofit-self-signed-unknown-ssl-certificate-android/

PS: es funktioniert für mich, bitte nicht PEM-Datei BKS konvertieren.

Verwandte Themen