Android SSL接続のトラストアンカーが見つかりません


185

godaddy 256ビットSSL証明書を実行しているIIS6ボックスに接続しようとすると、エラーが発生します。

java.security.cert.CertPathValidatorException: Trust anchor for certification path not found.

何が原因であるかを特定しようとしていましたが、今は空白を描画しています。

接続方法は次のとおりです。

HttpsURLConnection conn;              
conn = (HttpsURLConnection) (new URL(mURL)).openConnection();
conn.setConnectTimeout(20000);
conn.setDoInput(true);
conn.setDoOutput(true);
conn.connect();
String tempString = toString(conn.getInputStream()); 

回答:


78

@Chrispixの解決策は危険です!すべての証明書を信頼することで、誰でも中間者攻撃を行うことができます。証明書をクライアントに送信するだけで受け入れられます!

この投稿で説明されているように、カスタム信頼マネージャーに証明書を追加します。HTTPS経由でHttpClientを使用してすべての証明書を信頼する

カスタム証明書で安全な接続を確立するのは少し複雑ですが、中間者攻撃の危険なしに、必要なssl暗号化セキュリティを提供します。


1
これは自己生成された証明書での作業には問題ありませんが、ルートCAへの有効なチェーンを持つ(OPのような)証明書の場合は、正しく構成されていないサーバーの回避策にすぎません-私の回答を参照してください。
スティービー

4
@Stevieすべての証明書を受け入れることは、概念実証テストのオプションにすぎません。SSL接続は、テストしたい部分ではありません。それ以外の場合、接続が安全ではないため、すべての証明書を受け入れる場合、SSLを使用する必要はありません。
Matthias B

1
ああ、申し訳ありません。誤解があると思います。誰もすべての証明書を受け入れてはならないということに完全に同意します。:)私のコメントは、2番目の段落-カスタムトラストマネージャーを使用するための提案-に関するものでした。このIMHOは、推奨されるソリューションではなく、最後の回避策である必要があります。
スティービー

2
頭を上げてください。人々がそれを「一時的な回避策」と見なしていなかったので、私はより多くの問題を引き起こさないように回避策として貼り付けた「解決策」を削除しました。
Chrispix

7
@Chrispix、部分的な修正を削除すべきではありませんでした。これはテスト目的にのみ適しています
Hugo Allexis Cardona '19

224

承認された回答と逆に、カスタムのトラストマネージャー必要ありません。サーバー構成を修正する必要があります。

dynadot / alphassl証明書が正しくインストールされていないApacheサーバーに接続しているときにも、同じ問題が発生しました。投げていたHttpsUrlConnection(Java / Android)を使用して接続しています-

javax.net.ssl.SSLHandshakeException: 
  java.security.cert.CertPathValidatorException: 
    Trust anchor for certification path not found.

実際の問題は、サーバの設定ミスである-とのテストをhttp://www.digicert.com/help/または類似し、それもあなたの解決策を教えてくれます。

「証明書は信頼できる機関によって署名されていません(Mozillaのルートストアに対してチェックしています)。信頼できる機関から証明書を購入した場合は、おそらく1つ以上の中間証明書をインストールする必要があります。これについては、証明書プロバイダーにお問い合わせください。サーバープラットフォーム。」

opensslで証明書を確認することもできます。

openssl s_client -debug -connect www.thedomaintocheck.com:443

あなたはおそらく見るでしょう:

Verify return code: 21 (unable to verify the first certificate)

そして、以前の出力:

