software steht so weit.
jetzt build + docker build und testen
This commit is contained in:
1 parent
42f0c0accb
commit
ca6cdcca63
90 files changed
+10298
-480
No files matched your search
@@ -212,7 +212,7 @@ func TestIntegration_TokenWithPinnedTLS(t *testing.T) {
|
||||
srv, sc, _ := pinnedServer(t, db, hub)
|
||||
|
||||
// Server-Seite (sultan token): Token erzeugen, nur das Secret speichern.
|
||||
tok, err := crypto.NewEnrollmentToken(sc.Fingerprint)
|
||||
tok, err := crypto.NewEnrollmentToken(sc.Fingerprint, "")
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
@@ -225,9 +225,7 @@ func TestIntegration_TokenWithPinnedTLS(t *testing.T) {
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
addr := srv.Listener.Addr().String()
|
||||
ks := &crypto.KnownServers{Path: filepath.Join(t.TempDir(), "known_servers")}
|
||||
firstContact := &http.Client{Transport: &http.Transport{TLSClientConfig: crypto.ClientTLSConfig(addr, ks, parsed.Fingerprint)}}
|
||||
firstContact := &http.Client{Transport: &http.Transport{TLSClientConfig: crypto.PinnedTLSConfig(parsed.Fingerprint)}}
|
||||
priv, _ := GenerateKey()
|
||||
signer := &Signer{Key: priv}
|
||||
|
||||
@@ -240,8 +238,8 @@ func TestIntegration_TokenWithPinnedTLS(t *testing.T) {
|
||||
t.Fatalf("Enrollment: Status %d", resp.StatusCode)
|
||||
}
|
||||
|
||||
// Ab jetzt nur noch über den Pin, ohne Token-Fingerprint.
|
||||
pinned := &http.Client{Transport: &http.Transport{TLSClientConfig: crypto.ClientTLSConfig(addr, ks, "")}}
|
||||
// Ab jetzt über den gespeicherten Pin (beim Agent: node.json).
|
||||
pinned := &http.Client{Transport: &http.Transport{TLSClientConfig: crypto.PinnedTLSConfig(parsed.Fingerprint)}}
|
||||
client := &stream.Client{URL: srv.URL + "/api/v1/stream", HTTPClient: pinned, Prepare: signer.Sign}
|
||||
got := make(chan stream.Event, 1)
|
||||
runCtx, cancel := context.WithCancel(ctx)
|
||||
@@ -275,12 +273,10 @@ func TestIntegration_MITMNeverSeesToken(t *testing.T) {
|
||||
_, realCert, _ := pinnedServer(t, db, hub)
|
||||
mitm, _, mitmHits := pinnedServer(t, homelabStore(t), &stream.Hub{})
|
||||
|
||||
tok, _ := crypto.NewEnrollmentToken(realCert.Fingerprint)
|
||||
tok, _ := crypto.NewEnrollmentToken(realCert.Fingerprint, "")
|
||||
db.AddEnrollmentToken(ctx, tok.Secret, "homelab", time.Now().Add(time.Hour))
|
||||
|
||||
ks := &crypto.KnownServers{Path: filepath.Join(t.TempDir(), "known_servers")}
|
||||
addr := mitm.Listener.Addr().String()
|
||||
hc := &http.Client{Transport: &http.Transport{TLSClientConfig: crypto.ClientTLSConfig(addr, ks, tok.Fingerprint)}}
|
||||
hc := &http.Client{Transport: &http.Transport{TLSClientConfig: crypto.PinnedTLSConfig(tok.Fingerprint)}}
|
||||
priv, _ := GenerateKey()
|
||||
|
||||
_, err := enroll(&Signer{Key: priv}, hc, mitm.URL, tok.Secret)
|
||||
|
||||
@@ -104,3 +104,24 @@ func DecodePublicKey(s string) (ed25519.PublicKey, error) {
|
||||
}
|
||||
return ed25519.PublicKey(b), nil
|
||||
}
|
||||
|
||||
// rotationVersion trennt Rotationsnachweise von anderen Signaturen.
|
||||
const rotationVersion = "SULTAN-ROTATE-V1\n"
|
||||
|
||||
func rotationMessage(nodeID string, pub ed25519.PublicKey) []byte {
|
||||
return []byte(rotationVersion + nodeID + "\n" + EncodePublicKey(pub))
|
||||
}
|
||||
|
||||
// RotationProof beweist beim Schlüsselwechsel (rotate_key) den Besitz des
|
||||
// neuen Schlüssels; der Nachweis ist an die Knoten-ID gebunden.
|
||||
func RotationProof(nodeID string, newKey ed25519.PrivateKey) string {
|
||||
pub := newKey.Public().(ed25519.PublicKey)
|
||||
return base64.StdEncoding.EncodeToString(ed25519.Sign(newKey, rotationMessage(nodeID, pub)))
|
||||
}
|
||||
|
||||
// VerifyRotationProof prüft einen RotationProof.
|
||||
func VerifyRotationProof(nodeID string, pub ed25519.PublicKey, proof string) bool {
|
||||
sig, err := base64.StdEncoding.DecodeString(proof)
|
||||
return err == nil && len(sig) == ed25519.SignatureSize && len(pub) == ed25519.PublicKeySize &&
|
||||
ed25519.Verify(pub, rotationMessage(nodeID, pub), sig)
|
||||
}
|
||||
Reference in new issue
Block a user