2009-02-13 21 views

cevap

7

Bu konuya bir bakın.

http://www.igniterealtime.org/community/thread/37678

Esasen, kodunuza Bu iki satırı eklemeniz gerekir:

connConfig.setSecurityMode(ConnectionConfiguration.SecurityMode.enabled); 
connConfig.setSocketFactory(new DummySSLSocketFactory()); 

connConfig sizin ConnectionConfiguration nesnedir nerede. Spark kaynak kod deposundan DummySSLSocketFactory'yi edinin. Tek yaptığı neredeyse tüm sertifikaları kabul ediyor. Bu benim için çalışıyor gibi görünüyordu. İyi şanslar!

+1

Bu DummySSLSocketFactory herhangi sertifika geçmiş verir benim blog aynı izleyin Bu yüzden, CA Sertifikasını almayı ve bunu KeyStore'da saklamayı ve uygulamayı ekleyerek ve kullanarak kullanmayı öneririm. Daha fazla bilgi için lütfen cevaba bakın. – Iqbal

3

Evet, başarmak oldukça kolay. ConnectionConfiguration sınıfına ve özellikle bir ConnectionConfiguration.SecurityMode enum parametresini kabul eden setSecurityMode yöntemine bakın. Bunu "gerekli" kuvvetlere ayarlayarak TLS'yi kullan. Javadoc gelen

:

Securirty TLS ile şifreleme bağlamak için gereklidir. sunucusu TLS sunmuyorsa veya TLS negotiaton başarısız olursa, sunucuya bağlantısı başarısız olur.

3

aşağıdaki bunu başarabilirsiniz:

şu adımları izleyin bir anahtar deposundaki sertifikayı depolamak için anahtar deposu

CA Sertifikası saklanması.

Adım 1: Bouncycastle JAR dosyasını karşıdan yükleyin. Buradan indirilebilir: anahtar deposunu Doğrulama: aşağıdaki komutu kullanın deposundaki sertifikayı

keytool -importcert -v -trustcacerts -file "<certificate_file_with_path>" -alias "<some_name_for_certificate>" -keystore "<file_name_for_the_output_keystore>" -provider org.bouncycastle.jce.provider.BouncyCastleProvider -providerpath "<bouncy_castle_jar_file_with_path>" -storetype BKS -storepass "<password_for_the_keystore>" 

Adım 3 saklamak için: Bouncy Castle JAVA

Adım 2 Bültenleri dosya

keytool -importcert -v -list -keystore "<file_name_for_the_keystore_with_path>" -provider org.bouncycastle.jce.provider.BouncyCastleProvider -providerpath "<bouncy_castle_jar_file_with_path>" -storetype BKS -storepass "<password_for_the_keystore>" 

Bu, bize anahtar deposunda bulunan sertifikayı listeleyecektir.

Kodumuzda kullanabileceğimiz bir anahtar depomuz var. Bu anahtar deposunu oluşturduktan sonra anahtar deposunu

kullanma

, uygulamanın ham klasörüne kaydedin. Sertifikayı openfire sunucusuyla el sıkışması için aşağıdaki kodu kullanın.

XMPP kullanarak açık ateşle bağlantı oluşturmak için, yapılandırmayı almanız gerekebilir. Aynı için aşağıdaki yöntemi kullanın:

public ConnectionConfiguration getConfigForXMPPCon(Context context) { 
     ConnectionConfiguration config = new ConnectionConfiguration(URLConstants.XMPP_HOST, URLConstants.XMPP_PORT); 
     config.setSASLAuthenticationEnabled(false); 
     config.setSecurityMode(ConnectionConfiguration.SecurityMode.enabled); 
     config.setCompressionEnabled(false); 
     SSLContext sslContext = null; 
     try { 
      sslContext = createSSLContext(context); 
     } catch (KeyStoreException e) { 
      e.printStackTrace(); 
     } catch (NoSuchAlgorithmException e) { 
      e.printStackTrace(); 
     } catch (KeyManagementException e) { 
      e.printStackTrace(); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } catch (CertificateException e) { 
      e.printStackTrace(); 
     } 

     config.setCustomSSLContext(sslContext); 
     config.setSocketFactory(sslContext.getSocketFactory()); 

     return config; 
} 

private SSLContext createSSLContext(Context context) throws KeyStoreException, 
      NoSuchAlgorithmException, KeyManagementException, IOException, CertificateException { 
     KeyStore trustStore; 
     InputStream in = null; 
     trustStore = KeyStore.getInstance("BKS"); 

     if (StringConstants.DEV_SERVER_IP.equals(URLConstants.XMPP_HOST) || StringConstants.TEST_SERVER_IP.equals(URLConstants.XMPP_HOST)) 
      in = context.getResources().openRawResource(R.raw.ssl_keystore_dev_test); 
     else if(StringConstants.STAGE_SERVER_IP.equals(URLConstants.XMPP_HOST) || StringConstants.STAGE2_SERVER_IP.equals(URLConstants.XMPP_HOST)) 
      in = context.getResources().openRawResource(R.raw.ssl_keystore_stage); 
     else if(StringConstants.PROD_SERVER_IP.equals(URLConstants.XMPP_HOST) || StringConstants.PROD1_SERVER_IP.equals(URLConstants.XMPP_HOST)) 
      in = context.getResources().openRawResource(R.raw.ssl_keystore_prod); 

     trustStore.load(in, "<keystore_password>".toCharArray()); 

     TrustManagerFactory trustManagerFactory = TrustManagerFactory 
       .getInstance(KeyManagerFactory.getDefaultAlgorithm()); 
     trustManagerFactory.init(trustStore); 
     SSLContext sslContext = SSLContext.getInstance("TLS"); 
     sslContext.init(null, trustManagerFactory.getTrustManagers(), 
       new SecureRandom()); 
     return sslContext; 
} 

Hepsi bitti .. !! Sadece bağlanın .. Şimdi bağlantınız güvenceye alındı. Bir kök CA tarafından imzalanmıştır süresi dolmuş veya olmasa bile

Tüm

, smackssl.blogspot.in

+0

'Bağlam 've' R' sınıfları nelerdir? –

+0

@Alastair 'Bağlamı' 'this' kullanılarak geçirebileceğiniz uygulama veya sınıf düzeyi bağlamıdır. Ve 'R', sabit dizinimde ham dizinde saklanan anahtar depoları aldığım bir sınıftır, bu kaynağı da istediğiniz gibi başka yollarla iletebilirsiniz. – Iqbal

+0

Belirli bir çerçevede çalışıyormuşsunuz gibi görünüyor. Android? Ben değilim, bu yüzden biraz kafamı karıştırdı. Ama ben anladım. Yine de teşekkürler. –

İlgili konular