كيفية إنشاء اتصال SSL باستخدام مكتبة Smack XMPP؟

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 هو كائن الاتصال الخاص بك. احصل على Dummysslsleslessory من مستودع شفرة المصدر. كل ما يفعله هو قبول أي شهادة تقريبا. يبدو أن هذا يعمل بالنسبة لي. حظ سعيد!

نصائح أخرى

نعم، من السهل تحقيقه. نلقي نظرة على اتصال الاتصالات فئة، وعلى وجه الخصوص طريقة setsecuritymode التي تقبل الاتصال onlactonfiguration.securitymode enum كمعلمة. وضع هذا إلى القوات "المطلوبة" صفعة لاستخدام TLS.

من الجافادوك:

مطلوب Securirty عبر تشفير TLS من أجل الاتصال. إذا لم يقم الخادم بتقديم TLS أو إذا فشل تفجير TLS، فسوف تفشل الاتصال بالخادم.

يمكنك تحقيق ذلك من خلال ما يلي:

تخزين شهادة CA في Keystore

لتخزين الشهادة في Keystore اتبع هذه الخطوات.

الخطوة 1: قم بتنزيل ملف Bouncycastle Jar. يمكن تنزيله من هنا: إصدارات قلعة نطاط جافا

الخطوة 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.

لدينا Keystore الذي يمكننا استخدامه في التعليمات البرمجية لدينا.

باستخدام KeyStore.

بعد إنشاء هذا المفاتيح، احفظه في المجلد الخام للتطبيق الخاص بك. استخدم الرمز أدناه للحصول على مصافحة الشهادة مع خادم OpenFire.

لإنشاء اتصال مع OpenFire باستخدام XMPP، قد تحتاج إلى الحصول على التكوين. لنفسه، استخدم الطريقة أدناه:

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