Smack XMPP 라이브러리를 사용하여 SSL 연결을 만드는 방법은 무엇입니까?

StackOverflow https://stackoverflow.com/questions/545082

  •  23-08-2019
  •  | 
  •  

문제

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

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top