tlsutils.go 1.0 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849
  1. package httpd
  2. import (
  3. "crypto/tls"
  4. "sync"
  5. "github.com/drakkan/sftpgo/ldapauthserver/logger"
  6. )
  7. type certManager struct {
  8. certPath string
  9. keyPath string
  10. sync.RWMutex
  11. cert *tls.Certificate
  12. }
  13. func (m *certManager) loadCertificate() error {
  14. newCert, err := tls.LoadX509KeyPair(m.certPath, m.keyPath)
  15. if err != nil {
  16. logger.Warn(logSender, "", "unable to load https certificate: %v", err)
  17. return err
  18. }
  19. logger.Debug(logSender, "", "https certificate successfully loaded")
  20. m.Lock()
  21. defer m.Unlock()
  22. m.cert = &newCert
  23. return nil
  24. }
  25. func (m *certManager) GetCertificateFunc() func(*tls.ClientHelloInfo) (*tls.Certificate, error) {
  26. return func(clientHello *tls.ClientHelloInfo) (*tls.Certificate, error) {
  27. m.RLock()
  28. defer m.RUnlock()
  29. return m.cert, nil
  30. }
  31. }
  32. func newCertManager(certificateFile, certificateKeyFile string) (*certManager, error) {
  33. manager := &certManager{
  34. cert: nil,
  35. certPath: certificateFile,
  36. keyPath: certificateKeyFile,
  37. }
  38. err := manager.loadCertificate()
  39. if err != nil {
  40. return nil, err
  41. }
  42. return manager, nil
  43. }