2016-10-13 10 views
0

Xamarin AndroidアプリケーションからIISサーバーに安全なwebsocket接続を開こうとしています。それは今まで使ったことのあるすべてのデバイスでうまく動作します。Samsung Tab E他のサムスンのデバイスでも正常に動作します。この場合セキュリティで保護されたwebsocket接続を開くときに予期しない例外が発生しました

var _webSocket = WebSocketFactory.Create(); 
_webSocket.OnOpened += _webSocket_Opened; 
_webSocket.OnError += _webSocket_Error; 
_webSocket.Open("wss://server.name.here/path/also/"); 

エラーハンドラを使って呼び出される:

[WebSocketを] javax.net.sslの

私はWebsockets.PCLライブラリと通常のコードを使用しています。 SSLException
[WebSocketを] javax.net.ssl.SSLException:javax.net.ssl.SSLException:エラーが委任タスクで発生した予期しない例外

このデバイスやその他のデバイスではなく、Chromeやその他のアプリ経由でのSSL接続に問題はありません。また、SignalRを介してこのアプリケーションから同じIISサーバーに接続することも問題ありません。

それが他のサードパーティのライブラリは、別のWebサイトからライセンスを確認しようとしている問題を持っていないとエラーが記録されます。

javax.net.ssl.SSLHandshakeException:持つjavax.net.sslを.SSLProtocolException:SSLハンドシェイクが中止:SSL = 0x803b3b28:失敗をSSLライブラリーでは、通常、プロトコルエラー

私はそこに何が起こっているかをチェックすることはできませんので、連絡しようとして対処しているか分かりません。しかし、これは他のデバイスからも機能します。

これは、javax.net.sslによるこれらの2つの接続試行が失敗しているため、タブEのAndroid(v4.4.4、最新のもの)がSSL実装に問題があると考えています。しかし予期しない例外は多くの情報を与えていない。

これを回避するには?私はSignalRが使用するウェブソケットの実装を使用しても構いませんが、私が知っている限り、それは一般的な使用システムとして使用する準備ができていません。

追加情報

サーバがうまくTLS1の話を行い、ルートが知られていない場合を除きそれは、問題ではありませんので(、限り私はそれを知っているように、全体の証明書パスを送り、Iおよびそうであればハンドシェイクの失敗を予想します)。 OpenSSLを有する試験は示しています

証明書チェーン
0 S:/ OU =ドメイン制御検証済み/ OU = PositiveSSL/CN = our.domainを。com
i:/ C = GB/ST =大マンチェスタ/ L = Salford/O = COMODO CA Limited/CN = COMODO RSAドメイン検証セキュアサーバーCA
1 s:/ C = GB/ST =大マンチェスタ/ L = Salford/O = COMODO CA Limited/CN = COMODO RSAドメイン検証セキュアサーバーCA
i:/ C = GB/ST = Greater Manchester/L = Salford/O = COMODO CA Limited/CN = COMODO RSA証明機関
AddTrust ABT/OU = AddTrust外部TTPネットワーク/ 2:s/C = GB/ST =グレーターマンチェスター/ L = Salford/O = COMODO CA Limited/CN = COMODO RSA認証機関
CN = AddTrust外部CAルート

クライアント証明書CA名が送信されていません
キー サーバーの温度は:ECDH、P-256、256ビット

新しい、TLSv1の/のSSLv3、暗号がECDHE-RSA-AES256-SHA
サーバーの公開鍵が2048ビット

です残念ながら、OpenSSLは」doesnの'-ssl2`フラグをサポートしません。オンラインツールでは、SSL2が無効で、SSL3、TLS1、TLS1.1、およびTLS1.2が有効になっていると言われています。

私はカスタムSSLSocketFactoryルートを試すことができましたが、XamarinとWebsockets.PCLをどのように通過するのかを確認する必要があります。

+0

Android 4.4以降で[SSLHandshakeException]が重複している可能性があります(http://stackoverflow.com/questions/37222696/sslhandshakeexception-on-android-4-4-and-lower) – SushiHangover

+0

古いAndroid 4.2デバイスでもうまく動作しています。 –

+0

私は*いくつかのことを想定しています。 CA証明書は異なるので、独自の 'TrustManager'を使ってクライアント証明書を処理する必要があります。そうすれば、カスタムTrustManagerがそれを解決するために自己署名証明書を使用しています。 4.2はABIリリース4.4とは違って、KitKatとJBK、ICSではcertsにいくつかの問題があります....さらにそのデバイス(Tab-E)は、性能上の問題のためにSamsung-KitKat変種です。あなたのサーバはTLS1.1だけをサポートしていますか? TLS1.2?...など... – SushiHangover

答えて

1

AndroidでSSLの問題を検索した後、私の場合の解決策を見つけました。 Florian Krauthanは、これらのことについて書いており、TLS1.1などの使用を許可するためにusing the SSLSocketFactory on Android 4.1+について語っています。Google Play Services can be used to inject a newer OpenSSL libraryが全体のアプリケーションにどのように説明されているのかを別の投稿に導きました。この方法は、私の問題にも役立ちました。

実行する必要がある唯一のものは、主な活動のOnCreate()メソッドの先頭に次のコードを追加することです:

Android.Gms.Security.ProviderInstaller.InstallIfNeeded(this); 

この後、アプリケーションは、GoogleがサービスOpenSSLライブラリを再生するので、すべての接続を使用します。新しいバージョンが使用されているため、組み込みのAndroid OpenSSLライブラリに問題のない作業や既知のバグが緩和されます。

もちろん、Google Playサービスをまだ使用していないユーザーにとっては、アプリケーションサイズを大幅に増加させるため、これはソリューションではない可能性があります。

関連する問題