certs_test.go 1.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869
  1. package crypto
  2. import (
  3. "crypto/x509"
  4. "encoding/pem"
  5. "testing"
  6. )
  7. // parseOneCert decodes a single CERTIFICATE PEM block.
  8. func parseOneCert(t *testing.T, pemBytes []byte) *x509.Certificate {
  9. t.Helper()
  10. block, _ := pem.Decode(pemBytes)
  11. if block == nil || block.Type != "CERTIFICATE" {
  12. t.Fatalf("expected a CERTIFICATE PEM block, got %+v", block)
  13. }
  14. cert, err := x509.ParseCertificate(block.Bytes)
  15. if err != nil {
  16. t.Fatalf("ParseCertificate: %v", err)
  17. }
  18. return cert
  19. }
  20. func TestGenerateNodeCA(t *testing.T) {
  21. ca, err := GenerateNodeCA("3x-ui node CA")
  22. if err != nil {
  23. t.Fatalf("GenerateNodeCA: %v", err)
  24. }
  25. cert := parseOneCert(t, ca.CertPEM)
  26. if !cert.IsCA {
  27. t.Fatal("CA certificate must have IsCA=true")
  28. }
  29. if cert.KeyUsage&x509.KeyUsageCertSign == 0 {
  30. t.Fatal("CA certificate must allow KeyUsageCertSign")
  31. }
  32. if _, _, err := LoadCAFromPEM(ca); err != nil {
  33. t.Fatalf("LoadCAFromPEM on a freshly generated CA: %v", err)
  34. }
  35. }
  36. func TestIssueClientCert_VerifiesAgainstCA(t *testing.T) {
  37. ca, err := GenerateNodeCA("3x-ui node CA")
  38. if err != nil {
  39. t.Fatalf("GenerateNodeCA: %v", err)
  40. }
  41. leaf, err := IssueClientCert(ca, "central-panel")
  42. if err != nil {
  43. t.Fatalf("IssueClientCert: %v", err)
  44. }
  45. cert := parseOneCert(t, leaf.CertPEM)
  46. hasClientAuth := false
  47. for _, u := range cert.ExtKeyUsage {
  48. if u == x509.ExtKeyUsageClientAuth {
  49. hasClientAuth = true
  50. }
  51. }
  52. if !hasClientAuth {
  53. t.Fatal("client leaf must carry ExtKeyUsageClientAuth")
  54. }
  55. roots := x509.NewCertPool()
  56. roots.AddCert(parseOneCert(t, ca.CertPEM))
  57. if _, err := cert.Verify(x509.VerifyOptions{
  58. Roots: roots,
  59. KeyUsages: []x509.ExtKeyUsage{x509.ExtKeyUsageClientAuth},
  60. }); err != nil {
  61. t.Fatalf("client leaf must verify against the issuing CA: %v", err)
  62. }
  63. }