Smack XMPP 라이브러리를 사용하여 SSL 연결을 만드는 방법은 무엇입니까?
문제
XMPP 클라이언트 역할을하는 작은 프로그램을 구축하고 있으며 헤로인 도서관. 이제 연결중인 서버는 SSL을 요구합니다 (Pidgin에서 "포스 오래된 (포트 5223) SSL"을 확인해야합니다). 이 서버에 연결하는 데 어려움을 겪고 있습니다. 가능합니까?
해결책
이 스레드를 살펴보십시오.
http://www.igniterealtime.org/community/thread/37678
본질적 으로이 두 줄을 코드에 추가해야합니다.
connConfig.setSecurityMode(ConnectionConfiguration.SecurityMode.enabled);
connConfig.setSocketFactory(new DummySSLSocketFactory());
여기서 Connconfig는 ConnectionConfiguration 객체입니다. Spark 소스 코드 저장소에서 dummysslsocketfactory를 가져옵니다. 그것이하는 것은 사실상 모든 인증서를 수락하는 것입니다. 이것은 나를 위해 작동하는 것 같았습니다. 행운을 빕니다!
다른 팁
예, 달성하기가 매우 쉽습니다. 살펴보십시오 ConnectionConfiguration 클래스, 특히 ConnectionConfiguration.securityMode enum을 매개 변수로 받아들이는 SetSecurityMode 메소드. 이것을 "필수"로 설정하여 TLS를 사용하도록 강요.
Javadoc에서 :
연결하려면 TLS 암호화를 통한 보안이 필요합니다. 서버가 TLS를 제공하지 않거나 TLS 협상이 실패하면 서버에 대한 연결이 실패합니다.
다음으로이를 달성 할 수 있습니다.
Keystore에 CA 인증서를 저장합니다
인증서를 Keystore에 저장하려면 다음 단계를 따르십시오.
1 단계: Bouncycastle Jar 파일을 다운로드하십시오. 여기에서 다운로드 할 수 있습니다 : Bouncy Castle Java Releases
2 단계: 다음 명령을 사용하여 Keystore에 인증서를 저장하십시오.
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>"
3 단계 : : KeyStore 파일을 확인하십시오
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>"
여기에는 Keystore에 포함 된 인증서를 나열해야합니다.
우리는 코드에서 사용할 수있는 키 저장소가 있습니다.
키 스토어 사용
이 키 스토어를 생성 한 후 응용 프로그램의 원시 폴더에 저장하십시오. 아래 코드를 사용하여 OpenFire 서버로 인증서 핸드 셰이크를 얻습니다.
XMPP를 사용하여 OpenFire와 연결하려면 구성을 가져와야 할 수도 있습니다. 마찬가지로 아래 방법을 사용하십시오.
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; }
다 끝났어요 .. !! 연결 그냥 .. 이제 연결이 확보되었습니다.
내 블로그에서 모두 동일하게 따라갑니다 smackssl.blogspot.in