On Mon, 27 Jan 2025 22:43:32 GMT, Tim Jacomb <d...@openjdk.org> wrote:

>> ## The change
>> 
>> Without this change intermediate certificates that don't have explicit trust 
>> settings are ignored not added to the truststore.
>> 
>> 
>> 
>> ## Reproducer
>> 
>> See https://github.com/timja/openjdk-intermediate-ca-reproducer
>> 
>> Without this change the reproducer fails, and with this change it succeeds.
>> 
>> ## Example failing architecture
>> 
>> Root CA -> Intermediate 1 -> Intermediate 2 -> Leaf
>> 
>> Where:
>> * All certs are in admin domain kSecTrustSettingsDomainAdmin
>> * Root CA is marked as always trust
>> * Intermediate 1 and 2 are Unspecified
>> 
>> Previously Root CA would be found but intermediate 1 and 2 would be skipped 
>> when verifying trust settings.
>> 
>> ## Background reading
>> 
>> ### Rust
>> see also Rust Lib that is used throughout Rust ecosystem for this: 
>> https://github.com/rustls/rustls-native-certs/blob/efe7b1d77bf6080851486535664d1dc7ef0dea68/src/macos.rs#L39-L58
>> 
>> e.g. in Deno `https://github.com/denoland/deno/pull/11491` where I've 
>> verified it is correctly implemented and works in my setup
>> 
>> ## Python
>> 
>> I also looked at the Python implementation for inspiration as well (which 
>> also works on my system): 
>> https://github.com/sethmlarson/truststore/blob/main/src/truststore/_macos.py
>
> Tim Jacomb has updated the pull request incrementally with one additional 
> commit since the last revision:
> 
>   Make test output easier to read

I am dubious that this is the right thing to do. There is a distinct difference 
between a certificate that is trusted and one that requires additional 
validation to determine if it is trusted. Blindly trusting self-signed 
certificates is very dangeorous, and unless I am mistaken, this seems to be 
what this code may do. I do not think lumping both of these certificates into 
"trusted" certificates is the right thing to do.

It may mean that we need to enhance the `KeyStore` API to be able to store 
arbitrary certificates. Or you could consider storing these additional 
certificates in a `CertStore`.

I am also not sure the use case is common. Typically a web server will send its 
entire chain, and not just the server certificate.

Certainly open to hearing alternate opinions if I have overlooked something.

-------------

PR Comment: https://git.openjdk.org/jdk/pull/22911#issuecomment-2769754872

Reply via email to