mirror of
https://github.com/optim-enterprises-bv/vault.git
synced 2025-11-03 03:58:01 +00:00
Change storage of entries from colons to hyphens and add a
lookup/migration path Still TODO: tests on migration path Fixes #2552
This commit is contained in:
@@ -185,32 +185,68 @@ func fetchCAInfo(req *logical.Request) (*caInfoBundle, error) {
|
|||||||
// separate pathing for CA, CRL, and revoked certificates.
|
// separate pathing for CA, CRL, and revoked certificates.
|
||||||
func fetchCertBySerial(req *logical.Request, prefix, serial string) (*logical.StorageEntry, error) {
|
func fetchCertBySerial(req *logical.Request, prefix, serial string) (*logical.StorageEntry, error) {
|
||||||
var path string
|
var path string
|
||||||
|
var err error
|
||||||
|
var certEntry *logical.StorageEntry
|
||||||
|
|
||||||
switch {
|
switch {
|
||||||
// Revoked goes first as otherwise ca/crl get hardcoded paths which fail if
|
// Revoked goes first as otherwise ca/crl get hardcoded paths which fail if
|
||||||
// we actually want revocation info
|
// we actually want revocation info
|
||||||
case strings.HasPrefix(prefix, "revoked/"):
|
case strings.HasPrefix(prefix, "revoked/"):
|
||||||
path = "revoked/" + strings.Replace(strings.ToLower(serial), "-", ":", -1)
|
path = "revoked/" + strings.Replace(strings.ToLower(serial), ":", "-", -1)
|
||||||
case serial == "ca":
|
case serial == "ca":
|
||||||
path = "ca"
|
path = "ca"
|
||||||
case serial == "crl":
|
case serial == "crl":
|
||||||
path = "crl"
|
path = "crl"
|
||||||
|
default:
|
||||||
|
path = "certs/" + strings.Replace(strings.ToLower(serial), ":", "-", -1)
|
||||||
|
}
|
||||||
|
|
||||||
|
certEntry, err = req.Storage.Get(path)
|
||||||
|
if err != nil {
|
||||||
|
return nil, errutil.InternalError{Err: fmt.Sprintf("error fetching certificate %s: %s", serial, err)}
|
||||||
|
}
|
||||||
|
if certEntry != nil {
|
||||||
|
if certEntry.Value == nil || len(certEntry.Value) == 0 {
|
||||||
|
return nil, errutil.InternalError{Err: fmt.Sprintf("returned certificate bytes for serial %s were empty", serial)}
|
||||||
|
}
|
||||||
|
return certEntry, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// No point checking these, no old/new style colons/hyphens
|
||||||
|
if path == "ca" || path == "crl" {
|
||||||
|
return nil, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// Save the desired path
|
||||||
|
desiredPath := path
|
||||||
|
|
||||||
|
// If we get here we need to check for old-style paths using colons
|
||||||
|
switch {
|
||||||
|
case strings.HasPrefix(prefix, "revoked/"):
|
||||||
|
path = "revoked/" + strings.Replace(strings.ToLower(serial), "-", ":", -1)
|
||||||
default:
|
default:
|
||||||
path = "certs/" + strings.Replace(strings.ToLower(serial), "-", ":", -1)
|
path = "certs/" + strings.Replace(strings.ToLower(serial), "-", ":", -1)
|
||||||
}
|
}
|
||||||
|
|
||||||
certEntry, err := req.Storage.Get(path)
|
certEntry, err = req.Storage.Get(path)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, errutil.InternalError{Err: fmt.Sprintf("error fetching certificate %s: %s", serial, err)}
|
return nil, errutil.InternalError{Err: fmt.Sprintf("error fetching certificate %s: %s", serial, err)}
|
||||||
}
|
}
|
||||||
if certEntry == nil {
|
if certEntry == nil {
|
||||||
return nil, nil
|
return nil, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
if certEntry.Value == nil || len(certEntry.Value) == 0 {
|
if certEntry.Value == nil || len(certEntry.Value) == 0 {
|
||||||
return nil, errutil.InternalError{Err: fmt.Sprintf("returned certificate bytes for serial %s were empty", serial)}
|
return nil, errutil.InternalError{Err: fmt.Sprintf("returned certificate bytes for serial %s were empty", serial)}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
certEntry.Key = desiredPath
|
||||||
|
if err = req.Storage.Put(certEntry); err != nil {
|
||||||
|
return nil, errutil.InternalError{Err: fmt.Sprintf("error saving certificate with serial %s to new location", serial)}
|
||||||
|
}
|
||||||
|
if err = req.Storage.Delete(path); err != nil {
|
||||||
|
return nil, errutil.InternalError{Err: fmt.Sprintf("error deleting certificate with serial %s from old location", serial)}
|
||||||
|
}
|
||||||
|
|
||||||
return certEntry, nil
|
return certEntry, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -5,6 +5,7 @@ import (
|
|||||||
"crypto/x509"
|
"crypto/x509"
|
||||||
"crypto/x509/pkix"
|
"crypto/x509/pkix"
|
||||||
"fmt"
|
"fmt"
|
||||||
|
"strings"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
"github.com/hashicorp/vault/helper/errutil"
|
"github.com/hashicorp/vault/helper/errutil"
|
||||||
@@ -86,7 +87,7 @@ func revokeCert(b *backend, req *logical.Request, serial string, fromLease bool)
|
|||||||
revInfo.RevocationTime = currTime.Unix()
|
revInfo.RevocationTime = currTime.Unix()
|
||||||
revInfo.RevocationTimeUTC = currTime.UTC()
|
revInfo.RevocationTimeUTC = currTime.UTC()
|
||||||
|
|
||||||
revEntry, err = logical.StorageEntryJSON("revoked/"+serial, revInfo)
|
revEntry, err = logical.StorageEntryJSON("revoked/"+strings.ToLower(strings.Replace(serial, ":", "-", -1)), revInfo)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, fmt.Errorf("Error creating revocation entry")
|
return nil, fmt.Errorf("Error creating revocation entry")
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -3,6 +3,7 @@ package pki
|
|||||||
import (
|
import (
|
||||||
"encoding/base64"
|
"encoding/base64"
|
||||||
"fmt"
|
"fmt"
|
||||||
|
"strings"
|
||||||
|
|
||||||
"github.com/hashicorp/vault/helper/certutil"
|
"github.com/hashicorp/vault/helper/certutil"
|
||||||
"github.com/hashicorp/vault/helper/errutil"
|
"github.com/hashicorp/vault/helper/errutil"
|
||||||
@@ -196,7 +197,7 @@ func (b *backend) pathSetSignedIntermediate(
|
|||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
|
||||||
entry.Key = "certs/" + cb.SerialNumber
|
entry.Key = "certs/" + strings.ToLower(strings.Replace(cb.SerialNumber, ":", "-", -1))
|
||||||
entry.Value = inputBundle.CertificateBytes
|
entry.Value = inputBundle.CertificateBytes
|
||||||
err = req.Storage.Put(entry)
|
err = req.Storage.Put(entry)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
|||||||
@@ -3,6 +3,7 @@ package pki
|
|||||||
import (
|
import (
|
||||||
"encoding/base64"
|
"encoding/base64"
|
||||||
"fmt"
|
"fmt"
|
||||||
|
"strings"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
"github.com/hashicorp/vault/helper/certutil"
|
"github.com/hashicorp/vault/helper/certutil"
|
||||||
@@ -242,11 +243,11 @@ func (b *backend) pathIssueSignCert(
|
|||||||
|
|
||||||
if !role.NoStore {
|
if !role.NoStore {
|
||||||
err = req.Storage.Put(&logical.StorageEntry{
|
err = req.Storage.Put(&logical.StorageEntry{
|
||||||
Key: "certs/" + cb.SerialNumber,
|
Key: "certs/" + strings.ToLower(strings.Replace(cb.SerialNumber, ":", "-", -1)),
|
||||||
Value: parsedBundle.CertificateBytes,
|
Value: parsedBundle.CertificateBytes,
|
||||||
})
|
})
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, fmt.Errorf("Unable to store certificate locally: %v", err)
|
return nil, fmt.Errorf("unable to store certificate locally: %v", err)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -3,6 +3,7 @@ package pki
|
|||||||
import (
|
import (
|
||||||
"encoding/base64"
|
"encoding/base64"
|
||||||
"fmt"
|
"fmt"
|
||||||
|
"strings"
|
||||||
|
|
||||||
"github.com/hashicorp/vault/helper/errutil"
|
"github.com/hashicorp/vault/helper/errutil"
|
||||||
"github.com/hashicorp/vault/logical"
|
"github.com/hashicorp/vault/logical"
|
||||||
@@ -145,7 +146,7 @@ func (b *backend) pathCAGenerateRoot(
|
|||||||
// Also store it as just the certificate identified by serial number, so it
|
// Also store it as just the certificate identified by serial number, so it
|
||||||
// can be revoked
|
// can be revoked
|
||||||
err = req.Storage.Put(&logical.StorageEntry{
|
err = req.Storage.Put(&logical.StorageEntry{
|
||||||
Key: "certs/" + cb.SerialNumber,
|
Key: "certs/" + strings.ToLower(strings.Replace(cb.SerialNumber, ":", "-", -1)),
|
||||||
Value: parsedBundle.CertificateBytes,
|
Value: parsedBundle.CertificateBytes,
|
||||||
})
|
})
|
||||||
if err != nil {
|
if err != nil {
|
||||||
@@ -277,7 +278,7 @@ func (b *backend) pathCASignIntermediate(
|
|||||||
}
|
}
|
||||||
|
|
||||||
err = req.Storage.Put(&logical.StorageEntry{
|
err = req.Storage.Put(&logical.StorageEntry{
|
||||||
Key: "certs/" + cb.SerialNumber,
|
Key: "certs/" + strings.ToLower(strings.Replace(cb.SerialNumber, ":", "-", -1)),
|
||||||
Value: parsedBundle.CertificateBytes,
|
Value: parsedBundle.CertificateBytes,
|
||||||
})
|
})
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
|||||||
@@ -2,7 +2,6 @@ package pki
|
|||||||
|
|
||||||
import (
|
import (
|
||||||
"fmt"
|
"fmt"
|
||||||
"strings"
|
|
||||||
|
|
||||||
"github.com/hashicorp/vault/logical"
|
"github.com/hashicorp/vault/logical"
|
||||||
"github.com/hashicorp/vault/logical/framework"
|
"github.com/hashicorp/vault/logical/framework"
|
||||||
@@ -46,10 +45,8 @@ func (b *backend) secretCredsRevoke(
|
|||||||
return nil, fmt.Errorf("could not find serial in internal secret data")
|
return nil, fmt.Errorf("could not find serial in internal secret data")
|
||||||
}
|
}
|
||||||
|
|
||||||
serial := strings.Replace(strings.ToLower(serialInt.(string)), "-", ":", -1)
|
|
||||||
|
|
||||||
b.revokeStorageLock.Lock()
|
b.revokeStorageLock.Lock()
|
||||||
defer b.revokeStorageLock.Unlock()
|
defer b.revokeStorageLock.Unlock()
|
||||||
|
|
||||||
return revokeCert(b, req, serial, true)
|
return revokeCert(b, req, serialInt.(string), true)
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user