mirror of
https://github.com/hashicorp/vault.git
synced 2025-11-29 06:31:10 +01:00
Custom extended key usage for PKI. (#4667)
Custom extended key usage for PKI
This commit is contained in:
parent
1d4d302bfa
commit
33ec066278
@ -62,6 +62,7 @@ type creationParameters struct {
|
|||||||
NotAfter time.Time
|
NotAfter time.Time
|
||||||
KeyUsage x509.KeyUsage
|
KeyUsage x509.KeyUsage
|
||||||
ExtKeyUsage certExtKeyUsage
|
ExtKeyUsage certExtKeyUsage
|
||||||
|
ExtKeyUsageOIDs []string
|
||||||
PolicyIdentifiers []string
|
PolicyIdentifiers []string
|
||||||
BasicConstraintsValidForNonCA bool
|
BasicConstraintsValidForNonCA bool
|
||||||
|
|
||||||
@ -918,6 +919,7 @@ func generateCreationBundle(b *backend, data *dataBundle) error {
|
|||||||
NotAfter: notAfter,
|
NotAfter: notAfter,
|
||||||
KeyUsage: x509.KeyUsage(parseKeyUsages(data.role.KeyUsage)),
|
KeyUsage: x509.KeyUsage(parseKeyUsages(data.role.KeyUsage)),
|
||||||
ExtKeyUsage: extUsage,
|
ExtKeyUsage: extUsage,
|
||||||
|
ExtKeyUsageOIDs: data.role.ExtKeyUsageOIDs,
|
||||||
PolicyIdentifiers: data.role.PolicyIdentifiers,
|
PolicyIdentifiers: data.role.PolicyIdentifiers,
|
||||||
BasicConstraintsValidForNonCA: data.role.BasicConstraintsValidForNonCA,
|
BasicConstraintsValidForNonCA: data.role.BasicConstraintsValidForNonCA,
|
||||||
}
|
}
|
||||||
@ -989,6 +991,16 @@ func addPolicyIdentifiers(data *dataBundle, certTemplate *x509.Certificate) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// addExtKeyUsageOids adds custom extended key usage OIDs to certificate
|
||||||
|
func addExtKeyUsageOids(data *dataBundle, certTemplate *x509.Certificate) {
|
||||||
|
for _, oidstr := range data.params.ExtKeyUsageOIDs {
|
||||||
|
oid, err := stringToOid(oidstr)
|
||||||
|
if err == nil {
|
||||||
|
certTemplate.UnknownExtKeyUsage = append(certTemplate.UnknownExtKeyUsage, oid)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// Performs the heavy lifting of creating a certificate. Returns
|
// Performs the heavy lifting of creating a certificate. Returns
|
||||||
// a fully-filled-in ParsedCertBundle.
|
// a fully-filled-in ParsedCertBundle.
|
||||||
func createCertificate(data *dataBundle) (*certutil.ParsedCertBundle, error) {
|
func createCertificate(data *dataBundle) (*certutil.ParsedCertBundle, error) {
|
||||||
@ -1045,6 +1057,8 @@ func createCertificate(data *dataBundle) (*certutil.ParsedCertBundle, error) {
|
|||||||
|
|
||||||
addKeyUsages(data, certTemplate)
|
addKeyUsages(data, certTemplate)
|
||||||
|
|
||||||
|
addExtKeyUsageOids(data, certTemplate)
|
||||||
|
|
||||||
certTemplate.IssuingCertificateURL = data.params.URLs.IssuingCertificates
|
certTemplate.IssuingCertificateURL = data.params.URLs.IssuingCertificates
|
||||||
certTemplate.CRLDistributionPoints = data.params.URLs.CRLDistributionPoints
|
certTemplate.CRLDistributionPoints = data.params.URLs.CRLDistributionPoints
|
||||||
certTemplate.OCSPServer = data.params.URLs.OCSPServers
|
certTemplate.OCSPServer = data.params.URLs.OCSPServers
|
||||||
@ -1254,6 +1268,8 @@ func signCertificate(data *dataBundle) (*certutil.ParsedCertBundle, error) {
|
|||||||
|
|
||||||
addKeyUsages(data, certTemplate)
|
addKeyUsages(data, certTemplate)
|
||||||
|
|
||||||
|
addExtKeyUsageOids(data, certTemplate)
|
||||||
|
|
||||||
var certBytes []byte
|
var certBytes []byte
|
||||||
|
|
||||||
certTemplate.IssuingCertificateURL = data.params.URLs.IssuingCertificates
|
certTemplate.IssuingCertificateURL = data.params.URLs.IssuingCertificates
|
||||||
|
|||||||
@ -166,6 +166,11 @@ To remove all key usages from being set, set
|
|||||||
this value to an empty list.`,
|
this value to an empty list.`,
|
||||||
},
|
},
|
||||||
|
|
||||||
|
"ext_key_usage_oids": &framework.FieldSchema{
|
||||||
|
Type: framework.TypeCommaStringSlice,
|
||||||
|
Description: `A comma-separated string or list of extended key usage oids.`,
|
||||||
|
},
|
||||||
|
|
||||||
"use_csr_common_name": &framework.FieldSchema{
|
"use_csr_common_name": &framework.FieldSchema{
|
||||||
Type: framework.TypeBool,
|
Type: framework.TypeBool,
|
||||||
Default: true,
|
Default: true,
|
||||||
@ -451,6 +456,7 @@ func (b *backend) pathRoleCreate(ctx context.Context, req *logical.Request, data
|
|||||||
UseCSRCommonName: data.Get("use_csr_common_name").(bool),
|
UseCSRCommonName: data.Get("use_csr_common_name").(bool),
|
||||||
UseCSRSANs: data.Get("use_csr_sans").(bool),
|
UseCSRSANs: data.Get("use_csr_sans").(bool),
|
||||||
KeyUsage: data.Get("key_usage").([]string),
|
KeyUsage: data.Get("key_usage").([]string),
|
||||||
|
ExtKeyUsageOIDs: data.Get("ext_key_usage_oids").([]string),
|
||||||
OU: data.Get("ou").([]string),
|
OU: data.Get("ou").([]string),
|
||||||
Organization: data.Get("organization").([]string),
|
Organization: data.Get("organization").([]string),
|
||||||
Country: data.Get("country").([]string),
|
Country: data.Get("country").([]string),
|
||||||
@ -495,6 +501,15 @@ func (b *backend) pathRoleCreate(ctx context.Context, req *logical.Request, data
|
|||||||
return errResp, nil
|
return errResp, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if len(entry.ExtKeyUsageOIDs) > 0 {
|
||||||
|
for _, oidstr := range entry.ExtKeyUsageOIDs {
|
||||||
|
_, err := stringToOid(oidstr)
|
||||||
|
if err != nil {
|
||||||
|
return logical.ErrorResponse(fmt.Sprintf("%q could not be parsed as a valid oid for an extended key usage", oidstr)), nil
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if len(entry.PolicyIdentifiers) > 0 {
|
if len(entry.PolicyIdentifiers) > 0 {
|
||||||
for _, oidstr := range entry.PolicyIdentifiers {
|
for _, oidstr := range entry.PolicyIdentifiers {
|
||||||
_, err := stringToOid(oidstr)
|
_, err := stringToOid(oidstr)
|
||||||
@ -588,6 +603,7 @@ type roleEntry struct {
|
|||||||
RequireCN bool `json:"require_cn" mapstructure:"require_cn"`
|
RequireCN bool `json:"require_cn" mapstructure:"require_cn"`
|
||||||
AllowedOtherSANs []string `json:"allowed_other_sans" mapstructure:"allowed_other_sans"`
|
AllowedOtherSANs []string `json:"allowed_other_sans" mapstructure:"allowed_other_sans"`
|
||||||
PolicyIdentifiers []string `json:"policy_identifiers" mapstructure:"policy_identifiers"`
|
PolicyIdentifiers []string `json:"policy_identifiers" mapstructure:"policy_identifiers"`
|
||||||
|
ExtKeyUsageOIDs []string `json:"ext_key_usage_oids" mapstructure:"ext_key_usage_oids"`
|
||||||
BasicConstraintsValidForNonCA bool `json:"basic_constraints_valid_for_non_ca" mapstructure:"basic_constraints_valid_for_non_ca"`
|
BasicConstraintsValidForNonCA bool `json:"basic_constraints_valid_for_non_ca" mapstructure:"basic_constraints_valid_for_non_ca"`
|
||||||
|
|
||||||
// Used internally for signing intermediates
|
// Used internally for signing intermediates
|
||||||
@ -616,6 +632,7 @@ func (r *roleEntry) ToResponseData() map[string]interface{} {
|
|||||||
"key_type": r.KeyType,
|
"key_type": r.KeyType,
|
||||||
"key_bits": r.KeyBits,
|
"key_bits": r.KeyBits,
|
||||||
"key_usage": r.KeyUsage,
|
"key_usage": r.KeyUsage,
|
||||||
|
"ext_key_usage_oids": r.ExtKeyUsageOIDs,
|
||||||
"ou": r.OU,
|
"ou": r.OU,
|
||||||
"organization": r.Organization,
|
"organization": r.Organization,
|
||||||
"country": r.Country,
|
"country": r.Country,
|
||||||
|
|||||||
@ -55,6 +55,10 @@ export default DS.Model.extend({
|
|||||||
defaultValue: 'DigitalSignature,KeyAgreement,KeyEncipherment',
|
defaultValue: 'DigitalSignature,KeyAgreement,KeyEncipherment',
|
||||||
editType: 'stringArray',
|
editType: 'stringArray',
|
||||||
}),
|
}),
|
||||||
|
extKeyUsageOids: attr({
|
||||||
|
label: 'Custom extended key usage OIDs',
|
||||||
|
editType: 'stringArray',
|
||||||
|
}),
|
||||||
requireCn: attr('boolean', {
|
requireCn: attr('boolean', {
|
||||||
label: 'Require common name',
|
label: 'Require common name',
|
||||||
defaultValue: true,
|
defaultValue: true,
|
||||||
@ -223,7 +227,7 @@ export default DS.Model.extend({
|
|||||||
'allowedDomains',
|
'allowedDomains',
|
||||||
],
|
],
|
||||||
},
|
},
|
||||||
{ 'Extended Key Usage': ['serverFlag', 'clientFlag', 'codeSigningFlag', 'emailProtectionFlag'] },
|
{ 'Extended Key Usage': ['serverFlag', 'clientFlag', 'codeSigningFlag', 'emailProtectionFlag', 'extKeyUsageOids'] },
|
||||||
{
|
{
|
||||||
Advanced: ['generateLease', 'noStore', 'basicConstraintsValidForNonCA', 'policyIdentifiers'],
|
Advanced: ['generateLease', 'noStore', 'basicConstraintsValidForNonCA', 'policyIdentifiers'],
|
||||||
},
|
},
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user