Шифрование сообщений с помощью 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.