![](/img/trans.png)
[英]Consuming a WCF Service with Monotouch via SSL (https) + basicHttpBinding
[英]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.