如何以编程方式在 couchbase android 中添加 ssl 证书

Posted

技术标签:

【中文标题】如何以编程方式在 couchbase android 中添加 ssl 证书【英文标题】:How to add ssl certificate in couchbase android programmatically 【发布时间】:2020-03-31 13:07:11 【问题描述】:

下面是我的代码:

   database = Utils.inializeDb(HomeActivity.this, "company-3");

    URL url = null;
    try 
        url = new URL("https://*********/db_name");

     catch (IOException e) 
        e.printStackTrace();
    
    Replication push = database.createPushReplication(url);
    Replication pull = database.createPullReplication(url);


    Authenticator auth = AuthenticatorFactory.createBasicAuthenticator("admin", "1m2p3k4n");
    pull.setAuthenticator(auth);

    push.setContinuous(true);
    pull.setContinuous(true);


    pull.start();

我想在这段代码中添加 ssl 证书..

以下是错误代码;

javax.net.ssl.SSLHandshakeException:java.security.cert.CertPathValidatorException:找不到证书路径的信任锚。 在 com.android.org.conscrypt.OpenSSLSocketImpl.startHandshake(OpenSSLSocketImpl.java:366) 在 okhttp3.internal.connection.RealConnection.connectTls(RealConnection.kt:351) 在 okhttp3.internal.connection.RealConnection.establishProtocol(RealConnection.kt:310) 在 okhttp3.internal.connection.RealConnection.connect(RealConnection.kt:178) 在 okhttp3.internal.connection.ExchangeFinder.findConnection(ExchangeFinder.kt:236) 在 okhttp3.internal.connection.ExchangeFinder.findHealthyConnection(ExchangeFinder.kt:109) 在 okhttp3.internal.connection.ExchangeFinder.find(ExchangeFinder.kt:77) 在 okhttp3.internal.connection.Transmitter.newExchange$okhttp(Transmitter.kt:162) 在 okhttp3.internal.connection.ConnectInterceptor.intercept(ConnectInterceptor.kt:35) 在 okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.kt:112) 在 okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.kt:87) 在 okhttp3.internal.cache.CacheInterceptor.intercept(CacheInterceptor.kt:82) 在 okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.kt:112) 在 okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.kt:87) 在 okhttp3.internal.http.BridgeInterceptor.intercept(BridgeInterceptor.kt:84) 在 okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.kt:112) 在 okhttp3.internal.http.RetryAndFollowUpInterceptor.intercept(RetryAndFollowUpInterceptor.kt:71) 在 okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.kt:112) 在 okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.kt:87) 在 okhttp3.RealCall.getResponseWithInterceptorChain(RealCall.kt:184) 在 okhttp3.RealCall.execute(RealCall.kt:66) 在 com.couchbase.lite.replicator.RemoteRequest.executeRequest(RemoteRequest.java:262) 在 com.couchbase.lite.replicator.RemoteRequest.execute(RemoteRequest.java:166) 在 com.couchbase.lite.replicator.RemoteRequest.run(RemoteRequest.java:106) 在 java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:428) 在 java.util.concurrent.FutureTask.run(FutureTask.java:237) 在 java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:272) 在 java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1133) 在 java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:607) 在 java.lang.Thread.run(Thread.java:761) 原因:java.security.cert.CertificateException:java.security.cert.CertPathValidatorException:找不到证书路径的信任锚。 在 com.android.org.conscrypt.TrustManagerImpl.checkTrustedRecursive(TrustManagerImpl.java:549) 在 com.android.org.conscrypt.TrustManagerImpl.checkTrusted(TrustManagerImpl.java:401) 在 com.android.org.conscrypt.TrustManagerImpl.checkTrusted(TrustManagerImpl.java:375) 在 com.android.org.conscrypt.TrustManagerImpl.getTrustedChainForServer(TrustManagerImpl.java:304) 在 android.security.net.config.NetworkSecurityTrustManager.checkServerTrusted(NetworkSecurityTrustManager.java:94) 在 android.security.net.config.RootTrustManager.checkServerTrusted(RootTrustManager.java:88) 在 com.android.org.conscrypt.Platform.checkServerTrusted(Platform.java:178) 在 com.android.org.conscrypt.OpenSSLSocketImpl.verifyCertificateChain(OpenSSLSocketImpl.java:611) 在 com.android.org.conscrypt.NativeCrypto.SSL_do_handshake(本机方法) 在 com.android.org.conscrypt.OpenSSLSocketImpl.startHandshake(OpenSSLSocketImpl.java:362)

【问题讨论】:

【参考方案1】:

从错误来看,它看起来像是来自知名可信 CA 的 Sync Gateway 证书,或者它可能是自签名的。证书是如何颁发的?按照步骤here 配置您的系统以接受证书。

您从 1.x 版本的 Couchbase Lite 开始有什么原因吗?版本 1.x 是 EoL 将近一年。你应该切换到2.x。

【讨论】:

以上是关于如何以编程方式在 couchbase android 中添加 ssl 证书的主要内容,如果未能解决你的问题,请参考以下文章

如何以编程方式在 Android 按钮上设置 drawableLeft?

如何在android中以编程方式更改文件/文件夹权限

如何在带有 Android 5.0 Lollipop 的代码(不是 xml)中以编程方式使用 RippleDrawable?

以编程方式设置android xml

无法使用被动方法将文档保存到couchbase

如何从 Android 应用程序将 json 文件格式导入 CouchBase lite