Защита сообщений с помощью взаимных сертификатов для Android и iOS - PullRequest
0 голосов
/ 20 сентября 2018

Я хотел бы спросить следующее.У нас есть мобильное приложение для Android и iOS, которое обменивается данными с сервером .NET.

Для Android используется библиотека ksoap2, а для iOS - библиотеки Alamofire с AEXML.

Мы хотели бы включить шифрование для связи между сервером и приложениями, в частности, Message Security с взаимными сертификатами (https://docs.microsoft.com/en-us/dotnet/framework/wcf/feature-details/message-security-with-mutual-certificates)

. Я не могу найти какую-либо информацию о том, как может шифроваться клиент Android или iOS./ расшифровать запросы / ответы.

Можете ли вы предоставить какую-либо относительную информацию?

Заранее спасибо!

Ответы [ 3 ]

0 голосов
/ 08 октября 2018

В Android:

Я использую kasoap2 для вызова веб-служб, но перед вызовом, чтобы включить взаимную аутентификацию с сертификатом клиента, необходимо инициализировать SSLContext с ключами аутентификации клиента (KeyManager).Для этого вам нужно загрузить свой сертификат и соответствующий пароль в объект KeyStore, мой сертификат - это файл * .pfx.Я создаю экземпляр хранилища ключей PKCS12.Затем вам нужен объект KeyManagerFactory для получения массива KeyManager.Я использую экземпляр PKM KeyManagerFactory.Массив KeyManager необходим для инициализации SSLContext.

Вот пример:

public void enableMutualAuthentication(String filename, String password) {
    try {
        // InputStream to read the certificate file
        FileInputStream cert = new FileInputStream(filename);
        char[] pass = password.toCharArray();

        KeyStore keystore = KeyStore.getInstance("PKCS12");
        keystore.load(cert ,pass);
        cert.close();

        KeyManagerFactory keymanagerfactory = javax.net.ssl.KeyManagerFactory.getInstance("PKIX");
        keymanagerfactory.init(keystore, pass);
        KeyManager[] keymanagers = keymanagerfactory.getKeyManagers();

        // This is not for the mutual authentication.
        // Create a trust manager that does not validate certificate chains
        TrustManager[] trustAllCerts = new TrustManager[] { new X509TrustManager() {
            public java.security.cert.X509Certificate[] getAcceptedIssuers() {
                return null;
            }

            public void checkClientTrusted(X509Certificate[] certs, String authType) {
            }

            public void checkServerTrusted(X509Certificate[] certs, String authType) {
            }
        } };

        // Install the mutual authentication manager
        // Install the all-trusting trust manager
        SSLContext sc = SSLContext.getInstance("SSL");
        sc.init(keymanagers, trustAllCerts, new java.security.SecureRandom());
        HttpsURLConnection.setDefaultSSLSocketFactory(sc.getSocketFactory());

        // Create all-trusting host name verifier
        HostnameVerifier allHostsValid = new HostnameVerifier() {
            public boolean verify(String hostname, SSLSession session) {
                return true;
            }
        };

        // Install the all-trusting host verifier
        HttpsURLConnection.setDefaultHostnameVerifier(allHostsValid);
    } catch (NoSuchAlgorithmException e) {
        e.printStackTrace();
    } catch (KeyManagementException e) {
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    } catch (CertificateException e) {
        e.printStackTrace();
    } catch (UnrecoverableKeyException e) {
        e.printStackTrace();
    } catch (KeyStoreException e) {
        e.printStackTrace();
    }
}

Проверьте эти ссылки, что мне больше всего помогло.

https://chariotsolutions.com/blog/post/https-with-client-certificates-on/ http://callistaenterprise.se/blogg/teknik/2011/11/24/android-tlsssl-mutual-authentication/

0 голосов
/ 10 октября 2018

Шифрование сообщений с помощью WCF выполняется по протоколу WS-Security, для атрибута безопасности mode установлено значение Message.Как вы, несомненно, уже поняли, WS-Security не совсем популярен на платформах Android и iOS, в основном из-за того, что он был заменен другими технологиями (такими как HTTPS), поэтому ваш выбор с точки зрения существующих библиотек не является обильным.Тот факт, что даже Xamarin, принадлежащий Microsoft, не поддерживает его говорит о многом.

Во-первых, несколько слов о WS-Security. Этот протокол предоставляет три основных средства повышения безопасности сообщений:

  • Аутентификация с помощью маркеров безопасности
  • Подписание сообщений SOAP
  • Шифрование сообщений SOAP

Таким образом, соответствующая реализация должна действительно обеспечивать все три из этих функций, но нас больше всего интересует шифрование, поскольку из вопроса и комментариев кажется, что у вас работает аутентификационная часть.

Поэтому, предполагая, что мы ищем библиотеку мобильной платформы, обеспечивающую минимальную совместимость WCF с WS-Безопасность подписи и шифрования:

Android

На Android ваши потребности будут закрыты WSS-Client for Android.Этот проект:

... реализует стандарт OASIS Web Service Security (WSS) для платформ Android и делает доступными шифрование XML и подпись XML для планшетов и смартфонов.

Обратите внимание, что это GPL-лицензированное программное обеспечение.В readme говорится, что нужно связаться с автором для получения коммерческой лицензии.Тем не менее, кажется, делать то, что вы ищете.После того, как вы договорились об обмене ключами с сервером, чтобы зашифровать ранее построенное сообщение SOAP с использованием класса SOAPUtil, вы должны сделать что-то вроде:

SOAPMessage message = SOAPUtil.createSOAPMessage();
//... Populate the message (possibly with another library)
SecCrypto serverCrypto = new SecCrypto(serverCertificate, null);
SecCrypto clientCrypto = new SecCrypto(clientPublicKey, clientPrivateKey);
SOAPMessage securedMessage = SOAPUtil.secureSOAPMessage(message, new HashMap<String,String>(SecConstants.REQ_ENCRYPT_SIGN, "yes"), clientCrypto, serverCrypto);
//...
SOAPMessage returnedSecuredMessage = SOAPUtil.sendSOAPMessage(context, securedMessage, endpoint,  cryptoParams);
SOAPMessage returnedMessage = SOAPUtil.validateSOAPMessage(returnedSecuredMessage, new HashMap<String,String>(SecConstants.RES_DECRYPT_VERIFY, "yes", decCrypto);

Тем не менее, будьте готовы выполнить довольно много настроекработать и отлаживать, чтобы он соответствовал потребностям вашего сервера.

Если вы ищете более актуальный и активно разработанный продукт, Quasar Development предлагает реализацию WS-Security для Android.

iOS

Все выглядит намного мрачнее со стороны iOS.Существует несколько библиотек, заявляющих о различной степени поддержки WSS, но ни одна из них не соответствует вашим потребностям:

  • Сначала SOAPEngine выглядит наиболее многообещающим, так какон заявляет о поддержке WS-Security.Однако в сноске говорится, что у него есть ограничение, что он поддерживает только WCF basicHttpBinding.Это на самом деле было бы хорошо, если правда.Привязка, использованная в примере кода, с которым вы связались в этом вопросе, - wsHttpBinding, однако важно отметить, что как wsHttpBinding, так и basicHttpBinding поддерживают шифрование через WS-Security.Разница в том, что wsHttpBinding поддерживает WS-Security по умолчанию (тогда как его нужно включить с помощью basicHttpBinding), а также поддерживает WS-ReliableMessaging и некоторые другие функции , которые могут вас интересовать, а могут и не заботиться.Но basicHttpBinding предназначен для совместимости с другими технологиями.Таким образом, чтобы иметь шифрование WS-Security на вашем сервере WCF и одновременно обеспечить максимальную совместимость с другими технологиями, было бы нормально использовать basicHttpBinding и включить подпись и шифрование WS-Security, установив для атрибута безопасности mode значениеMessage.С атрибутом Message, из документов :

    Безопасность обеспечивается с помощью защиты сообщений SOAP.По умолчанию тело зашифровано и подписано.Для этой привязки система требует, чтобы сертификат сервера был предоставлен клиенту вне диапазона.Единственный действительный ClientCredentialType для этой привязки - это Certificate.

    Но это бесполезно, поскольку SOAPEngine не поддерживает шифрование сообщений (или, по крайней мере, я не смог найти никакой поддержки в API).Единственная функция WS-Security, которую он поддерживает, - это аутентификация.Поэтому утверждение о том, что он поддерживает WS-Security, кажется вводящим в заблуждение, поскольку поддержка весьма ограничена.

  • ServiceNow предлагает очень ограниченную поддержку WS-Security.Это толькоподдерживает проверку подписи сервера.Нет шифрования или подписи на стороне клиента.
  • Chilkat имеет некоторую элементарную поддержку XML, и есть пример кода для аутентификации WS-Security.Я не видел никакой поддержки или примера кода для шифрования WS-Security.

Поэтому для iOS, насколько мне известно, у вас есть два варианта:

  • Выберите одну из существующих библиотек, которая наилучшим образом соответствует вашим другим потребностям, и обратитесь к разработчику и посмотрите, сможете ли вы заставить их добавить необходимые вам функции WS-Security.
  • Реализуйте минимум функций, которые вам нужны. Спецификация на самом деле не так уж сложна, и есть пример кода (для немобильных платформ), который вы можете использовать в качестве руководства, например, WSS4J.
0 голосов
/ 27 сентября 2018

Для части iOS.

По умолчанию Alamofire оценивает цепочку сертификатов, предоставляемую сервером, используя встроенную проверку Apple, предоставляемую платформой безопасности.

Хотя это гарантирует, что цепочка сертификатов действительна, она не предотвращает атаки «человек посередине» (MITM) или другие потенциальные уязвимости.

Чтобы смягчить атаки MITM, приложения, работающие с конфиденциальными данными клиента или финансовой информацией, должны использовать закрепление сертификата или открытого ключа, предоставленное ServerTrustPolicy.

ServerTrustPolicy Перечисление ServerTrustPolicy оценивает доверие сервера, которое обычно предоставляетсяс помощью URLAuthenticationChallenge при подключении к серверу по безопасному HTTPS-соединению.

let serverTrustPolicy = ServerTrustPolicy.pinCertificates(
    certificates: ServerTrustPolicy.certificates(),
    validateCertificateChain: true,
    validateHost: true
)

Существует много разных случаев оценки доверия к серверу, дающих вам полный контроль над процессом проверки:

performDefaultEvaluation: Используется оценка доверия сервера по умолчанию, позволяя вам контролировать, следует ли проверять хост, предоставленный запросом.

pinCertificates: Использует закрепленные сертификаты для проверки доверия сервера.Доверие к серверу считается действительным, если один из закрепленных сертификатов соответствует одному из сертификатов сервера.

pinPublicKeys: использует закрепленные открытые ключи для проверки доверия к серверу.

Доверие сервера считается действительным, если один из закрепленных открытых ключей совпадает с одним из открытых ключей сертификата сервера.

disableEvaluation: Отключает всю оценку, которая, в свою очередь, всегда учитывает любое доверие серверакак действительный.

customEvaluation: использует соответствующее закрытие для оценки достоверности доверия сервера, что дает вам полный контроль над процессом проверки.Используйте с осторожностью.

AlamoFire документация

Для Android у меня нет опыта, но я столкнулся с кем-то, спрашивавшим об этом иПолучив ответ с

, вам нужно только установить сертификат на веб-сервер и вызвать URL-адрес веб-службы, например https://my.webservice.url/ вместо http://my.webservice.url/.

Если ваш сертификат является самозаверяющим сертификатом, это означает, что вы не купили его в центре сертификации, вам необходимо установить SSLSocketFactory.Вы можете проверить вики проекта о том, как это сделать: http://code.google.com/p/ksoap2-android/wiki/CodingTipsAndTricks#How_to_set_the_SSLSocketFactory_on_a_https_connection__in_order

Проверьте Здесь .

Это может быть полезным

ОБНОВЛЕНИЕ : я нашел этот фреймворк SOAPEEngine этот.Поддерживает базовую, дайджест-проверку подлинности и проверку подлинности NTLM, WS-Security, сертификат на стороне клиента и настраиваемый заголовок безопасности.

вы также можете проверить его пример для получения дополнительных разъяснений.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...