depth=0 OU = Domain Control Validated, CN = www.thedomaintocheck.com
verify error:num=20:unable to get local issuer certificate
verify return:1
depth=0 OU = Domain Control Validated, CN = www.thedomaintocheck.com
verify error:num=27:certificate not trusted
verify return:1
depth=0 OU = Domain Control Validated, CN = www.thedomaintocheck.com
verify error:num=21:unable to verify the first certificate`

証明書チェーンには1つの要素(証明書)のみが含まれます。

Certificate chain
 0 s:/OU=Domain Control Validated/CN=www.thedomaintocheck.com
  i:/O=AlphaSSL/CN=AlphaSSL CA - G2

...しかし、Androidによって信頼されているもの(Verisign、GlobalSignなど)に戻るチェーンの署名機関を参照する必要があります。

Certificate chain
 0 s:/OU=Domain Control Validated/CN=www.thedomaintocheck.com
   i:/O=AlphaSSL/CN=AlphaSSL CA - G2
 1 s:/O=AlphaSSL/CN=AlphaSSL CA - G2
   i:/C=BE/O=GlobalSign nv-sa/OU=Root CA/CN=GlobalSign Root CA
 2 s:/C=BE/O=GlobalSign nv-sa/OU=Root CA/CN=GlobalSign Root CA
   i:/C=BE/O=GlobalSign nv-sa/OU=Root CA/CN=GlobalSign Root CA

サーバーを構成するための手順(および中間証明書)は、通常、証明書を発行した機関によって提供されます例:http : //www.alphassl.com/support/install-root-certificate.html

証明書発行者から提供された中間証明書をインストールした後、HttpsUrlConnectionを使用して接続するときにエラーが発生しなくなりました。


3
OPが接続しているサーバーのSSL構成にアクセスできる場合は、これが解決策になる可能性があります。しかし、彼が接続しているサービスをホストしているのが彼でない場合、彼は自分の側で問題を修正する必要があります。つまり、カスタムの信頼マネージャーを実装します。
Matthias B

9
あなたの解決策は問題なく機能しますが、根本的な原因の修正というよりは回避策であることに同意しませんか?3つのクライアント(Android、iOS、Windows Mobile)からサーバーに接続する必要がある場合、3つすべてに回避策を適用する必要がありますが、サーバーを1回修正すればすべて正常に機能します。
スティービー

2
Stevieに感謝します。サーバーを3か月間誤って構成しました。私のAndroidアプリは100%動作しています
jpros

2
@Stevie同じドメインを共有するさまざまなAPIを何度も呼び出しますが、そのうちの1つだけが(javax.net.ssl.SSLHandshakeException)で失敗します...そのようなことが発生する理由は何ですか?ちなみに、SSL証明書は信頼されていません。したがって、すべての呼び出しは同じ例外で失敗するはずだと思いました。
フェアプレーヤー

1
@dvaeyはサーバーを所有している人と連絡を取り、設定が壊れていて、httpsが正しく機能していないことを伝えます-このリンクを提供して、それをdigicert.com/helpに証明します ...解決します。それ以外の場合は、他の回答の回避策のいずれかを実行する必要がありますが、証明書が期限切れになり、カスタムトラストストアが新しいものと一致しなくなったときに、セキュリティを受け入れない(証明書を無視する)か、アプリを再デプロイする必要があります証明書。
Stevie、

17

実行時に特定の証明書を信頼できます。
サーバーからダウンロードしてアセットを入れ、ssl-utils-androidを使用して次のようにロードします

OkHttpClient client = new OkHttpClient();
SSLContext sslContext = SslUtils.getSslContextForCertificateFile(context, "BPClass2RootCA-sha2.cer");
client.setSslSocketFactory(sslContext.getSocketFactory());

上記の例では使用しましOkHttpClientSSLContextが、Javaの任意のクライアントで使用できます。

ご不明な点がございましたら、お気軽にお問い合わせください。私はこの小さな図書館の作者です。


.pfxはどうですか?
Choletski、2018年

2
すべてのユーザーがAPKを取得すると、アプリのアセットフォルダーにアクセスできるため、これは安全ではありませんか?
Patrice Andala、

1
@PatriceAndala、ルートCAは公開されているため、
問題ありません

17

最新のAndroidドキュメントに基づく更新(2017年3月):

このタイプのエラーが発生した場合:

javax.net.ssl.SSLHandshakeException: java.security.cert.CertPathValidatorException: Trust anchor for certification path not found.
        at org.apache.harmony.xnet.provider.jsse.OpenSSLSocketImpl.startHandshake(OpenSSLSocketImpl.java:374)
        at libcore.net.http.HttpConnection.setupSecureSocket(HttpConnection.java:209)
        at libcore.net.http.HttpsURLConnectionImpl$HttpsEngine.makeSslConnection(HttpsURLConnectionImpl.java:478)
        at libcore.net.http.HttpsURLConnectionImpl$HttpsEngine.connect(HttpsURLConnectionImpl.java:433)
        at libcore.net.http.HttpEngine.sendSocketRequest(HttpEngine.java:290)
        at libcore.net.http.HttpEngine.sendRequest(HttpEngine.java:240)
        at libcore.net.http.HttpURLConnectionImpl.getResponse(HttpURLConnectionImpl.java:282)
        at libcore.net.http.HttpURLConnectionImpl.getInputStream(HttpURLConnectionImpl.java:177)
        at libcore.net.http.HttpsURLConnectionImpl.getInputStream(HttpsURLConnectionImpl.java:271)

問題は次のいずれかである可能性があります。

  1. サーバー証明書を発行したCAは不明です
  2. サーバー証明書はCAによって署名されていませんが、自己署名されていました
  3. サーバー構成に中間CAがありません

解決策はHttpsURLConnection、特定のCAセットを信頼することを教えることです。どうやって?https://developer.android.com/training/articles/security-ssl.html#CommonProblemsを確認してください

ライブラリAsyncHTTPClientから使用している他のユーザーは、HTTPSを使用するようにSetup AsyncHttpClientをcom.loopj.android:android-async-http確認してください。


5
okhttpクライアントを使用している場合はどうなりますか?
TheLearner 2017年

okhttpの場合、plsは@mklimekの回答を確認します。
user1506104

14

レトロフィットを使用する場合は、OkHttpClientをカスタマイズする必要があります。

retrofit = new Retrofit.Builder()
                        .baseUrl(ApplicationData.FINAL_URL)
                        .client(getUnsafeOkHttpClient().build())
                        .addConverterFactory(GsonConverterFactory.create())
                        .build();

完全なコードは次のとおりです。

    public class RestAdapter {

    private static Retrofit retrofit = null;
    private static ApiInterface apiInterface;

    public static OkHttpClient.Builder getUnsafeOkHttpClient() {
        try {
            // Create a trust manager that does not validate certificate chains
            final TrustManager[] trustAllCerts = new TrustManager[]{
                    new X509TrustManager() {
                        @Override
                        public void checkClientTrusted(java.security.cert.X509Certificate[] chain, String authType) throws CertificateException {
                        }

                        @Override
                        public void checkServerTrusted(java.security.cert.X509Certificate[] chain, String authType) throws CertificateException {
                        }

                        @Override
                        public java.security.cert.X509Certificate[] getAcceptedIssuers() {
                            return new java.security.cert.X509Certificate[]{};
                        }
                    }
            };

            // Install the all-trusting trust manager
            final SSLContext sslContext = SSLContext.getInstance("SSL");
            sslContext.init(null, trustAllCerts, new java.security.SecureRandom());

            // Create an ssl socket factory with our all-trusting manager
            final SSLSocketFactory sslSocketFactory = sslContext.getSocketFactory();

            OkHttpClient.Builder builder = new OkHttpClient.Builder();
            builder.sslSocketFactory(sslSocketFactory, (X509TrustManager) trustAllCerts[0]);
            builder.hostnameVerifier(new HostnameVerifier() {
                @Override
                public boolean verify(String hostname, SSLSession session) {
                    return true;
                }
            });
            return builder;
        } catch (Exception e) {
            throw new RuntimeException(e);
        }
    }

    public static ApiInterface getApiClient() {
        if (apiInterface == null) {

            try {
                retrofit = new Retrofit.Builder()
                        .baseUrl(ApplicationData.FINAL_URL)
                        .client(getUnsafeOkHttpClient().build())
                        .addConverterFactory(GsonConverterFactory.create())
                        .build();

            } catch (Exception e) {

                e.printStackTrace();
            }


            apiInterface = retrofit.create(ApiInterface.class);
        }
        return apiInterface;
    }

}

1
コードを使用しようとしていますが、次のエラーが再び表示されます。
Vishwa Pratap

これは根本的に安全ではありません。使ってはいけません。
ローン侯爵

ありがとう!getUnsafeOkHttpClient()Kotlin のメソッドを書き直しました:stackoverflow.com/a/60507560/2914140
CoolMind

11

非常に古い投稿に返信しています。しかし、多分それはいくつかの初心者を助け、上記のどれでもうまくいかない場合。

説明:私は誰も説明のがらくたを望んでいないことを知っています。むしろ解決策です。しかし、1つのライナーで、ローカルマシンから、マシンを信頼しないリモートマシンにサービスにアクセスしようとしています。リモートサーバーから信頼を得る必要があると要求します。

解決策:次の解決策は、次の条件が満たされていることを前提としています

  1. ローカルマシンからリモートAPIにアクセスしようとしています。
  2. Androidアプリ用にビルドしています
  3. リモートサーバーがプロキシフィルタリングされている(ブラウザー設定でプロキシを使用して、リモートapiサービス、通常はステージングサーバーまたは開発サーバーにアクセスする)
  4. 実際のデバイスでテストしています

手順:

アプリにサインアップするには、.keystore拡張子ファイルが必要です。.keystoreファイルの作成方法がわからない場合は、次に、次のセクションに従って.keystoreファイルを作成するか、次のセクションにスキップしてApkファイルに署名します

.keystoreファイルを作成する

Android Studioを開きます。トップメニューの[ビルド]> [署名済みAPKを生成]をクリックします。次のウィンドウで、[ 新規作成... ]ボタンをクリックします。新しいウィンドウで、すべてのフィールドにデータを入力してください。2つのパスワードフィールドには同じパスワードを使用することをお勧めします。別のパスワードを使用しないでください。また、一番上のフィールドキーストアパスの保存パスも覚えておいてください。すべてのフィールドを入力したら、[OK]ボタンをクリックします。

署名APKファイル

次に、作成した.keystoreファイルを使用して署名付きアプリを構築する必要があります。次の手順を実行します

  1. ビルド>プロジェクトのクリーニング、クリーニングが完了するまで待ちます
  2. ビルド>署名済みAPKの生成
  3. ボタンをChoose existing...クリック
  4. 「.keystoreファイルの作成」セクションで作成した.keystoreファイルを選択します
  5. .keystoreファイルの作成セクションで作成中に作成したものと同じパスワードを入力します。フィールドKey store passwordKey passwordフィールドに同じパスワードを使用します。エイリアスも入力してください
  6. 次へボタンをクリックします
  7. 次の画面で; build.gradleファイルの設定によって異なる場合があります。Build Typesとを選択する必要がありますFlavors
  8. ドロップダウンからのBuild Types選択についてrelease
  9. 以下のためにFlavors、それはあなたの中の設定に依存しますがbuild.gradleファイル。stagingこのフィールドから選択してください。私は次の設定を使用しましたがbuild.gradle、私のものと同じように使用できますが、必ずapplicationIdパッケージ名に変更してください

    productFlavors {
        staging {
            applicationId "com.yourapplication.package"
            manifestPlaceholders = [icon: "@drawable/ic_launcher"]
            buildConfigField "boolean", "CATALYST_DEBUG", "true"
            buildConfigField "boolean", "ALLOW_INVALID_CERTIFICATE", "true"
        }
        production {
            buildConfigField "boolean", "CATALYST_DEBUG", "false"
            buildConfigField "boolean", "ALLOW_INVALID_CERTIFICATE", "false"
        }
    }
  10. 下の2つのSignature Versionsチェックボックスをクリックして、Finishボタンをクリックします。

ほとんどそこに:

すべてのハードワークが完了し、今は真実の動きです。プロキシでバックアップされたステージングサーバーにアクセスするには、実際のテスト用Androidデバイスでいくつかの設定を行う必要があります。

Androidデバイスのプロキシ設定:

  1. Androidフォン内の設定をクリックしてから、Wi-Fi
  2. 接続されているWi-Fiを長押しして選択します Modify network
  3. クリックしてAdvanced optionsあなたが見ることができない場合はProxy Hostname、フィールドを
  4. Proxy Hostname接続したいホストのIPアドレスまたは名前を入力します。典型的なステージングサーバーの名前はstg.api.mygoodcompany.com
  5. ポートには、たとえば4桁のポート番号を入力します。 9502
  6. ヒットSaveボタンを

最後にもう1つ:

Sign APK Fileセクションで署名済みapkファイルを生成したことを思い出してください。今がそのAPKファイルをインストールする時です。

  1. ターミナルを開き、署名済みのapkファイルフォルダーに変更します
  2. Androidデバイスをマシンに接続します
  3. Androidデバイスから以前にインストールしたapkファイルを削除します
  4. 走る adb install name of the apk file
  5. 何らかの理由で上記のコマンドがで戻る場合adb command not found。フルパスを入力してくださいC:\Users\shah\AppData\Local\Android\sdk\platform-tools\adb.exe install name of the apk file

問題が解決することを願っています。そうでなければコメントを残してください。

サラム!


4

私が受け取っていたエラーメッセージは似ていましたが、理由は自己署名証明書の有効期限が切れていたためです。opensslクライアントが試行されたとき、Firefoxからの証明書ダイアログを確認しているときに見落とされていた理由がわかりました。

したがって、一般的に、証明書がキ​​ーストアとその「有効」にある場合、このエラーは発生します。


1
証明書の有効期限が切れている場合は、いくつかの基準に従って有効ではありません。カスタムTrustManagerを使用して別の基準のセットを使用することは問題ありません。しかし、箱から出して、それはあなたが使用しなければならないものです。
jww 14

4

AndroidクライアントからKurentoサーバーに接続するときにも同じ問題が発生しました。Kurentoサーバーはjks証明書を使用するため、pemをそれに変換する必要がありました。変換の入力としてcert.pemファイルを使用しましたが、そのようなエラーが発生しました。しかし、cert.pemの代わりにfullchain.pemを使用する場合-すべて問題ありません


3

ドメインをテストするには、https://www.ssllabs.com/ssltest/を使用します。

Kotlin のShihab Uddinのソリューション。

import java.security.SecureRandom
import java.security.cert.X509Certificate
import javax.net.ssl.*
import javax.security.cert.CertificateException

companion object {

    private val gson: Gson
    private val retrofit: Retrofit

    init {

        val okHttpClient = getUnsafeOkHttpClient() // OkHttpClient().newBuilder()
            .build()

        gson = GsonBuilder().setLenient().create()

        retrofit = Retrofit.Builder()
            .baseUrl(BASE_URL)
            .client(okHttpClient)
            .addConverterFactory(GsonConverterFactory.create(gson))
            .build()
    }

    private fun getUnsafeOkHttpClient(): OkHttpClient.Builder =
        try {
            // Create a trust manager that does not validate certificate chains
            val trustAllCerts: Array<TrustManager> = arrayOf(
                object : X509TrustManager {
                    @Throws(CertificateException::class)
                    override fun checkClientTrusted(chain: Array<X509Certificate?>?,
                                                    authType: String?) = Unit

                    @Throws(CertificateException::class)
                    override fun checkServerTrusted(chain: Array<X509Certificate?>?,
                                                    authType: String?) = Unit

                    override fun getAcceptedIssuers(): Array<X509Certificate> = arrayOf()
                }
            )
            // Install the all-trusting trust manager
            val sslContext: SSLContext = SSLContext.getInstance("SSL")
            sslContext.init(null, trustAllCerts, SecureRandom())
            // Create an ssl socket factory with our all-trusting manager
            val sslSocketFactory: SSLSocketFactory = sslContext.socketFactory
            val builder = OkHttpClient.Builder()
            builder.sslSocketFactory(sslSocketFactory,
                trustAllCerts[0] as X509TrustManager)
            builder.hostnameVerifier { _, _ -> true }
            builder
        } catch (e: Exception) {
            throw RuntimeException(e)
        }
}

2

私が見つけたのと同じ問題がありましたが、提供した証明書の.crtファイルに中間証明書がありません。そのため、サーバー管理者にすべての.crtファイルを尋ね、逆の順序で連結しました。

例 1. Root.crt 2. Inter.crt 3. myCrt.crt

Windowsで私はコピーInter.crt + Root.crt newCertificate.crtを実行しました

(ここでは、myCrt.crtを無視しました)

次に、newCertificate.crtファイルをinputstreamを介してコードに提供しました。仕事完了。


同じ問題もありました。中間証明書がありませんでした
Nidhin Chandran 2017

1

トラストアンカーエラーは、さまざまな理由で発生する可能性があります。私にとっては、のhttps://example.com/代わりにアクセスしようとしただけでしたhttps://www.example.com/

したがって、(私が行ったように)独自のトラストマネージャーの構築を開始する前に、URLを再確認することをお勧めします。


0

ジンジャーブレッドの電話ではTrust Anchor not found for Android SSL Connection、証明書に依存するように設定した場合でも、常に次のエラーが発生します。

これが私が使用するコードです(Scala言語で):

object Security {
    private def createCtxSsl(ctx: Context) = {
        val cer = {
            val is = ctx.getAssets.open("mycertificate.crt")
            try
                CertificateFactory.getInstance("X.509").generateCertificate(is)
            finally
                is.close()
        }
        val key = KeyStore.getInstance(KeyStore.getDefaultType)
        key.load(null, null)
        key.setCertificateEntry("ca", cer)

        val tmf = TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm)
    tmf.init(key)

        val c = SSLContext.getInstance("TLS")
        c.init(null, tmf.getTrustManagers, null)
        c
    }

    def prepare(url: HttpURLConnection)(implicit ctx: Context) {
        url match {
            case https: HttpsURLConnection 
                val cSsl = ctxSsl match {
                    case None 
                        val res = createCtxSsl(ctx)
                        ctxSsl = Some(res)
                        res
                    case Some(c)  c
                }
                https.setSSLSocketFactory(cSsl.getSocketFactory)
            case _ 
        }
    }

    def noSecurity(url: HttpURLConnection) {
        url match {
            case https: HttpsURLConnection 
                https.setHostnameVerifier(new HostnameVerifier {
                    override def verify(hostname: String, session: SSLSession) = true
                })
            case _ 
        }
    }
}

そしてここに接続コードがあります:

def connect(securize: HttpURLConnection  Unit) {
    val conn = url.openConnection().asInstanceOf[HttpURLConnection]
    securize(conn)
    conn.connect();
    ....
}

try {
    connect(Security.prepare)
} catch {
    case ex: SSLHandshakeException /*if ex.getMessage != null && ex.getMessage.contains("Trust anchor for certification path not found")*/ 
        connect(Security.noSecurity)
}

基本的に、私は自分のカスタム証明書を信頼するように設定します。それが失敗した場合は、セキュリティを無効にします。これは最良のオプションではありませんが、古くてバグのある電話で私が知っている唯一の選択肢です。

このサンプルコードは、Javaに簡単に変換できます。


誰かがAndroid 2.3.xを必要とする場合の解決策、stackoverflow.com
a / 46465722/7125370

0

私の場合、これはAndroid 8.0へのアップデート後に発生していました。Androidが信頼するように設定された自己署名証明書は、署名アルゴリズムSHA1withRSAを使用していました。署名アルゴリズムSHA256withRSAを使用して新しい証明書に切り替えると、問題が修正されました。


0

すべての証明書を信頼する必要はないことはわかっていますが、私の場合、自己署名証明書があり、ダーティーソリューションが必要なデバッグ環境で問題が発生しました。

私がしなければならなかったすべてはの初期化を変更することでした sslContext

mySSLContext.init(null, trustAllCerts, null); 

次のようtrustAllCertsに作成されました:

private final TrustManager[] trustAllCerts= new TrustManager[] { new X509TrustManager() {
    public java.security.cert.X509Certificate[] getAcceptedIssuers() {
        return new java.security.cert.X509Certificate[]{};
    }

    public void checkClientTrusted(X509Certificate[] chain,
                                   String authType) throws CertificateException {
    }

    public void checkServerTrusted(X509Certificate[] chain,
                                   String authType) throws CertificateException {
    }
} };

これが重宝すると思います。


それは私が見つけたかったです!ありがとう
13:22にoxied

エラーが発生しますHostname '192.168.0.16' was not verified。デバッガー(IIS Express)を介してローカルでwebapiをテストしています。これを修正する方法はありますか?おかげで:)
サム

1
これは根本的に安全ではありません。使ってはいけません。
ローン侯爵

0

私も同様の問題を抱えており、すべてのソースを信頼する戦略を完全に除外しました。

Kotlinに実装されたアプリケーションに適用された私のソリューションをここで共有します

最初に次のWebサイトを使用し、証明書とその有効性に関する情報を取得することをお勧めします

Androidのデフォルトのトラストストア「承認された発行者」として表示されない場合は、その証明書を取得してアプリケーションに組み込んで、カスタムトラストストアを作成する必要があります。

私の場合の理想的な解決策は、カスタムとAndroidのデフォルトのトラストストアを組み合わせた高レベルのトラストマネージャーを作成することでした。

ここで彼は、Retrofitで使用したOkHttpClientを構成するために使用される高レベルのコードを公開します。

override fun onBuildHttpClient(httpClientBuild: OkHttpClient.Builder) {

        val trustManagerWrapper = createX509TrustManagerWrapper(
            arrayOf(
                getCustomX509TrustManager(),
                getDefaultX509TrustManager()
            )
        )

        printX509TrustManagerAcceptedIssuers(trustManagerWrapper)

        val sslSocketFactory = createSocketFactory(trustManagerWrapper)
        httpClientBuild.sslSocketFactory(sslSocketFactory, trustManagerWrapper)

    }

このようにして、自己署名証明書を使用してサーバーと通信し、信頼された認証エンティティによって発行された証明書を使用して他のサーバーと通信できます

これで終わりです。誰かのお役に立てれば幸いです。


0

私はこれが非常に古い記事であることを知っていますが、トラストアンカーの問題を解決しようとしたときにこの記事に遭遇しました。修正方法を投稿しました。ルートCAをプレインストールしている場合は、マニフェストに構成を追加する必要があります。

https://stackoverflow.com/a/60102517/114265


API 24+のみ
BekaBot

@BekaBot-これはおそらく正しいですが、ドキュメント23とそれ以下では、デフォルトでユーザー証明書を信頼していますデフォルトでは、すべてのアプリからのセキュアな接続(TLSやHTTPSなどのプロトコルを使用)は、プレインストールされたシステムCA、およびAndroid 6.0をターゲットとするアプリを信頼しています(APIレベル23)以下もデフォルトでユーザーが追加したCAストアを信頼します
GR Envoy

-1
**Set proper alias name**
CertificateFactory certificateFactory = CertificateFactory.getInstance("X.509","BC");
            X509Certificate cert = (X509Certificate) certificateFactory.generateCertificate(derInputStream);
            String alias = cert.getSubjectX500Principal().getName();
KeyStore trustStore = KeyStore.getInstance(KeyStore.getDefaultType());
            trustStore.load(null);
trustStore.setCertificateEntry(alias, cert);

-2

私も同じ問題に直面しています。私はhhtpsをhttpに削除するだけです

final public static String ROOT_URL = "https://example.com";final public static String ROOT_URL = "http://example.com";

最後に、私はこの問題を解決しました。


確かに、これは方程式からSSLセキュリティを削除するだけであり、これはおそらく実稼働環境にとっては悪い考えです。
Dragonthoughts

これは実際にはソリューションではなく、SSLセキュリティを削除します。
omega1
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.