Skip to content

Conversation

@HarshPatel5940
Copy link

Summary

I've implemented the system trust pool module which uses x509.SystemCertPool() and works as expected.

However, the combined module has a fundamental limitation: Go's x509.CertPool doesn't expose its certificates, making it impossible to merge multiple pools.

so should we modify the CA interface to add a method like Certificates() []*x509.Certificate so sources can expose their certificates for merging? not sure how to proceed here... Would be happy to learn.

Assistance Disclosure

I wrote the code, but Claude generated the tests.

Comment on lines 751 to 774
// LIMITATION: x509.CertPool doesn't expose its certificates, making it impossible
// to merge multiple pools. Return an error if multiple sources are configured.
if len(ccp.sources) > 1 {
return fmt.Errorf("combined CA pool currently supports only a single source due to x509.CertPool API limitations (got %d sources); to use multiple certificate sources, consider using a single 'file' source with multiple pem_file entries, or contribute a fix to expose certificate data from the CA interface", len(ccp.sources))
}

// At this point we have exactly one source
ccp.pool = ccp.sources[0].CertPool()

return nil
}

// Syntax:
//
// trust_pool combined {
// source <module_name> {
// <module_config>
// }
// }
//
// LIMITATION: Currently only a single source is supported due to x509.CertPool
// API limitations. Specifying multiple sources will result in a provisioning error.
// To combine multiple certificate files, use a single 'file' source with multiple
// pem_file entries instead.
Copy link
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I have intentionally added limitation comments cause i wasnt aware how to proceed here.

@HarshPatel5940
Copy link
Author

"combined merges multiple roots sources" is not satisfied as per issue #7391 and i am erroring out as you see in above comment.

so should we modify the CA interface to add a method like Certificates() []*x509.Certificate so sources can expose their certificates for merging? not sure how to proceed here... Would be happy to learn.

This approach which i think is a breaking change so i wanted to consult with my planned implementation

@FreyreCorona
Copy link
Contributor

FreyreCorona commented Jan 2, 2026

Happy new year and i reviewed your code and i have two types of solutions
Ther first is like you say , changin the actual contract of CA interface ,

type CA interface {
    AppendTo(pool *x509.CertPool) error
}

This is breaking change because not all CA pools can expose certificates.

The second way is creating a secondary interface (non breaking change)

type CertificateProvider interface {
    Certificates() []*x509.Certificate
}

The combined module would then check whether each source implements this interface and merge certificates only from those that do.

@HarshPatel5940
Copy link
Author

Hello @FreyreCorona , thank you for the suggestions! will work on a non-breaking solution.

lastly, sorry for the delayed response. forgot about this pr due to work

@HarshPatel5940 HarshPatel5940 marked this pull request as ready for review January 20, 2026 04:50
@FreyreCorona
Copy link
Contributor

FreyreCorona commented Jan 20, 2026

Nice work on the implementation, let's wait for the review. No worries, we're all busy, and I've been pretty quiet around here these past few days too.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants