【问题标题】:Using HTTPS with Monotouch and WCF将 HTTPS 与 Monotouch 和 WCF 一起使用
【发布时间】:2012-05-09 13:26:55
【问题描述】:

我们有一个在 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 中使用一些特殊选项?

提前致谢!

【问题讨论】:

    标签: iphone wcf ssl xamarin.ios makecert


    【解决方案1】:

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

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

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

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

    【讨论】:

      【解决方案2】:

      Mono(和 MonoTouch)支持您列表中的许多密码(大多数除了带有 *DH* 的密码)。

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

      我见过这种情况仅在服务器未配置为接受任何提供的密码(来自 Mono)时。这通常是配置为支持仅 *DH* 密码的服务器。

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

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-02-25
        • 2017-06-12
        • 2012-09-12
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多