71 lines
1.7 KiB
Go
71 lines
1.7 KiB
Go
|
|
package certs
|
||
|
|
|
||
|
|
import (
|
||
|
|
"bytes"
|
||
|
|
"encoding/pem"
|
||
|
|
"os"
|
||
|
|
"path/filepath"
|
||
|
|
"testing"
|
||
|
|
)
|
||
|
|
|
||
|
|
func TestLocalCAStablePrivateAndIndependent(t *testing.T) {
|
||
|
|
dir := t.TempDir()
|
||
|
|
a, err := LoadOrCreateLocalCA(dir)
|
||
|
|
if err != nil {
|
||
|
|
t.Fatal(err)
|
||
|
|
}
|
||
|
|
b, err := LoadOrCreateLocalCA(dir)
|
||
|
|
if err != nil {
|
||
|
|
t.Fatal(err)
|
||
|
|
}
|
||
|
|
if !bytes.Equal(a.CACertPEM(), b.CACertPEM()) {
|
||
|
|
t.Fatal("CA rotated on restart")
|
||
|
|
}
|
||
|
|
c, err := LoadOrCreateLocalCA(t.TempDir())
|
||
|
|
if err != nil {
|
||
|
|
t.Fatal(err)
|
||
|
|
}
|
||
|
|
if bytes.Equal(a.CACertPEM(), c.CACertPEM()) {
|
||
|
|
t.Fatal("installations share a CA")
|
||
|
|
}
|
||
|
|
if bytes.Equal(a.CACertPEM(), EmbeddedCACertPEM()) {
|
||
|
|
t.Fatal("legacy CA reused")
|
||
|
|
}
|
||
|
|
leaf, err := a.CertificateForServerName("api2.cursor.sh")
|
||
|
|
if err != nil {
|
||
|
|
t.Fatal(err)
|
||
|
|
}
|
||
|
|
if err := leaf.Leaf.CheckSignatureFrom(a.caCert); err != nil {
|
||
|
|
t.Fatal(err)
|
||
|
|
}
|
||
|
|
if err := leaf.Leaf.VerifyHostname("api2.cursor.sh"); err != nil {
|
||
|
|
t.Fatal(err)
|
||
|
|
}
|
||
|
|
if err := leaf.Leaf.VerifyHostname("unrelated.example"); err == nil {
|
||
|
|
t.Fatal("hostname mismatch accepted")
|
||
|
|
}
|
||
|
|
bundle, err := os.ReadFile(filepath.Join(dir, "local-ca.pem"))
|
||
|
|
if err != nil {
|
||
|
|
t.Fatal(err)
|
||
|
|
}
|
||
|
|
_, key := pem.Decode(bundle)
|
||
|
|
if _, err = NewManagerFromPEM(c.CACertPEM(), key); err == nil {
|
||
|
|
t.Fatal("mismatched key accepted")
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
func TestCorruptCADoesNotRotateOrOverwrite(t *testing.T) {
|
||
|
|
dir := t.TempDir()
|
||
|
|
bad := []byte("broken private authority")
|
||
|
|
if err := os.WriteFile(filepath.Join(dir, "local-ca.pem"), bad, 0600); err != nil {
|
||
|
|
t.Fatal(err)
|
||
|
|
}
|
||
|
|
if _, err := LoadOrCreateLocalCA(dir); err == nil {
|
||
|
|
t.Fatal("corrupt CA accepted")
|
||
|
|
}
|
||
|
|
after, _ := os.ReadFile(filepath.Join(dir, "local-ca.pem"))
|
||
|
|
if !bytes.Equal(bad, after) {
|
||
|
|
t.Fatal("corrupt CA silently replaced")
|
||
|
|
}
|
||
|
|
}
|