web-dev-qa-db-ja.com

Androidおよび自己署名サーバー証明書を使用したHTTPS GET(SSL)

AndroidのHTTPSを介して、自己署名証明書を使用するサーバーから何かを取得する方法に関するさまざまな投稿を調べました。ただし、それらのどれも機能していないようです-それらはすべて削除に失敗します

javax.net.ssl.SSLException:信頼されていないサーバー証明書メッセージ。

信頼できる証明書を持つようにサーバーを変更するオプションではなく、サーバーの証明書をサーバーのIPアドレスと一致させるオプションでもありません。

サーバーはDNS名を持たず、IPアドレスのみを持つことに注意してください。 GETリクエストは次のようになります。

 https://username:password@anyIPAddress/blabla/index.php?param=1&param2=3

私は、このソリューションが中間者攻撃などを起こしやすいことを完全に認識しています。

そのため、ソリューションは証明書の信頼性の欠如を無視し、ホスト名の不一致を無視する必要があります。

Javaを使用して、これを行うコードを知っている人はいますか?

stackoverflow.com でこれを説明しようとする試みはたくさんありますが、コードスニペットもたくさんありますが、機能していないようです。私は見えます。誰かがこれを本当に解決したかどうか、またはAndroidが信頼されていない証明書を単にブロックするかどうかを知ることは興味深いでしょう。

32
Lars D

自己署名を使用するか、すべての証明書を信頼するアプリを作成しました。ソースはここにあります: http://code.google.com/p/meneameandroid/source/browse/#svn/trunk/src/com/dcg/auth そして自由に使用:P

HttpManagerを使用し、信頼のすべてを使用してSSLファクトリを作成するだけです: http://code.google.com/p/meneameandroid/source/browse/trunk/src/com/dcg/util/HttpManager.Java

編集:リンクが更新されました

36
Moss

正しく指摘すると、a)証明書が信頼されない、b)証明書の名前がホスト名と一致しないという2つの問題があります。

警告:この答えにたどり着く他の人にとっては、これは汚くて恐ろしいハックであり、あなたはする必要はありません重要なことにはそれを使用してください。認証なしのSSL/TLSは、暗号化をまったく行わないよりも悪いです。「暗号化された」データの読み取りと変更はtrivial攻撃者とあなたにとってそれが起こっていることすらわかりません

まだ私と一緒に?怖かった...

a)TrustManagerが何でも受け入れるカスタムSSLContextを作成することで解決します:

SSLContext ctx = SSLContext.getInstance("TLS");
ctx.init(null, new TrustManager[] {
  new X509TrustManager() {
    public void checkClientTrusted(X509Certificate[] chain, String authType) {}
    public void checkServerTrusted(X509Certificate[] chain, String authType) {}
    public X509Certificate[] getAcceptedIssuers() { return new X509Certificate[]{}; }
  }
}, null);
HttpsURLConnection.setDefaultSSLSocketFactory(ctx.getSocketFactory());

b)証明書がホスト名と一致しなくても接続を続行できるHostnameVerifierを作成することにより:

HttpsURLConnection.setDefaultHostnameVerifier(new HostnameVerifier() {
  public boolean verify(String hostname, SSLSession session) {
    return true;
  }
});

HttpsURLConnectionsなどをいじり始める前に、コードの最初に両方を行う必要があります。これは、Androidと通常のJREの両方で機能します。お楽しみください。

35
SimonJ
6
Maciek Sawicki

HttpsURLConnectionを使用している場合は、connect()の前にsetHostnameVerifierを呼び出し、真偽に関係なく受け入れるHostnameVerifierを渡してみてください。

6
Yuliy

デバイスにアクセスできる場合は、証明書をキーストアに追加できます。 詳細はこちらをご覧ください

一方、 this メソッドを使用することもできますが、それはちょっといものだと思います。


リソース:

同じトピックについて:

2
Colin Hebert

私に聞いたら、安全な方法でそれをしてください。

良いチュートリアルを見つけました http://blog.antoine.li/index.php/2010/10/Android-trusting-ssl-certificates/ 実装するのはそれほど難しくありません。

また、Maciekが推奨するチュートリアルは非常に優れています。

テストしましたが、アプリで問題なく動作します。

1
saxos

4か月前に自己署名証明書を使用するアプリを作成しました。これが役立つことを願っています。 https://bitbucket.org/momo0002/tlsdemo.git

0
moji