Skip to content

Trust user CA certificates #49

@micaplush

Description

@micaplush

Hi! First of all, great app. However, I've noticed it doesn't seem to trust user-provided CA certificates. I've tried setting up monitoring for an HTTPS service that uses a network-internal CA which I've added to the system trust store. The certificates are set up correctly since it works in the browser but when I try refreshing the website entry I'm getting Status: 0 - Unknown and a certificate-related stack trace in Logcat.

It's not super important for me but it would be a nice feature to trust user CA certificates as well.

Logcat output
10-27 01:07:17.945 19300 19338 E Webmon ##--> : javax.net.ssl.SSLHandshakeException: java.security.cert.CertPathValidatorException: Trust anchor for certification path not found.
10-27 01:07:17.945 19300 19338 E Webmon ##--> : 	at com.android.org.conscrypt.SSLUtils.toSSLHandshakeException(SSLUtils.java:356)
10-27 01:07:17.945 19300 19338 E Webmon ##--> : 	at com.android.org.conscrypt.ConscryptEngine.convertException(ConscryptEngine.java:1134)
10-27 01:07:17.945 19300 19338 E Webmon ##--> : 	at com.android.org.conscrypt.ConscryptEngine.readPlaintextData(ConscryptEngine.java:1089)
10-27 01:07:17.945 19300 19338 E Webmon ##--> : 	at com.android.org.conscrypt.ConscryptEngine.unwrap(ConscryptEngine.java:876)
10-27 01:07:17.945 19300 19338 E Webmon ##--> : 	at com.android.org.conscrypt.ConscryptEngine.unwrap(ConscryptEngine.java:747)
10-27 01:07:17.945 19300 19338 E Webmon ##--> : 	at com.android.org.conscrypt.ConscryptEngine.unwrap(ConscryptEngine.java:712)
10-27 01:07:17.945 19300 19338 E Webmon ##--> : 	at com.android.org.conscrypt.ConscryptEngineSocket$SSLInputStream.processDataFromSocket(ConscryptEngineSocket.java:896)
10-27 01:07:17.945 19300 19338 E Webmon ##--> : 	at com.android.org.conscrypt.ConscryptEngineSocket$SSLInputStream.-$$Nest$mprocessDataFromSocket(Unknown Source:0)
10-27 01:07:17.945 19300 19338 E Webmon ##--> : 	at com.android.org.conscrypt.ConscryptEngineSocket.doHandshake(ConscryptEngineSocket.java:236)
10-27 01:07:17.945 19300 19338 E Webmon ##--> : 	at com.android.org.conscrypt.ConscryptEngineSocket.startHandshake(ConscryptEngineSocket.java:218)
10-27 01:07:17.945 19300 19338 E Webmon ##--> : 	at org.apache.hc.client5.http.ssl.SSLConnectionSocketFactory.createLayeredSocket(SSLConnectionSocketFactory.java:276)
10-27 01:07:17.945 19300 19338 E Webmon ##--> : 	at org.apache.hc.client5.http.ssl.SSLConnectionSocketFactory.connectSocket(SSLConnectionSocketFactory.java:244)
10-27 01:07:17.945 19300 19338 E Webmon ##--> : 	at org.apache.hc.client5.http.impl.io.DefaultHttpClientConnectionOperator.connect(DefaultHttpClientConnectionOperator.java:148)
10-27 01:07:17.945 19300 19338 E Webmon ##--> : 	at org.apache.hc.client5.http.impl.io.PoolingHttpClientConnectionManager.connect(PoolingHttpClientConnectionManager.java:413)
10-27 01:07:17.945 19300 19338 E Webmon ##--> : 	at org.apache.hc.client5.http.impl.classic.InternalExecRuntime.connectEndpoint(InternalExecRuntime.java:164)
10-27 01:07:17.945 19300 19338 E Webmon ##--> : 	at org.apache.hc.client5.http.impl.classic.InternalExecRuntime.connectEndpoint(InternalExecRuntime.java:174)
10-27 01:07:17.945 19300 19338 E Webmon ##--> : 	at org.apache.hc.client5.http.impl.classic.ConnectExec.execute(ConnectExec.java:135)
10-27 01:07:17.945 19300 19338 E Webmon ##--> : 	at org.apache.hc.client5.http.impl.classic.ExecChainElement.execute(ExecChainElement.java:51)
10-27 01:07:17.945 19300 19338 E Webmon ##--> : 	at org.apache.hc.client5.http.impl.classic.ExecChainElement$1.proceed(ExecChainElement.java:57)
10-27 01:07:17.945 19300 19338 E Webmon ##--> : 	at org.apache.hc.client5.http.impl.classic.ProtocolExec.execute(ProtocolExec.java:169)
10-27 01:07:17.945 19300 19338 E Webmon ##--> : 	at org.apache.hc.client5.http.impl.classic.ExecChainElement.execute(ExecChainElement.java:51)
10-27 01:07:17.945 19300 19338 E Webmon ##--> : 	at org.apache.hc.client5.http.impl.classic.ExecChainElement$1.proceed(ExecChainElement.java:57)
10-27 01:07:17.945 19300 19338 E Webmon ##--> : 	at org.apache.hc.client5.http.impl.classic.HttpRequestRetryExec.execute(HttpRequestRetryExec.java:93)
10-27 01:07:17.945 19300 19338 E Webmon ##--> : 	at org.apache.hc.client5.http.impl.classic.ExecChainElement.execute(ExecChainElement.java:51)
10-27 01:07:17.945 19300 19338 E Webmon ##--> : 	at org.apache.hc.client5.http.impl.classic.ExecChainElement$1.proceed(ExecChainElement.java:57)
10-27 01:07:17.945 19300 19338 E Webmon ##--> : 	at org.apache.hc.client5.http.impl.classic.ContentCompressionExec.execute(ContentCompressionExec.java:128)
10-27 01:07:17.945 19300 19338 E Webmon ##--> : 	at org.apache.hc.client5.http.impl.classic.ExecChainElement.execute(ExecChainElement.java:51)
10-27 01:07:17.945 19300 19338 E Webmon ##--> : 	at org.apache.hc.client5.http.impl.classic.ExecChainElement$1.proceed(ExecChainElement.java:57)
10-27 01:07:17.945 19300 19338 E Webmon ##--> : 	at org.apache.hc.client5.http.impl.classic.RedirectExec.execute(RedirectExec.java:116)
10-27 01:07:17.945 19300 19338 E Webmon ##--> : 	at org.apache.hc.client5.http.impl.classic.ExecChainElement.execute(ExecChainElement.java:51)
10-27 01:07:17.945 19300 19338 E Webmon ##--> : 	at org.apache.hc.client5.http.impl.classic.InternalHttpClient.doExecute(InternalHttpClient.java:178)
10-27 01:07:17.945 19300 19338 E Webmon ##--> : 	at org.apache.hc.client5.http.impl.classic.CloseableHttpClient.execute(CloseableHttpClient.java:75)
10-27 01:07:17.945 19300 19338 E Webmon ##--> : 	at org.apache.hc.client5.http.impl.classic.CloseableHttpClient.execute(CloseableHttpClient.java:89)
10-27 01:07:17.945 19300 19338 E Webmon ##--> : 	at ooo.akito.webmon.data.repository.WebSiteEntryRepository$getWebsiteStatus$2.invokeSuspend(WebSiteEntryRepository.kt:248)
10-27 01:07:17.945 19300 19338 E Webmon ##--> : 	at kotlin.coroutines.jvm.internal.BaseContinuationImpl.resumeWith(ContinuationImpl.kt:33)
10-27 01:07:17.945 19300 19338 E Webmon ##--> : 	at kotlinx.coroutines.DispatchedTask.run(DispatchedTask.kt:106)
10-27 01:07:17.945 19300 19338 E Webmon ##--> : 	at kotlinx.coroutines.internal.LimitedDispatcher.run(LimitedDispatcher.kt:42)
10-27 01:07:17.945 19300 19338 E Webmon ##--> : 	at kotlinx.coroutines.scheduling.TaskImpl.run(Tasks.kt:95)
10-27 01:07:17.945 19300 19338 E Webmon ##--> : 	at kotlinx.coroutines.scheduling.CoroutineScheduler.runSafely(CoroutineScheduler.kt:570)
10-27 01:07:17.945 19300 19338 E Webmon ##--> : 	at kotlinx.coroutines.scheduling.CoroutineScheduler$Worker.executeTask(CoroutineScheduler.kt:749)
10-27 01:07:17.945 19300 19338 E Webmon ##--> : 	at kotlinx.coroutines.scheduling.CoroutineScheduler$Worker.runWorker(CoroutineScheduler.kt:677)
10-27 01:07:17.945 19300 19338 E Webmon ##--> : 	at kotlinx.coroutines.scheduling.CoroutineScheduler$Worker.run(CoroutineScheduler.kt:664)
10-27 01:07:17.945 19300 19338 E Webmon ##--> : Caused by: java.security.cert.CertificateException: java.security.cert.CertPathValidatorException: Trust anchor for certification path not found.
10-27 01:07:17.945 19300 19338 E Webmon ##--> : 	at com.android.org.conscrypt.TrustManagerImpl.checkTrustedRecursive(TrustManagerImpl.java:656)
10-27 01:07:17.945 19300 19338 E Webmon ##--> : 	at com.android.org.conscrypt.TrustManagerImpl.checkTrustedRecursive(TrustManagerImpl.java:615)
10-27 01:07:17.945 19300 19338 E Webmon ##--> : 	at com.android.org.conscrypt.TrustManagerImpl.checkTrusted(TrustManagerImpl.java:505)
10-27 01:07:17.945 19300 19338 E Webmon ##--> : 	at com.android.org.conscrypt.TrustManagerImpl.checkTrusted(TrustManagerImpl.java:425)
10-27 01:07:17.945 19300 19338 E Webmon ##--> : 	at com.android.org.conscrypt.TrustManagerImpl.getTrustedChainForServer(TrustManagerImpl.java:353)
10-27 01:07:17.945 19300 19338 E Webmon ##--> : 	at android.security.net.config.NetworkSecurityTrustManager.checkServerTrusted(NetworkSecurityTrustManager.java:94)
10-27 01:07:17.945 19300 19338 E Webmon ##--> : 	at android.security.net.config.RootTrustManager.checkServerTrusted(RootTrustManager.java:90)
10-27 01:07:17.945 19300 19338 E Webmon ##--> : 	at com.android.org.conscrypt.ConscryptEngineSocket$2.checkServerTrusted(ConscryptEngineSocket.java:163)
10-27 01:07:17.945 19300 19338 E Webmon ##--> : 	at com.android.org.conscrypt.Platform.checkServerTrusted(Platform.java:260)
10-27 01:07:17.945 19300 19338 E Webmon ##--> : 	at com.android.org.conscrypt.ConscryptEngine.verifyCertificateChain(ConscryptEngine.java:1638)
10-27 01:07:17.945 19300 19338 E Webmon ##--> : 	at com.android.org.conscrypt.NativeCrypto.ENGINE_SSL_read_direct(Native Method)
10-27 01:07:17.945 19300 19338 E Webmon ##--> : 	at com.android.org.conscrypt.NativeSsl.readDirectByteBuffer(NativeSsl.java:569)
10-27 01:07:17.945 19300 19338 E Webmon ##--> : 	at com.android.org.conscrypt.ConscryptEngine.readPlaintextDataDirect(ConscryptEngine.java:1095)
10-27 01:07:17.945 19300 19338 E Webmon ##--> : 	at com.android.org.conscrypt.ConscryptEngine.readPlaintextData(ConscryptEngine.java:1079)
10-27 01:07:17.945 19300 19338 E Webmon ##--> : 	... 39 more
10-27 01:07:17.945 19300 19338 E Webmon ##--> : Caused by: java.security.cert.CertPathValidatorException: Trust anchor for certification path not found.
10-27 01:07:17.945 19300 19338 E Webmon ##--> : 	... 53 more
10-27 01:07:17.952 19300 19300 I Webmon ##--> : Observed Website Entry List Change.
10-27 01:07:17.952 19300 19300 I Webmon ##--> : Set all TODO Items.

Using version 2.9.0 from F-Droid on Android 14 (GrapheneOS).

Metadata

Metadata

Assignees

Labels

improvementImprovement of an existing feature or project component.

Projects

No projects

Relationships

None yet

Development

No branches or pull requests

Issue actions