Documentation ¶
Overview ¶
Package authority contains the Certification Authority.
Index ¶
- Constants
- Variables
- func NewRoot(profile string, cfg *Config, provider cryptoprov.Provider, ...) (certPEM, csrPEM, key []byte, err error)
- func OCSPReasonStringToCode(reason string) (reasonCode int, err error)
- type AIAConfig
- type Authority
- func (s *Authority) AddIssuer(issuer *Issuer) error
- func (s *Authority) AddProfile(label string, p *CertProfile)
- func (s *Authority) Crypto() *cryptoprov.Crypto
- func (s *Authority) GetIssuerByKeyHash(alg crypto.Hash, val []byte) (*Issuer, error)
- func (s *Authority) GetIssuerByKeyID(ikid string) (*Issuer, error)
- func (s *Authority) GetIssuerByLabel(label string) (*Issuer, error)
- func (s *Authority) GetIssuerByNameHash(alg crypto.Hash, val []byte) (*Issuer, error)
- func (s *Authority) GetIssuerByProfile(profile string) (*Issuer, error)
- func (s *Authority) Issuers() []*Issuer
- func (s *Authority) Profiles() map[string]*CertProfile
- type CAConfig
- type CAConstraint
- type CertProfile
- func (p *CertProfile) AllowedExtensionsStrings() []string
- func (p *CertProfile) Copy() *CertProfile
- func (p *CertProfile) FindExtension(oid asn1.ObjectIdentifier) *csr.X509Extension
- func (p *CertProfile) IsAllowed(role string) bool
- func (p *CertProfile) IsAllowedExtention(oid csr.OID) bool
- func (p *CertProfile) Usages() (ku x509.KeyUsage, eku []x509.ExtKeyUsage, unk []string)
- func (p *CertProfile) Validate() error
- type Config
- type Issuer
- func (ca *Issuer) AddProfile(label string, p *CertProfile)
- func (ca *Issuer) AiaURL() string
- func (ca *Issuer) Bundle() *certutil.Bundle
- func (i *Issuer) CreateDelegatedOCSPSigner() (*OCSPResponder, error)
- func (ca *Issuer) CrlExpiry() time.Duration
- func (ca *Issuer) CrlRenewal() time.Duration
- func (ca *Issuer) CrlURL() string
- func (ca *Issuer) GenCert(crypto cryptoprov.Provider, req *csr.CertificateRequest, ...) (*x509.Certificate, []byte, error)
- func (ca *Issuer) KeyHash(h crypto.Hash) []byte
- func (ca *Issuer) Label() string
- func (ca *Issuer) NameHash(h crypto.Hash) []byte
- func (ca *Issuer) OcspExpiry() time.Duration
- func (ca *Issuer) OcspURL() string
- func (ca *Issuer) PEM() string
- func (ca *Issuer) Profile(name string) *CertProfile
- func (ca *Issuer) Profiles() map[string]*CertProfile
- func (ca *Issuer) Sign(raReq csr.SignRequest) (*x509.Certificate, []byte, error)
- func (i *Issuer) SignOCSP(req *OCSPSignRequest) ([]byte, error)
- func (ca *Issuer) SignProof(data []byte) (string, error)
- func (ca *Issuer) Signer() crypto.Signer
- func (ca *Issuer) SubjectKID() string
- func (ca *Issuer) VerifyProof(data []byte, proof string) error
- type IssuerConfig
- type OCSPResponder
- type OCSPSignRequest
Constants ¶
const ( // OCSPStatusGood specifies name for good status OCSPStatusGood = "good" // OCSPStatusRevoked specifies name for revoked status OCSPStatusRevoked = "revoked" // OCSPStatusUnknown specifies name for unknown status OCSPStatusUnknown = "unknown" )
Variables ¶
var ( // DefaultCRLRenewal specifies default duration for CRL renewal DefaultCRLRenewal = 12 * time.Hour // 12 hours // DefaultCRLExpiry specifies default duration for CRL expiry DefaultCRLExpiry = 2 * 24 * time.Hour // 2 days // DefaultOCSPExpiry specifies default for OCSP expiry DefaultOCSPExpiry = 8 * time.Hour // 8 hours )
var ( // CTPoisonOID is the object ID of the critical poison extension for precertificates // https://tools.ietf.org/html/rfc6962#page-9 CTPoisonOID = asn1.ObjectIdentifier{1, 3, 6, 1, 4, 1, 11129, 2, 4, 3} // SCTListOID is the object ID for the Signed Certificate Timestamp certificate extension // https://tools.ietf.org/html/rfc6962#page-14 SCTListOID = asn1.ObjectIdentifier{1, 3, 6, 1, 4, 1, 11129, 2, 4, 2} )
var OCSPStatusCode = map[string]int{ OCSPStatusGood: ocsp.Good, OCSPStatusRevoked: ocsp.Revoked, OCSPStatusUnknown: ocsp.Unknown, }
OCSPStatusCode is a map between string statuses sent by cli/api to ocsp int statuses
Functions ¶
func NewRoot ¶
func NewRoot(profile string, cfg *Config, provider cryptoprov.Provider, req *csr.CertificateRequest) (certPEM, csrPEM, key []byte, err error)
NewRoot creates a new root certificate from the certificate request.
func OCSPReasonStringToCode ¶
OCSPReasonStringToCode tries to convert a reason string to an integer code
Types ¶
type AIAConfig ¶
type AIAConfig struct { // AiaURL specifies a template for AIA URL. // The ${ISSUER_ID} variable will be replaced with a Subject Key Identifier of the issuer. AiaURL string `json:"issuer_url" yaml:"issuer_url"` // OcspURL specifies a template for OCSP URL. // The ${ISSUER_ID} variable will be replaced with a Subject Key Identifier of the issuer. OcspURL string `json:"ocsp_url" yaml:"ocsp_url"` // DefaultOcspURL specifies a template for CRL URL. // The ${ISSUER_ID} variable will be replaced with a Subject Key Identifier of the issuer. CrlURL string `json:"crl_url" yaml:"crl_url"` // CRLExpiry specifies value in 72h format for duration of CRL next update time CRLExpiry time.Duration `json:"crl_expiry,omitempty" yaml:"crl_expiry,omitempty"` // OCSPExpiry specifies value in 8h format for duration of OCSP next update time OCSPExpiry time.Duration `json:"ocsp_expiry,omitempty" yaml:"ocsp_expiry,omitempty"` // CRLRenewal specifies value in 8h format for duration of CRL renewal before next update time CRLRenewal time.Duration `json:"crl_renewal,omitempty" yaml:"crl_renewal,omitempty"` // DelegatedOCSPProfile specifies to use delegated OCSP responder DelegatedOCSPProfile string `json:"delegated_ocsp_profile,omitempty" yaml:"delegated_ocsp_profile,omitempty"` }
AIAConfig contains AIA configuration info
func (*AIAConfig) GetCRLExpiry ¶
GetCRLExpiry specifies value in 72h format for duration of CRL next update time
func (*AIAConfig) GetCRLRenewal ¶
GetCRLRenewal specifies value in 8h format for duration of CRL renewal before next update time
func (*AIAConfig) GetOCSPExpiry ¶
GetOCSPExpiry specifies value in 8h format for duration of OCSP next update time
type Authority ¶
type Authority struct { RootBundle []byte CaBundle []byte // contains filtered or unexported fields }
Authority defines the CA
func NewAuthority ¶
func NewAuthority(cfg *Config, crypto *cryptoprov.Crypto) (*Authority, error)
NewAuthority returns new instance of Authority
func (*Authority) AddProfile ¶
func (s *Authority) AddProfile(label string, p *CertProfile)
AddProfile adds CertProfile
func (*Authority) Crypto ¶
func (s *Authority) Crypto() *cryptoprov.Crypto
Crypto returns the provider
func (*Authority) GetIssuerByKeyHash ¶
GetIssuerByKeyHash returns matching Issuer by key hash
func (*Authority) GetIssuerByKeyID ¶
GetIssuerByKeyID by IKID
func (*Authority) GetIssuerByLabel ¶
GetIssuerByLabel by label
func (*Authority) GetIssuerByNameHash ¶
GetIssuerByNameHash returns matching Issuer by name hash
func (*Authority) GetIssuerByProfile ¶
GetIssuerByProfile by profile
func (*Authority) Profiles ¶
func (s *Authority) Profiles() map[string]*CertProfile
Profiles returns profiles map
type CAConfig ¶
type CAConfig struct { // Issuers specifies the list of issuing authorities. Issuers []IssuerConfig `json:"issuers,omitempty" yaml:"issuers,omitempty"` // RootsBundleFiles specifies locations of the Root bundle files RootsBundleFiles []string `json:"root_bundles,omitempty" yaml:"root_bundles,omitempty"` // CABundleFiles specifies locations of the CA bundle files CABundleFiles []string `json:"ca_bundles,omitempty" yaml:"ca_bundles,omitempty"` }
CAConfig contains configuration info for CA
type CAConstraint ¶
type CAConstraint struct { IsCA bool `json:"is_ca" yaml:"is_ca"` MaxPathLen int `json:"max_path_len" yaml:"max_path_len"` }
CAConstraint specifies various CA constraints on the signed certificate. CAConstraint would verify against (and override) the CA extensions in the given CSR.
type CertProfile ¶
type CertProfile struct { IssuerLabel string `json:"issuer_label" yaml:"issuer_label"` Description string `json:"description" yaml:"description"` // Usage provides a list key usages Usage []string `json:"usages" yaml:"usages"` CAConstraint CAConstraint `json:"ca_constraint" yaml:"ca_constraint"` OCSPNoCheck bool `json:"ocsp_no_check" yaml:"ocsp_no_check"` Expiry csr.Duration `json:"expiry" yaml:"expiry"` Backdate csr.Duration `json:"backdate" yaml:"backdate"` Extensions []csr.X509Extension `json:"extensions" yaml:"extensions"` AllowedExtensions []csr.OID `json:"allowed_extensions" yaml:"allowed_extensions"` // AllowedNames specifies a RegExp to check for allowed names. // If not provided, then all values are allowed AllowedNames string `json:"allowed_names" yaml:"allowed_names"` // AllowedDNS specifies a RegExp to check for allowed DNS. // If not provided, then all values are allowed AllowedDNS string `json:"allowed_dns" yaml:"allowed_dns"` // AllowedEmail specifies a RegExp to check for allowed email. // If not provided, then all values are allowed AllowedEmail string `json:"allowed_email" yaml:"allowed_email"` // AllowedURI specifies a RegExp to check for allowed URI. // If not provided, then all values are allowed AllowedURI string `json:"allowed_uri" yaml:"allowed_uri"` // AllowedFields provides booleans for fields in the CSR. // If a AllowedFields is not present in a CertProfile, // all of these fields may be copied from the CSR into the signed certificate. // If a AllowedFields *is* present in a CertProfile, // only those fields with a `true` value in the AllowedFields may // be copied from the CSR to the signed certificate. // Note that some of these fields, like Subject, can be provided or // partially provided through the API. // Since API clients are expected to be trusted, but CSRs are not, fields // provided through the API are not subject to validation through this // mechanism. AllowedCSRFields *csr.AllowedFields `json:"allowed_fields" yaml:"allowed_fields"` Policies []csr.CertificatePolicy `json:"policies" yaml:"policies"` // PoliciesCritical specifies to mark Policies as Critical extension PoliciesCritical bool `json:"policies_critical" yaml:"policies_critical"` AllowedRoles []string `json:"allowed_roles" yaml:"allowed_roles"` DeniedRoles []string `json:"denied_roles" yaml:"denied_roles"` AllowedNamesRegex *regexp.Regexp `json:"-" yaml:"-"` AllowedDNSRegex *regexp.Regexp `json:"-" yaml:"-"` AllowedEmailRegex *regexp.Regexp `json:"-" yaml:"-"` AllowedURIRegex *regexp.Regexp `json:"-" yaml:"-"` }
CertProfile provides certificate profile
func (*CertProfile) AllowedExtensionsStrings ¶
func (p *CertProfile) AllowedExtensionsStrings() []string
AllowedExtensionsStrings returns slice of strings
func (*CertProfile) FindExtension ¶ added in v0.2.0
func (p *CertProfile) FindExtension(oid asn1.ObjectIdentifier) *csr.X509Extension
FindExtension returns extension, or nil
func (*CertProfile) IsAllowed ¶
func (p *CertProfile) IsAllowed(role string) bool
IsAllowed returns true, if a role is allowed to request this profile
func (*CertProfile) IsAllowedExtention ¶
func (p *CertProfile) IsAllowedExtention(oid csr.OID) bool
IsAllowedExtention returns true of the extension is allowed
func (*CertProfile) Usages ¶
func (p *CertProfile) Usages() (ku x509.KeyUsage, eku []x509.ExtKeyUsage, unk []string)
Usages parses the list of key uses in the profile, translating them to a list of X.509 key usages and extended key usages. The unknown uses are collected into a slice that is also returned.
func (*CertProfile) Validate ¶
func (p *CertProfile) Validate() error
Validate returns an error if the profile is invalid
type Config ¶
type Config struct { Authority *CAConfig `json:"authority,omitempty" yaml:"authority,omitempty"` Profiles map[string]*CertProfile `json:"profiles" yaml:"profiles"` }
Config provides configuration for Certification Authority
func LoadConfig ¶
LoadConfig loads the configuration file stored at the path and returns the configuration.
func (*Config) DefaultCertProfile ¶
func (c *Config) DefaultCertProfile() *CertProfile
DefaultCertProfile returns default CertProfile
type Issuer ¶
type Issuer struct {
// contains filtered or unexported fields
}
Issuer of certificates
func CreateIssuer ¶
func CreateIssuer(cfg *IssuerConfig, certBytes, intCAbytes, rootBytes []byte, signer crypto.Signer) (*Issuer, error)
CreateIssuer returns Issuer created directly from crypto.Signer, this method is mostly used for testing
func NewIssuer ¶
func NewIssuer(cfg *IssuerConfig, prov *cryptoprov.Crypto) (*Issuer, error)
NewIssuer creates Issuer from provided configuration
func NewIssuerWithBundles ¶
func NewIssuerWithBundles(cfg *IssuerConfig, prov *cryptoprov.Crypto, caPem, rootPem []byte) (*Issuer, error)
NewIssuerWithBundles creates Issuer from provided configuration
func (*Issuer) AddProfile ¶
func (ca *Issuer) AddProfile(label string, p *CertProfile)
AddProfile adds CertProfile
func (*Issuer) CreateDelegatedOCSPSigner ¶ added in v0.3.0
func (i *Issuer) CreateDelegatedOCSPSigner() (*OCSPResponder, error)
CreateDelegatedOCSPSigner create OCSP signing certificate, if needed, or returns an existing one. if the delegation is not allowed, the CA Signer is returned
func (*Issuer) CrlRenewal ¶
CrlRenewal is duration for CRL renewal interval
func (*Issuer) GenCert ¶ added in v0.3.0
func (ca *Issuer) GenCert(crypto cryptoprov.Provider, req *csr.CertificateRequest, profile, certFile, keyFile string) (*x509.Certificate, []byte, error)
GenCert creates certificate and stores key and certs to specified location
func (*Issuer) OcspExpiry ¶
OcspExpiry is duration for OCSP next update interval
func (*Issuer) Profile ¶
func (ca *Issuer) Profile(name string) *CertProfile
Profile returns CertProfile
func (*Issuer) Profiles ¶
func (ca *Issuer) Profiles() map[string]*CertProfile
Profiles returns CertProfiles
func (*Issuer) Sign ¶
func (ca *Issuer) Sign(raReq csr.SignRequest) (*x509.Certificate, []byte, error)
Sign signs a new certificate based on the PEM-encoded certificate request with the specified profile.
func (*Issuer) SignOCSP ¶
func (i *Issuer) SignOCSP(req *OCSPSignRequest) ([]byte, error)
SignOCSP return an OCSP response.
type IssuerConfig ¶
type IssuerConfig struct { // Disabled specifies if the certificate disabled to use Disabled *bool `json:"disabled,omitempty" yaml:"disabled,omitempty"` // Label specifies Issuer's label Label string `json:"label,omitempty" yaml:"label,omitempty"` // Type specifies type: tls|codesign|timestamp|ocsp|spiffe|trusty Type string // CertFile specifies location of the cert CertFile string `json:"cert,omitempty" yaml:"cert,omitempty"` // KeyFile specifies location of the key KeyFile string `json:"key,omitempty" yaml:"key,omitempty"` // CABundleFile specifies location of the CA bundle file CABundleFile string `json:"ca_bundle,omitempty" yaml:"ca_bundle,omitempty"` // RootBundleFile specifies location of the Root CA file RootBundleFile string `json:"root_bundle,omitempty" yaml:"root_bundle,omitempty"` // OmitDisabledExtensions specifies to not fail a request, // but omit not allowed extentions OmitDisabledExtensions bool `json:"omit_disabled_extensions,omitempty" yaml:"omit_disabled_extensions,omitempty"` // AIA specifies AIA configuration AIA *AIAConfig `json:"aia,omitempty" yaml:"aia,omitempty"` // AllowedProfiles if populated, allows only specified profiles AllowedProfiles []string `json:"allowed_profiles" yaml:"allowed_profiles"` // Profiles are populated after loading Profiles map[string]*CertProfile `json:"-" yaml:"-"` }
IssuerConfig contains configuration info for the issuing certificate
func (*IssuerConfig) GetDisabled ¶
func (c *IssuerConfig) GetDisabled() bool
GetDisabled specifies if the certificate disabled to use
type OCSPResponder ¶ added in v0.3.0
type OCSPResponder struct { Signer crypto.Signer Cert *x509.Certificate }
OCSPResponder provides responder
type OCSPSignRequest ¶
type OCSPSignRequest struct { SerialNumber *big.Int Status string Reason int RevokedAt time.Time Extensions []pkix.Extension // IssuerHash is the hashing function used to hash the issuer subject and public key // in the OCSP response. Valid values are crypto.SHA1, crypto.SHA256, crypto.SHA384, // and crypto.SHA512. If zero, the default is crypto.SHA1. IssuerHash crypto.Hash // If provided ThisUpdate will override the default usage of time.Now().Truncate(time.Hour) ThisUpdate *time.Time // If provided NextUpdate will override the default usage of ThisUpdate.Add(signerInterval) NextUpdate *time.Time }
OCSPSignRequest represents the desired contents of a specific OCSP response.