Allow x509 Service CA implementation to be injected through ca and authority options

pull/1684/head
Venky Gopal 5 months ago
parent 3a840bf605
commit fbc1e895c2

@ -167,6 +167,15 @@ func WithKeyManager(k kms.KeyManager) Option {
} }
} }
// WithX509CAService allows the consumer to provide an externally implemented
// API implementation of apiv1.CertificateAuthorityService
func WithX509CAService(svc casapi.CertificateAuthorityService) Option {
return func(a *Authority) error {
a.x509CAService = svc
return nil
}
}
// WithX509Signer defines the signer used to sign X509 certificates. // WithX509Signer defines the signer used to sign X509 certificates.
func WithX509Signer(crt *x509.Certificate, s crypto.Signer) Option { func WithX509Signer(crt *x509.Certificate, s crypto.Signer) Option {
return WithX509SignerChain([]*x509.Certificate{crt}, s) return WithX509SignerChain([]*x509.Certificate{crt}, s)

@ -24,6 +24,7 @@ import (
"github.com/smallstep/certificates/api" "github.com/smallstep/certificates/api"
"github.com/smallstep/certificates/authority" "github.com/smallstep/certificates/authority"
"github.com/smallstep/certificates/authority/admin" "github.com/smallstep/certificates/authority/admin"
"github.com/smallstep/certificates/cas/apiv1"
adminAPI "github.com/smallstep/certificates/authority/admin/api" adminAPI "github.com/smallstep/certificates/authority/admin/api"
"github.com/smallstep/certificates/authority/config" "github.com/smallstep/certificates/authority/config"
"github.com/smallstep/certificates/db" "github.com/smallstep/certificates/db"
@ -46,6 +47,7 @@ type options struct {
sshHostPassword []byte sshHostPassword []byte
sshUserPassword []byte sshUserPassword []byte
database db.AuthDB database db.AuthDB
x509CAService apiv1.CertificateAuthorityService
} }
func (o *options) apply(opts []Option) { func (o *options) apply(opts []Option) {
@ -65,6 +67,13 @@ func WithConfigFile(name string) Option {
} }
} }
// WithX509CAService provides the x509CAService to be used for signing x509 requests
func WithX509CAService(svc apiv1.CertificateAuthorityService) Option {
return func(o *options) {
o.x509CAService = svc
}
}
// WithPassword sets the given password as the configured password in the CA // WithPassword sets the given password as the configured password in the CA
// options. // options.
func WithPassword(password []byte) Option { func WithPassword(password []byte) Option {
@ -163,6 +172,10 @@ func (ca *CA) Init(cfg *config.Config) (*CA, error) {
opts = append(opts, authority.WithQuietInit()) opts = append(opts, authority.WithQuietInit())
} }
if ca.opts.x509CAService != nil {
opts = append(opts, authority.WithX509CAService(ca.opts.x509CAService))
}
webhookTransport := http.DefaultTransport.(*http.Transport).Clone() webhookTransport := http.DefaultTransport.(*http.Transport).Clone()
opts = append(opts, authority.WithWebhookClient(&http.Client{Transport: webhookTransport})) opts = append(opts, authority.WithWebhookClient(&http.Client{Transport: webhookTransport}))

@ -53,6 +53,8 @@ const (
StepCAS = "stepcas" StepCAS = "stepcas"
// VaultCAS is a CertificateAuthorityService using Hasicorp Vault PKI. // VaultCAS is a CertificateAuthorityService using Hasicorp Vault PKI.
VaultCAS = "vaultcas" VaultCAS = "vaultcas"
// ExternalCAS is a CertificateAuthorityService using an external injected CA implementation
ExternalCAS = "externalcas"
) )
// String returns a string from the type. It will always return the lower case // String returns a string from the type. It will always return the lower case

@ -13,6 +13,7 @@ func TestType_String(t *testing.T) {
{"default", "", "softcas"}, {"default", "", "softcas"},
{"SoftCAS", SoftCAS, "softcas"}, {"SoftCAS", SoftCAS, "softcas"},
{"CloudCAS", CloudCAS, "cloudcas"}, {"CloudCAS", CloudCAS, "cloudcas"},
{"ExternalCAS", ExternalCAS, "externalcas"},
{"UnknownCAS", "UnknownCAS", "unknowncas"}, {"UnknownCAS", "UnknownCAS", "unknowncas"},
} }
for _, tt := range tests { for _, tt := range tests {

Loading…
Cancel
Save