tls.go 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105
  1. package serverctl
  2. import (
  3. "crypto/ed25519"
  4. "crypto/x509"
  5. "encoding/json"
  6. "encoding/pem"
  7. "errors"
  8. "fmt"
  9. "github.com/gravitl/netmaker/database"
  10. "github.com/gravitl/netmaker/tls"
  11. )
  12. // SaveCert - save a certificate to file and DB
  13. func SaveCert(path, name string, cert *x509.Certificate) error {
  14. if err := SaveCertToDB(name, cert); err != nil {
  15. return err
  16. }
  17. return tls.SaveCertToFile(path, name, cert)
  18. }
  19. // SaveCertToDB - save a certificate to the certs database
  20. func SaveCertToDB(name string, cert *x509.Certificate) error {
  21. if certBytes := pem.EncodeToMemory(&pem.Block{
  22. Type: "CERTIFICATE",
  23. Bytes: cert.Raw,
  24. }); len(certBytes) > 0 {
  25. data, err := json.Marshal(&certBytes)
  26. if err != nil {
  27. return fmt.Errorf("failed to marshal certificate - %v ", err)
  28. }
  29. return database.Insert(name, string(data), database.CERTS_TABLE_NAME)
  30. } else {
  31. return fmt.Errorf("failed to write cert to DB - %s ", name)
  32. }
  33. }
  34. // SaveKey - save a private key (ed25519) to file and DB
  35. func SaveKey(path, name string, key ed25519.PrivateKey) error {
  36. if err := SaveKeyToDB(name, key); err != nil {
  37. return err
  38. }
  39. return tls.SaveKeyToFile(path, name, key)
  40. }
  41. // SaveKeyToDB - save a private key (ed25519) to the specified path
  42. func SaveKeyToDB(name string, key ed25519.PrivateKey) error {
  43. privBytes, err := x509.MarshalPKCS8PrivateKey(key)
  44. if err != nil {
  45. return fmt.Errorf("failed to marshal key %v ", err)
  46. }
  47. if pemBytes := pem.EncodeToMemory(&pem.Block{
  48. Type: "PRIVATE KEY",
  49. Bytes: privBytes,
  50. }); len(pemBytes) > 0 {
  51. data, err := json.Marshal(&pemBytes)
  52. if err != nil {
  53. return fmt.Errorf("failed to marshal key %v ", err)
  54. }
  55. return database.Insert(name, string(data), database.CERTS_TABLE_NAME)
  56. } else {
  57. return fmt.Errorf("failed to write key to DB - %v ", err)
  58. }
  59. }
  60. // ReadCertFromDB - reads a certificate from the database
  61. func ReadCertFromDB(name string) (*x509.Certificate, error) {
  62. certString, err := database.FetchRecord(database.CERTS_TABLE_NAME, name)
  63. if err != nil {
  64. return nil, fmt.Errorf("unable to read file %w", err)
  65. }
  66. var certBytes []byte
  67. if err = json.Unmarshal([]byte(certString), &certBytes); err != nil {
  68. return nil, fmt.Errorf("unable to unmarshal db cert %w", err)
  69. }
  70. block, _ := pem.Decode(certBytes)
  71. if block == nil || block.Type != "CERTIFICATE" {
  72. return nil, errors.New("not a cert " + block.Type)
  73. }
  74. cert, err := x509.ParseCertificate(block.Bytes)
  75. if err != nil {
  76. return nil, fmt.Errorf("unable to parse cert %w", err)
  77. }
  78. return cert, nil
  79. }
  80. // ReadKeyFromDB - reads a private key (ed25519) from the database
  81. func ReadKeyFromDB(name string) (*ed25519.PrivateKey, error) {
  82. keyString, err := database.FetchRecord(database.CERTS_TABLE_NAME, name)
  83. if err != nil {
  84. return nil, fmt.Errorf("unable to read key value from db - %w", err)
  85. }
  86. var bytes []byte
  87. if err = json.Unmarshal([]byte(keyString), &bytes); err != nil {
  88. return nil, fmt.Errorf("unable to unmarshal db key - %w", err)
  89. }
  90. keyBytes, _ := pem.Decode(bytes)
  91. key, err := x509.ParsePKCS8PrivateKey(keyBytes.Bytes)
  92. if err != nil {
  93. return nil, fmt.Errorf("unable to parse key from DB - %w", err)
  94. }
  95. private := key.(ed25519.PrivateKey)
  96. return &private, nil
  97. }