将HTTPS与Monotouch和WCF一起使用

时间:2012-05-09 13:26:55

标签: iphone wcf ssl xamarin.ios makecert

我们有一个在iPhone上运行monotouch的应用程序。目前我们正在使用BasicHttpBinding连接到WCF服务。我们现在正在使连接安全,再次使用BasicHttpBinding和BasicHttpSecurityMode.Transport(这实际上是HTTPS)。

我们创建了一个自签名证书,并在服务器上添加了该证书。当通过浏览器(来自iPhone和PC)访问服务器地址时,我们可以毫无问题地连接到它。但是,如果我们连接MonoTouch应用程序,我们将获得以下异常:

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

我们使用Wireshark来分析连接,发现服务器正在关闭连接(服务器在收到ClientHello后发送tcp reset)。我们在IIS的错误日志中发现了以下消息:

    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中使用一些特殊选项?

提前致谢!

2 个答案:

答案 0 :(得分:0)

您的浏览器是否显示证书错误?如果是这样,您必须使用:

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

在第一次请求之前,在程序中执行一次此操作。它会自动接受所有证书,甚至是自签名证书。

即便如此,我认为MonoTouch应该在这里给出不同的错误信息。 Windows上会发生什么?

答案 1 :(得分:0)

Mono(和MonoTouch)支持列表中的许多密码(除了*DH*之外的密码除外)。

日志中的错误表明服务器由于密码选择而无法接受连接。在SSL / TLS中,客户端将其列表发送到服务器,服务器选择它喜欢的列表(性能/安全性)。在Mono [Touch]一侧没有任何改变可以影响这一点。

当服务器配置为接受任何提供的密码(来自Mono)时,我已经看到这样的情况。这通常是配置为支持 *DH*密码的服务器。

100%确定服务器支持(或配置为允许)并不总是容易的。 SSL / TLS协议从不发送此类列表(与客户端不同)。

我建议您使用Wireshark和一些Web浏览器连接到服务器。如果连接正常并使用*DH*密码,那么您将知道(98%)您的服务器可能配置错误(如上面的列表所示)。

为什么?因为浏览器通常支持许多密码(如Mono)和*DH*(与Mono不同)。因此,如果服务器选择了*DH*密码,那么它是一个很好的线索,它不允许任何其他内容。通常选择服务器往往使用RC4或AES - 但是YMMV。