tcp_socket.go 1.8 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374
  1. package server
  2. import (
  3. "crypto/tls"
  4. "crypto/x509"
  5. "fmt"
  6. "io/ioutil"
  7. "net"
  8. "os"
  9. "github.com/docker/docker/engine"
  10. "github.com/docker/docker/pkg/listenbuffer"
  11. )
  12. type tlsConfig struct {
  13. CA string
  14. Certificate string
  15. Key string
  16. Verify bool
  17. }
  18. func tlsConfigFromJob(job *engine.Job) *tlsConfig {
  19. verify := job.GetenvBool("TlsVerify")
  20. if !job.GetenvBool("Tls") && !verify {
  21. return nil
  22. }
  23. return &tlsConfig{
  24. Verify: verify,
  25. Certificate: job.Getenv("TlsCert"),
  26. Key: job.Getenv("TlsKey"),
  27. CA: job.Getenv("TlsCa"),
  28. }
  29. }
  30. func NewTcpSocket(addr string, config *tlsConfig) (net.Listener, error) {
  31. l, err := listenbuffer.NewListenBuffer("tcp", addr, activationLock)
  32. if err != nil {
  33. return nil, err
  34. }
  35. if config != nil {
  36. if l, err = setupTls(l, config); err != nil {
  37. return nil, err
  38. }
  39. }
  40. return l, nil
  41. }
  42. func setupTls(l net.Listener, config *tlsConfig) (net.Listener, error) {
  43. tlsCert, err := tls.LoadX509KeyPair(config.Certificate, config.Key)
  44. if err != nil {
  45. if os.IsNotExist(err) {
  46. return nil, fmt.Errorf("Could not load X509 key pair (%s, %s): %v", config.Certificate, config.Key, err)
  47. }
  48. return nil, fmt.Errorf("Error reading X509 key pair (%s, %s): %q. Make sure the key is encrypted.",
  49. config.Certificate, config.Key, err)
  50. }
  51. tlsConfig := &tls.Config{
  52. NextProtos: []string{"http/1.1"},
  53. Certificates: []tls.Certificate{tlsCert},
  54. // Avoid fallback on insecure SSL protocols
  55. MinVersion: tls.VersionTLS10,
  56. }
  57. if config.CA != "" {
  58. certPool := x509.NewCertPool()
  59. file, err := ioutil.ReadFile(config.CA)
  60. if err != nil {
  61. return nil, fmt.Errorf("Could not read CA certificate: %v", err)
  62. }
  63. certPool.AppendCertsFromPEM(file)
  64. tlsConfig.ClientAuth = tls.RequireAndVerifyClientCert
  65. tlsConfig.ClientCAs = certPool
  66. }
  67. return tls.NewListener(l, tlsConfig), nil
  68. }