Description
The functionality of new_with_extra_roots
is primarily useful for Linux/WASM/BSD platforms that don't have a consistent source of trusted CA root/anchors available. However, many private/internal applications often use their own private CAs instead of publicly issued ones. This seems like a use case we could support without much burden, even if those users might be better off making their own webpki
-based verifier instead.
Implementation details
It's worth noting that the Apple and Windows code for this already exists in a near-drop in form. Android would require more work to make a TrustManager
that combined certificates.
macOS/iOS
We can call SecTrustSetAnchorCertificates
to add additional roots to the evaluation, and then call SecTrustSetAnchorCertificatesOnly
with false
to trust both the custom roots and the default OS-provided ones.
Windows
We can create a custom CERT_CHAIN_ENGINE_CONFIG
and set cAdditionalStore
to a custom, in-memory certificate store. This engine and store are then included in our call to CertGetCertificateChain
.
Android
I believe this can be done by using a PKIXParameters
. I think the best idea is to create a custom TrustManager
class that considers the system Keystore
's trustmanager and then a custom Keystore
containing the user-provided roots. I'm not yet sure about the exact implementation strategy though since the Android X509 and PKIX APIs are a handful. This and this blog may be helpful references.