Skip to content

Commit 3227d08

Browse files
committed
feat: add cert fingerprint to issuance log, remove connection hash
The cert fingerprint matches what 'epithet agent inspect' displays, enabling direct correlation. The connection hash (%C) is not meaningful on the CA side so it is removed from the log output.
1 parent cb2fcf3 commit 3227d08

3 files changed

Lines changed: 15 additions & 6 deletions

File tree

pkg/caserver/caserver.go

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,8 @@ package caserver
22

33
import (
44
"context"
5+
"crypto/sha256"
6+
"encoding/base64"
57
"encoding/json"
68
"errors"
79
"fmt"
@@ -349,6 +351,9 @@ func (s *caServer) logCertIssuance(
349351
return fmt.Errorf("failed to generate fingerprint: %w", err)
350352
}
351353

354+
// Cert fingerprint matches what `epithet agent inspect` displays.
355+
certFP := "SHA256:" + base64.RawStdEncoding.EncodeToString(sha256Sum(parsedCert.Marshal()))
356+
352357
event := &CertEvent{
353358
Timestamp: time.Now(),
354359
SerialNumber: fmt.Sprintf("%d", parsedCert.Serial),
@@ -358,6 +363,7 @@ func (s *caServer) logCertIssuance(
358363
ValidAfter: time.Unix(int64(parsedCert.ValidAfter), 0),
359364
ValidBefore: time.Unix(int64(parsedCert.ValidBefore), 0),
360365
Extensions: policyResp.CertParams.Extensions,
366+
CertFingerprint: certFP,
361367
PublicKeyFingerprint: fingerprint,
362368
Policy: policyResp.Policy,
363369
}
@@ -389,3 +395,8 @@ func generateFingerprint(pubKey sshcert.RawPublicKey) (string, error) {
389395

390396
return ssh.FingerprintSHA256(key), nil
391397
}
398+
399+
func sha256Sum(data []byte) []byte {
400+
h := sha256.Sum256(data)
401+
return h[:]
402+
}

pkg/caserver/logger.go

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@ type CertEvent struct {
2525
ValidAfter time.Time
2626
ValidBefore time.Time
2727
Extensions map[string]string
28+
CertFingerprint string
2829
PublicKeyFingerprint string
2930
Policy policy.Policy
3031
}
@@ -49,11 +50,11 @@ func (l *SlogCertLogger) LogCert(ctx context.Context, event *CertEvent) error {
4950
slog.String("remote_host", event.Connection.RemoteHost),
5051
slog.String("remote_user", event.Connection.RemoteUser),
5152
slog.Int("port", int(event.Connection.Port)),
52-
slog.String("hash", string(event.Connection.Hash)),
5353
slog.String("proxy_jump", event.Connection.ProxyJump),
5454
slog.Time("valid_after", event.ValidAfter),
5555
slog.Time("valid_before", event.ValidBefore),
5656
slog.Any("extensions", event.Extensions),
57+
slog.String("cert_fingerprint", event.CertFingerprint),
5758
slog.String("public_key_fingerprint", event.PublicKeyFingerprint),
5859
slog.Any("host_users", event.Policy.HostUsers),
5960
)
@@ -109,11 +110,11 @@ type certEventForJSON struct {
109110
RemoteHost string `json:"remote_host"`
110111
RemoteUser string `json:"remote_user"`
111112
Port int `json:"port"`
112-
Hash string `json:"hash"`
113113
ProxyJump string `json:"proxy_jump,omitempty"`
114114
ValidAfter time.Time `json:"valid_after"`
115115
ValidBefore time.Time `json:"valid_before"`
116116
Extensions map[string]string `json:"extensions,omitempty"`
117+
CertFingerprint string `json:"cert_fingerprint"`
117118
PublicKeyFingerprint string `json:"public_key_fingerprint"`
118119
HostUsers map[string][]string `json:"host_users"`
119120
}
@@ -128,11 +129,11 @@ func (e *CertEvent) toJSON() ([]byte, error) {
128129
RemoteHost: e.Connection.RemoteHost,
129130
RemoteUser: e.Connection.RemoteUser,
130131
Port: int(e.Connection.Port),
131-
Hash: string(e.Connection.Hash),
132132
ProxyJump: e.Connection.ProxyJump,
133133
ValidAfter: e.ValidAfter,
134134
ValidBefore: e.ValidBefore,
135135
Extensions: e.Extensions,
136+
CertFingerprint: e.CertFingerprint,
136137
PublicKeyFingerprint: e.PublicKeyFingerprint,
137138
HostUsers: e.Policy.HostUsers,
138139
}

pkg/caserver/logger_test.go

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -219,9 +219,6 @@ func TestCertEvent_toJSON(t *testing.T) {
219219
if parsed.Port != 22 {
220220
t.Errorf("Expected port=22, got %d", parsed.Port)
221221
}
222-
if parsed.Hash != "abc123" {
223-
t.Errorf("Expected hash=abc123, got %s", parsed.Hash)
224-
}
225222
if parsed.ProxyJump != "bastion.example.com" {
226223
t.Errorf("Expected proxy_jump=bastion.example.com, got %s", parsed.ProxyJump)
227224
}

0 commit comments

Comments
 (0)