manager_test.go 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144
  1. package certs
  2. import (
  3. "crypto/x509"
  4. "os"
  5. "testing"
  6. )
  7. func TestCertManagerCAAndCert(t *testing.T) {
  8. tmpDir, err := os.MkdirTemp("", "certs-test-*")
  9. if err != nil {
  10. t.Fatalf("failed creating temp dir: %v", err)
  11. }
  12. defer os.RemoveAll(tmpDir)
  13. cm, err := NewCertManager(tmpDir)
  14. if err != nil {
  15. t.Fatalf("NewCertManager failed: %v", err)
  16. }
  17. // 1. Create CA
  18. caInfo, err := cm.CreateCA(CreateCARequest{
  19. Name: "root-ca",
  20. CommonName: "DebTik Test Root CA",
  21. Organization: "Test Org",
  22. Days: 365,
  23. })
  24. if err != nil {
  25. t.Fatalf("CreateCA failed: %v", err)
  26. }
  27. if !caInfo.IsCA || caInfo.Name != "root-ca" {
  28. t.Fatalf("Unexpected CA info: %+v", caInfo)
  29. }
  30. // 2. Issue server cert signed by root-ca
  31. certInfo, err := cm.CreateCertificate(CreateCertRequest{
  32. Name: "web-cert",
  33. CommonName: "router.lan",
  34. CAName: "root-ca",
  35. SANs: []string{"127.0.0.1", "192.168.1.1", "router.local"},
  36. Days: 90,
  37. IsServer: true,
  38. })
  39. if err != nil {
  40. t.Fatalf("CreateCertificate failed: %v", err)
  41. }
  42. if certInfo.IsCA || certInfo.Issuer != "root-ca" {
  43. t.Fatalf("Unexpected cert info: %+v", certInfo)
  44. }
  45. // 3. Verify TLS KeyPair loading
  46. tlsCert, err := cm.GetTLSCertificate("web-cert")
  47. if err != nil {
  48. t.Fatalf("GetTLSCertificate failed: %v", err)
  49. }
  50. if len(tlsCert.Certificate) < 2 {
  51. t.Fatalf("Expected cert chain of at least 2 certs (cert + CA), got %d", len(tlsCert.Certificate))
  52. }
  53. // Verify x509 chain against root-ca
  54. caPEM, _, err := cm.ExportPEM("root-ca")
  55. if err != nil {
  56. t.Fatalf("ExportPEM CA failed: %v", err)
  57. }
  58. roots := x509.NewCertPool()
  59. if !roots.AppendCertsFromPEM([]byte(caPEM)) {
  60. t.Fatalf("Failed to append CA PEM to pool")
  61. }
  62. serverCert, err := x509.ParseCertificate(tlsCert.Certificate[0])
  63. if err != nil {
  64. t.Fatalf("Parse server cert failed: %v", err)
  65. }
  66. opts := x509.VerifyOptions{
  67. Roots: roots,
  68. DNSName: "router.lan",
  69. }
  70. if _, err := serverCert.Verify(opts); err != nil {
  71. t.Fatalf("Cert verification failed: %v", err)
  72. }
  73. // 4. Test Export PEM
  74. certPEM, keyPEM, err := cm.ExportPEM("web-cert")
  75. if err != nil {
  76. t.Fatalf("ExportPEM web-cert failed: %v", err)
  77. }
  78. if len(certPEM) == 0 || len(keyPEM) == 0 {
  79. t.Fatalf("ExportPEM returned empty")
  80. }
  81. // 5. Test Import
  82. importInfo, err := cm.ImportCertificate(ImportCertRequest{
  83. Name: "imported-cert",
  84. CertPEM: certPEM,
  85. KeyPEM: keyPEM,
  86. Comment: "imported test",
  87. })
  88. if err != nil {
  89. t.Fatalf("ImportCertificate failed: %v", err)
  90. }
  91. if importInfo.CommonName != "router.lan" {
  92. t.Fatalf("Imported cert common name mismatch: %s", importInfo.CommonName)
  93. }
  94. // 6. Test Delete
  95. if err := cm.DeleteCertificate("imported-cert"); err != nil {
  96. t.Fatalf("DeleteCertificate failed: %v", err)
  97. }
  98. if _, err := cm.GetCertificate("imported-cert"); err == nil {
  99. t.Fatalf("Expected error getting deleted certificate")
  100. }
  101. }
  102. func TestCertManagerPersistence(t *testing.T) {
  103. tmpDir, err := os.MkdirTemp("", "certs-persist-*")
  104. if err != nil {
  105. t.Fatalf("failed creating temp dir: %v", err)
  106. }
  107. defer os.RemoveAll(tmpDir)
  108. cm1, err := NewCertManager(tmpDir)
  109. if err != nil {
  110. t.Fatalf("NewCertManager failed: %v", err)
  111. }
  112. _, err = cm1.CreateCA(CreateCARequest{Name: "persisted-ca", CommonName: "Persisted CA"})
  113. if err != nil {
  114. t.Fatalf("CreateCA failed: %v", err)
  115. }
  116. // New manager with same dir should reload metadata
  117. cm2, err := NewCertManager(tmpDir)
  118. if err != nil {
  119. t.Fatalf("Reload NewCertManager failed: %v", err)
  120. }
  121. c, err := cm2.GetCertificate("persisted-ca")
  122. if err != nil {
  123. t.Fatalf("Failed to retrieve persisted CA: %v", err)
  124. }
  125. if c.Name != "persisted-ca" || !c.IsCA {
  126. t.Fatalf("Persisted CA mismatch: %+v", c)
  127. }
  128. }