1

iPhoneでモノタッチで実行されているアプリケーションがあります。現在、BasicHttpBindingを使用してWCFサービスに接続しています。現在、BasicHttpSecurityMode.Transport(これは事実上HTTPSです)でBasicHttpBindingを再度使用して、接続を安全にするプロセスにあります。

自己署名証明書を作成し、これをサーバーに追加しました。ブラウザ(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

Monotouchが少なくともTLS_RSA_WITH_AES_128_CBC_SHAをサポートしていることはわかっていますが(Wiresharkによる)

誰かがこの問題または回避策を修正するための解決策を持っていますか?たぶん、IISまたはmakecertでいくつかの特別なオプションを使用する必要がありますか?

前もって感謝します!

4

2 に答える 2

0

Mono (および MonoTouch) は、リストの暗号の多くをサポートします (ほとんどは を除く*DH*)。

ログのエラーは、暗号の選択が原因でサーバーが接続を受け入れていないことを示しています。SSL/TLS では、クライアントが自分のリストをサーバーに送信し、サーバーが優先するもの (パフォーマンス/セキュリティ) を選択します。これに影響を与えるために Mono[Touch] 側で変更できるものは何もありません。

サーバーが(Mono から) 提供された暗号を受け入れるように構成されていない場合にのみ、このようなケースを見てきました。これは通常、暗号のみをサポートするように構成されたサーバーです。 *DH*

サーバーが何をサポートしているか (または許可するように構成されているか) を 100% 確実に把握することは必ずしも容易ではありません。SSL/TLS プロトコルは、(クライアントとは異なり) そのようなリストを送信しません。

Wireshark と一部の Web ブラウザを使用してサーバーに接続することをお勧めします。接続が機能し、*DH*暗号を使用している場合、サーバーの構成が間違っている可能性が高いことが (98%) わかります (上記のリストを参照)。

なんで ?ブラウザーは一般に、多くの暗号 (Mono など) および*DH*(Mono とは異なる) をサポートしているためです。したがって、サーバーが*DH*暗号を選択した場合、それは良い手がかりであり、それ以外は許可されません。サーバーの通常の選択では、RC4 または AES を使用する傾向がありますが、YMMV です。

于 2012-05-10T21:39:43.260 に答える
0

ブラウザに証明書エラーが表示されますか? その場合は、次を使用する必要があります。

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

最初の要求の前に、プログラムでこれを 1 回実行します。自己署名証明書も含め、すべての証明書を自動的に受け入れます。

それでも、MonoTouch はここで別のエラー メッセージを表示する必要があると思います。Windows ではどうなりますか?

于 2012-05-09T17:40:51.310 に答える