mirror of
https://github.com/optim-enterprises-bv/vault.git
synced 2025-11-01 19:17:58 +00:00
Warn on empty Subject field for issuers (#15494)
* Warn on empty Subject field for issuers
When generating a root or signing an intermediate certificate, it is
possible to have Vault generate a certificate with an empty Subject.
These don't validate in most TLS implementations well, so add a warning.
Note that non-Common Name fields could be present to make a non-empty
subject, so simply requiring a CommonName isn't strictly the best.
For example:
$ vault write pki/root/generate/exported common_name=""
WARNING! The following warnings were returned from Vault:
* This issuer certificate was generated without a Subject; this makes
it likely that issuing leaf certs with this certificate will cause TLS
validation libraries to reject this certificate.
....
Signed-off-by: Alexander Scheel <alex.scheel@hashicorp.com>
* Add changelog
Signed-off-by: Alexander Scheel <alex.scheel@hashicorp.com>
This commit is contained in:
@@ -165,6 +165,19 @@ func (b *backend) pathCAGenerateRoot(ctx context.Context, req *logical.Request,
|
||||
},
|
||||
}
|
||||
|
||||
if len(parsedBundle.Certificate.RawSubject) <= 2 {
|
||||
// Strictly a subject is a SEQUENCE of SETs of SEQUENCES.
|
||||
//
|
||||
// The outer SEQUENCE is preserved, having byte value 30 00.
|
||||
//
|
||||
// Because of the tag and the length encoding each taking up
|
||||
// at least one byte, it is impossible to have a non-empty
|
||||
// subject in two or fewer bytes. We're also not here to validate
|
||||
// our certificate's ASN.1 content, so let's just assume it holds
|
||||
// and move on.
|
||||
resp.AddWarning("This issuer certificate was generated without a Subject; this makes it likely that issuing leaf certs with this certificate will cause TLS validation libraries to reject this certificate.")
|
||||
}
|
||||
|
||||
switch format {
|
||||
case "pem":
|
||||
resp.Data["certificate"] = cb.Certificate
|
||||
@@ -342,6 +355,19 @@ func (b *backend) pathIssuerSignIntermediate(ctx context.Context, req *logical.R
|
||||
resp.AddWarning("The expiration time for the signed certificate is after the CA's expiration time. If the new certificate is not treated as a root, validation paths with the certificate past the issuing CA's expiration time will fail.")
|
||||
}
|
||||
|
||||
if len(parsedBundle.Certificate.RawSubject) <= 2 {
|
||||
// Strictly a subject is a SEQUENCE of SETs of SEQUENCES.
|
||||
//
|
||||
// The outer SEQUENCE is preserved, having byte value 30 00.
|
||||
//
|
||||
// Because of the tag and the length encoding each taking up
|
||||
// at least one byte, it is impossible to have a non-empty
|
||||
// subject in two or fewer bytes. We're also not here to validate
|
||||
// our certificate's ASN.1 content, so let's just assume it holds
|
||||
// and move on.
|
||||
resp.AddWarning("This issuer certificate was generated without a Subject; this makes it likely that issuing leaf certs with this certificate will cause TLS validation libraries to reject this certificate.")
|
||||
}
|
||||
|
||||
switch format {
|
||||
case "pem":
|
||||
resp.Data["certificate"] = cb.Certificate
|
||||
|
||||
Reference in New Issue
Block a user