tls.go 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136
  1. package transport
  2. import (
  3. "crypto/rand"
  4. "crypto/rsa"
  5. "crypto/tls"
  6. "crypto/x509"
  7. "encoding/pem"
  8. "io/ioutil"
  9. "math/big"
  10. )
  11. /*
  12. Example for self-signed certificates by openssl:
  13. Self CA:
  14. openssl genrsa -out ca.key 2048
  15. openssl req -x509 -new -nodes -key ca.key -subj "/CN=example.ca.com" -days 5000 -out ca.crt
  16. Server:
  17. openssl genrsa -out server.key 2048
  18. openssl req -new -key server.key -subj "/CN=example.server.com" -out server.csr
  19. openssl x509 -req -in server.csr -CA ca.crt -CAkey ca.key -CAcreateserial -out server.crt -days 5000
  20. Client:
  21. openssl genrsa -out client.key 2048
  22. openssl req -new -key client.key -subj "/CN=example.client.com" -out client.csr
  23. openssl x509 -req -in client.csr -CA ca.crt -CAkey ca.key -CAcreateserial -out client.crt -days 5000
  24. */
  25. func newCustomTLSKeyPair(certfile, keyfile string) (*tls.Certificate, error) {
  26. tlsCert, err := tls.LoadX509KeyPair(certfile, keyfile)
  27. if err != nil {
  28. return nil, err
  29. }
  30. return &tlsCert, nil
  31. }
  32. func newRandomTLSKeyPair() *tls.Certificate {
  33. key, err := rsa.GenerateKey(rand.Reader, 1024)
  34. if err != nil {
  35. panic(err)
  36. }
  37. template := x509.Certificate{SerialNumber: big.NewInt(1)}
  38. certDER, err := x509.CreateCertificate(
  39. rand.Reader,
  40. &template,
  41. &template,
  42. &key.PublicKey,
  43. key)
  44. if err != nil {
  45. panic(err)
  46. }
  47. keyPEM := pem.EncodeToMemory(&pem.Block{Type: "RSA PRIVATE KEY", Bytes: x509.MarshalPKCS1PrivateKey(key)})
  48. certPEM := pem.EncodeToMemory(&pem.Block{Type: "CERTIFICATE", Bytes: certDER})
  49. tlsCert, err := tls.X509KeyPair(certPEM, keyPEM)
  50. if err != nil {
  51. panic(err)
  52. }
  53. return &tlsCert
  54. }
  55. // Only supprt one ca file to add
  56. func newCertPool(caPath string) (*x509.CertPool, error) {
  57. pool := x509.NewCertPool()
  58. caCrt, err := ioutil.ReadFile(caPath)
  59. if err != nil {
  60. return nil, err
  61. }
  62. pool.AppendCertsFromPEM(caCrt)
  63. return pool, nil
  64. }
  65. func NewServerTLSConfig(certPath, keyPath, caPath string) (*tls.Config, error) {
  66. var base = &tls.Config{}
  67. if certPath == "" || keyPath == "" {
  68. // server will generate tls conf by itself
  69. cert := newRandomTLSKeyPair()
  70. base.Certificates = []tls.Certificate{*cert}
  71. } else {
  72. cert, err := newCustomTLSKeyPair(certPath, keyPath)
  73. if err != nil {
  74. return nil, err
  75. }
  76. base.Certificates = []tls.Certificate{*cert}
  77. }
  78. if caPath != "" {
  79. pool, err := newCertPool(caPath)
  80. if err != nil {
  81. return nil, err
  82. }
  83. base.ClientAuth = tls.RequireAndVerifyClientCert
  84. base.ClientCAs = pool
  85. }
  86. return base, nil
  87. }
  88. func NewClientTLSConfig(certPath, keyPath, caPath, servearName string) (*tls.Config, error) {
  89. var base = &tls.Config{}
  90. if certPath == "" || keyPath == "" {
  91. // client will not generate tls conf by itself
  92. } else {
  93. cert, err := newCustomTLSKeyPair(certPath, keyPath)
  94. if err != nil {
  95. return nil, err
  96. }
  97. base.Certificates = []tls.Certificate{*cert}
  98. }
  99. if caPath != "" {
  100. pool, err := newCertPool(caPath)
  101. if err != nil {
  102. return nil, err
  103. }
  104. base.RootCAs = pool
  105. base.ServerName = servearName
  106. base.InsecureSkipVerify = false
  107. } else {
  108. base.InsecureSkipVerify = true
  109. }
  110. return base, nil
  111. }