@@ -16,6 +16,7 @@ import (
16
16
var (
17
17
certsTable = []byte ("x509_certs" )
18
18
revokedCertsTable = []byte ("revoked_x509_certs" )
19
+ crlTable = []byte ("x509_crl" )
19
20
revokedSSHCertsTable = []byte ("revoked_ssh_certs" )
20
21
usedOTTTable = []byte ("used_ott" )
21
22
sshCertsTable = []byte ("ssh_certs" )
24
25
sshHostPrincipalsTable = []byte ("ssh_host_principals" )
25
26
)
26
27
28
+ var crlKey = []byte ("crl" ) //TODO: at the moment we store a single CRL in the database, in a dedicated table.
29
+ // is this acceptable? probably not....
30
+
27
31
// ErrAlreadyExists can be returned if the DB attempts to set a key that has
28
32
// been previously set.
29
33
var ErrAlreadyExists = errors .New ("already exists" )
@@ -47,6 +51,9 @@ type AuthDB interface {
47
51
IsSSHRevoked (sn string ) (bool , error )
48
52
Revoke (rci * RevokedCertificateInfo ) error
49
53
RevokeSSH (rci * RevokedCertificateInfo ) error
54
+ GetRevokedCertificates () (* []RevokedCertificateInfo , error )
55
+ GetCRL () (* CertificateRevocationListInfo , error )
56
+ StoreCRL (* CertificateRevocationListInfo ) error
50
57
GetCertificate (serialNumber string ) (* x509.Certificate , error )
51
58
StoreCertificate (crt * x509.Certificate ) error
52
59
UseToken (id , tok string ) (bool , error )
@@ -82,7 +89,7 @@ func New(c *Config) (AuthDB, error) {
82
89
tables := [][]byte {
83
90
revokedCertsTable , certsTable , usedOTTTable ,
84
91
sshCertsTable , sshHostsTable , sshHostPrincipalsTable , sshUsersTable ,
85
- revokedSSHCertsTable ,
92
+ revokedSSHCertsTable , crlTable ,
86
93
}
87
94
for _ , b := range tables {
88
95
if err := db .CreateTable (b ); err != nil {
@@ -107,6 +114,14 @@ type RevokedCertificateInfo struct {
107
114
ACME bool
108
115
}
109
116
117
+ // CertificateRevocationListInfo contains a CRL in PEM and associated metadata to allow a decision on whether
118
+ // to regenerate the CRL or not easier
119
+ type CertificateRevocationListInfo struct {
120
+ Number int64
121
+ ExpiresAt time.Time
122
+ PEM string
123
+ }
124
+
110
125
// IsRevoked returns whether or not a certificate with the given identifier
111
126
// has been revoked.
112
127
// In the case of an X509 Certificate the `id` should be the Serial Number of
@@ -189,6 +204,58 @@ func (db *DB) RevokeSSH(rci *RevokedCertificateInfo) error {
189
204
}
190
205
}
191
206
207
+ // GetRevokedCertificates gets a list of all revoked certificates.
208
+ func (db * DB ) GetRevokedCertificates () (* []RevokedCertificateInfo , error ) {
209
+ entries , err := db .List (revokedCertsTable )
210
+ if err != nil {
211
+ return nil , err
212
+ }
213
+ var revokedCerts []RevokedCertificateInfo
214
+ for _ , e := range entries {
215
+ var data RevokedCertificateInfo
216
+ if err := json .Unmarshal (e .Value , & data ); err != nil {
217
+ return nil , err
218
+ }
219
+ revokedCerts = append (revokedCerts , data )
220
+
221
+ }
222
+ return & revokedCerts , nil
223
+ }
224
+
225
+ // StoreCRL stores a CRL in the DB
226
+ func (db * DB ) StoreCRL (crlInfo * CertificateRevocationListInfo ) error {
227
+
228
+ crlInfoBytes , err := json .Marshal (crlInfo )
229
+ if err != nil {
230
+ return errors .Wrap (err , "json Marshal error" )
231
+ }
232
+
233
+ if err := db .Set (crlTable , crlKey , crlInfoBytes ); err != nil {
234
+ return errors .Wrap (err , "database Set error" )
235
+ }
236
+ return nil
237
+ }
238
+
239
+ // GetCRL gets the existing CRL from the database
240
+ func (db * DB ) GetCRL () (* CertificateRevocationListInfo , error ) {
241
+ crlInfoBytes , err := db .Get (crlTable , crlKey )
242
+
243
+ if database .IsErrNotFound (err ) {
244
+ return nil , nil
245
+ }
246
+
247
+ if err != nil {
248
+ return nil , errors .Wrap (err , "database Get error" )
249
+ }
250
+
251
+ var crlInfo CertificateRevocationListInfo
252
+ err = json .Unmarshal (crlInfoBytes , & crlInfo )
253
+ if err != nil {
254
+ return nil , errors .Wrap (err , "json Unmarshal error" )
255
+ }
256
+ return & crlInfo , err
257
+ }
258
+
192
259
// GetCertificate retrieves a certificate by the serial number.
193
260
func (db * DB ) GetCertificate (serialNumber string ) (* x509.Certificate , error ) {
194
261
asn1Data , err := db .Get (certsTable , []byte (serialNumber ))
0 commit comments