Iphone 将HTTPS与Monotouch和WCF结合使用

Iphone 将HTTPS与Monotouch和WCF结合使用,iphone,wcf,ssl,xamarin.ios,makecert,Iphone,Wcf,Ssl,Xamarin.ios,Makecert,我们在iPhone上有一个运行monotouch的应用程序。目前,我们正在使用BasicHttpBinding连接到WCF服务。我们现在正在使连接安全,再次使用BasicHttpBinding和BasicHttpSecurityMode 我们创建了一个自签名证书并将其添加到服务器上。当从iPhone和PC通过浏览器访问服务器地址时,我们可以毫无问题地连接到它。但是,如果我们连接MonoTouch应用程序,我们将得到以下例外情况: System.Net.WebException has b

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

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

    System.Net.WebException has been thrown
    Error writing request: BeginWrite failure
我们使用Wireshark分析连接,发现服务器正在关闭连接。服务器在收到ClientHello后发送tcp重置。我们在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
据Wireshark称,我们知道Monotouch至少支持TLS_RSA_和_AES_128_CBC_SHA

是否有人有解决此问题的解决方案或解决方法?也许我们需要在IIS或makecert中使用一些特殊选项


提前谢谢

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

ServicePointManager.ServerCertificateValidationCallback = (a, b, c, d) => true;
在第一次请求之前,在程序中执行此操作一次。它自动接受所有证书,甚至是自签名证书


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

Mono和MonoTouch支持列表中的许多密码,除了带有*DH*的密码

日志上的错误表明服务器由于选择了密码而不接受连接。在SSL/TLS中,客户机将其列表发送到服务器,服务器选择它喜欢的性能/安全性列表。在单声道[触摸]方面没有什么可以改变的

只有当服务器未配置为接受Mono提供的任何密码时,我才见过这种情况。这通常是配置为仅支持*DH*密码的服务器

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

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

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