tlsutils.go 1.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354
  1. package common
  2. import (
  3. "crypto/tls"
  4. "sync"
  5. "github.com/drakkan/sftpgo/logger"
  6. )
  7. // CertManager defines a TLS certificate manager
  8. type CertManager struct {
  9. certPath string
  10. keyPath string
  11. sync.RWMutex
  12. cert *tls.Certificate
  13. }
  14. // LoadCertificate loads the configured x509 key pair
  15. func (m *CertManager) LoadCertificate(logSender string) error {
  16. newCert, err := tls.LoadX509KeyPair(m.certPath, m.keyPath)
  17. if err != nil {
  18. logger.Warn(logSender, "", "unable to load X509 key pair, cert file %#v key file %#v error: %v",
  19. m.certPath, m.keyPath, err)
  20. return err
  21. }
  22. logger.Debug(logSender, "", "TLS certificate %#v successfully loaded", m.certPath)
  23. m.Lock()
  24. defer m.Unlock()
  25. m.cert = &newCert
  26. return nil
  27. }
  28. // GetCertificateFunc returns the loaded certificate
  29. func (m *CertManager) GetCertificateFunc() func(*tls.ClientHelloInfo) (*tls.Certificate, error) {
  30. return func(clientHello *tls.ClientHelloInfo) (*tls.Certificate, error) {
  31. m.RLock()
  32. defer m.RUnlock()
  33. return m.cert, nil
  34. }
  35. }
  36. // NewCertManager creates a new certificate manager
  37. func NewCertManager(certificateFile, certificateKeyFile, logSender string) (*CertManager, error) {
  38. manager := &CertManager{
  39. cert: nil,
  40. certPath: certificateFile,
  41. keyPath: certificateKeyFile,
  42. }
  43. err := manager.LoadCertificate(logSender)
  44. if err != nil {
  45. return nil, err
  46. }
  47. return manager, nil
  48. }