簡體   English   中英

結合使用HTTPS和Monotouch和WCF

[英]Using HTTPS with Monotouch and WCF

我們有一個在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中使用一些特殊選項?

提前致謝!

瀏覽器是否顯示證書錯誤? 如果是這樣,則必須使用:

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

在您的第一個請求之前,請在您的程序中執行一次此操作。 它會自動接受所有證書,甚至是自簽名證書。

即使如此,我認為MonoTouch應該在此處給出其他錯誤消息。 在Windows上會發生什么?

Mono(和MonoTouch)支持列表中的許多密碼(除帶有*DH*的密碼以外,大多數密碼)。

您的日志中的錯誤表明由於密碼選擇,服務器不接受連接。 在SSL / TLS中,客戶端將其列表發送到服務器,然后服務器選擇它喜歡的列表(性能/安全性)。 您無法在Mono [Touch]端進行任何更改來影響此效果。

當服務器配置為接受任何提供的密碼(來自Mono)時,我看到這種情況。 通常,這些服務器配置為支持*DH*密碼。

要100%確定服務器支持(或配置為允許)並非總是容易的。 SSL / TLS協議從不發送此類列表(與客戶端不同)。

我建議您使用Wireshark和某些Web瀏覽器連接到服務器。 如果連接正常並且使用*DH*密碼,那么您會知道(98%)您的服務器可能配置錯誤(寫了以上列表)。

為什么呢 因為瀏覽器通常支持許多密碼(例如Mono)和*DH* (不同於Mono)。 因此,如果服務器選擇了*DH*密碼,則這是一個很好的提示,它不允許任何其他操作。 服務器的通常選擇傾向於使用RC4或AES-但使用YMMV。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM