tls.go 2.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687
  1. package crypt
  2. import (
  3. "crypto/rand"
  4. "crypto/rsa"
  5. "crypto/tls"
  6. "crypto/x509"
  7. "crypto/x509/pkix"
  8. "encoding/pem"
  9. "log"
  10. "math/big"
  11. "net"
  12. "os"
  13. "time"
  14. "github.com/astaxie/beego/logs"
  15. )
  16. var (
  17. cert tls.Certificate
  18. )
  19. func InitTls() {
  20. c, k, err := generateKeyPair("NPS Org")
  21. if err == nil {
  22. cert, err = tls.X509KeyPair(c, k)
  23. }
  24. if err != nil {
  25. log.Fatalln("Error initializing crypto certs", err)
  26. }
  27. }
  28. func NewTlsServerConn(conn net.Conn) net.Conn {
  29. var err error
  30. if err != nil {
  31. logs.Error(err)
  32. os.Exit(0)
  33. return nil
  34. }
  35. config := &tls.Config{Certificates: []tls.Certificate{cert}}
  36. return tls.Server(conn, config)
  37. }
  38. func NewTlsClientConn(conn net.Conn) net.Conn {
  39. conf := &tls.Config{
  40. InsecureSkipVerify: true,
  41. }
  42. return tls.Client(conn, conf)
  43. }
  44. func generateKeyPair(CommonName string) (rawCert, rawKey []byte, err error) {
  45. // Create private key and self-signed certificate
  46. // Adapted from https://golang.org/src/crypto/tls/generate_cert.go
  47. priv, err := rsa.GenerateKey(rand.Reader, 2048)
  48. if err != nil {
  49. return
  50. }
  51. validFor := time.Hour * 24 * 365 * 10 // ten years
  52. notBefore := time.Now()
  53. notAfter := notBefore.Add(validFor)
  54. serialNumberLimit := new(big.Int).Lsh(big.NewInt(1), 128)
  55. serialNumber, err := rand.Int(rand.Reader, serialNumberLimit)
  56. template := x509.Certificate{
  57. SerialNumber: serialNumber,
  58. Subject: pkix.Name{
  59. Organization: []string{"My Company Name LTD."},
  60. CommonName: CommonName,
  61. Country: []string{"US"},
  62. },
  63. NotBefore: notBefore,
  64. NotAfter: notAfter,
  65. KeyUsage: x509.KeyUsageKeyEncipherment | x509.KeyUsageDigitalSignature,
  66. ExtKeyUsage: []x509.ExtKeyUsage{x509.ExtKeyUsageServerAuth},
  67. BasicConstraintsValid: true,
  68. }
  69. derBytes, err := x509.CreateCertificate(rand.Reader, &template, &template, &priv.PublicKey, priv)
  70. if err != nil {
  71. return
  72. }
  73. rawCert = pem.EncodeToMemory(&pem.Block{Type: "CERTIFICATE", Bytes: derBytes})
  74. rawKey = pem.EncodeToMemory(&pem.Block{Type: "RSA PRIVATE KEY", Bytes: x509.MarshalPKCS1PrivateKey(priv)})
  75. return
  76. }