tlsutils.go 1.1 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950
  1. package httpd
  2. import (
  3. "crypto/tls"
  4. "sync"
  5. "github.com/drakkan/sftpgo/ldapauthserver/logger"
  6. )
  7. type certManager struct {
  8. cert *tls.Certificate
  9. certPath string
  10. keyPath string
  11. lock *sync.RWMutex
  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.Lock()
  21. defer m.lock.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.lock.RLock()
  28. defer m.lock.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. lock: new(sync.RWMutex),
  38. }
  39. err := manager.loadCertificate()
  40. if err != nil {
  41. return nil, err
  42. }
  43. return manager, nil
  44. }