2012-05-09 4 views
1

У нас есть приложение, работающее с моноточем на iPhone. На данный момент мы используем BasicHttpBinding для подключения к службе WCF. Теперь мы находимся в процессе обеспечения безопасности соединения, используя снова BasicHttpBinding с BasicHttpSecurityMode.Transport (это эффективно HTTPS).Использование HTTPS с Monotouch и WCF

Мы создали самозаверяющий сертификат и добавили его на сервер. При доступе к серверу-адресу через браузер (как с iPhone, так и с ПК) мы можем подключиться к нему без проблем. Однако, если мы соединяемся с нашим приложением MonoTouch мы получим следующее исключение:

System.Net.WebException has been thrown 
    Error writing request: BeginWrite failure 

Мы использовали Wireshark для анализа соединения и выяснили, что сервер закрывает соединение (сервер отправляет сброс TCP после того, как получило ClientHello) , Мы нашли в ERRORLOG МИБ следующее сообщение:

An TLS 1.0 connection request was received from a remote client application, but none of the cipher suites supported by the client application are supported by the server. The SSL connection request has failed. 

Если мы посмотрим, какие шифры поддерживаются нашим сервером, мы видим следующий список:

TLS_RSA_WITH_AES_128_CBC_SHA256 
    TLS_RSA_WITH_AES_128_CBC_SHA 
    TLS_RSA_WITH_AES_256_CBC_SHA256 
    TLS_RSA_WITH_AES_256_CBC_SHA 
    TLS_RSA_WITH_RC4_128_SHA 
    TLS_RSA_WITH_3DES_EDE_CBC_SHA 
    TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256_P256 
    TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256_P384 
    TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA_P256 
    TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA_P384 
    TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA_P256 
    TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA_P384 
    TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256_P256 
    TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256_P256 
    TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384_P384 
    TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA384_P384 
    TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA_P256 
    TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA_P384 
    TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA_P256 
    TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA_P384 
    TLS_DHE_DSS_WITH_AES_128_CBC_SHA256 
    TLS_DHE_DSS_WITH_AES_128_CBC_SHA 
    TLS_DHE_DSS_WITH_AES_256_CBC_SHA256 
    TLS_DHE_DSS_WITH_AES_256_CBC_SHA 
    TLS_DHE_DSS_WITH_3DES_EDE_CBC_SHA 
    TLS_RSA_WITH_RC4_128_MD5 
    SSL_CK_RC4_128_WITH_MD5 
    SSL_CK_DES_192_EDE3_CBC_WITH_MD5 
    TLS_RSA_WITH_NULL_SHA256 
    TLS_RSA_WITH_NULL_SHA 

В то время как мы знаем, что MonoTouch по крайней мере, поддерживает TLS_RSA_WITH_AES_128_CBC_SHA (согласно Wireshark)

У кого-нибудь есть решение, чтобы исправить эту проблему или обходной путь? Может быть, нам нужно использовать некоторые специальные опции в IIS или в makecert?

Заранее благодарен!

ответ

0

В вашем браузере отображается ошибка сертификата? Если это так, вы должны использовать:

ServicePointManager.ServerCertificateValidationCallback = (a, b, c, d) => true; 

Сделайте это один раз в своей программе до вашего первого запроса. Он автоматически принимает все сертификаты, даже самозаверяющие.

Даже все еще, я думаю, MonoTouch должен давать другое сообщение об ошибке здесь. Что происходит в Windows?

0

Mono (и MonoTouch) поддерживает многие из шифров из вашего списка (в большинстве случаев кроме *DH*).

Ошибка в вашем журнале предполагает, что сервер не принимает соединение из-за выбора шифрования. В SSL/TLS клиент отправляет свой список на сервер, и сервер выбирает тот, который он предпочитает (производительность/безопасность). Нет ничего, что можно изменить на стороне Mono [Touch], чтобы повлиять на это.

Я видел такие случаи только когда сервер не настроен на прием любой из предложенных шифров (от Mono). Это, как правило, серверы, сконфигурированные для поддержки только *DH* шифров.

Не всегда легко быть на 100% уверенным, что сервер поддерживает (или настроен для разрешения). Протокол SSL/TLS никогда не отправляет такой список (в отличие от клиента).

Я предлагаю вам использовать Wireshark и некоторые веб-браузеры для подключения к серверу. Если соединение работает и использует шифр *DH*, тогда вы будете знать (98%), что ваш сервер, скорее всего, неправильно сконфигурирован (см. Список выше).

Почему?потому что браузеры обычно поддерживают множество шифров (например, Mono) и *DH* (в отличие от Mono). Поэтому, если сервер выбрал шифр *DH*, это хороший ключ, он ничего не позволяет. Обычный выбор для серверов имеет тенденцию использовать RC4 или AES, но YMMV.

Смежные вопросы