dtls.go 2.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596
  1. package handler
  2. import (
  3. "context"
  4. "crypto/tls"
  5. "encoding/hex"
  6. "errors"
  7. "net"
  8. "time"
  9. "github.com/bjdgyc/anylink/base"
  10. "github.com/bjdgyc/anylink/sessdata"
  11. "github.com/pion/dtls/v2"
  12. "github.com/pion/dtls/v2/pkg/crypto/selfsign"
  13. "github.com/pion/logging"
  14. )
  15. func startDtls() {
  16. if !base.Cfg.ServerDTLS {
  17. return
  18. }
  19. certificate, err := selfsign.GenerateSelfSigned()
  20. if err != nil {
  21. panic(err)
  22. }
  23. logf := logging.NewDefaultLoggerFactory()
  24. logf.Writer = base.GetBaseLw()
  25. // logf.DefaultLogLevel = logging.LogLevelTrace
  26. logf.DefaultLogLevel = logging.LogLevelInfo
  27. // https://github.com/pion/dtls/pull/369
  28. sessStore := &sessionStore{}
  29. config := &dtls.Config{
  30. Certificates: []tls.Certificate{certificate},
  31. InsecureSkipVerify: true,
  32. ExtendedMasterSecret: dtls.DisableExtendedMasterSecret,
  33. CipherSuites: []dtls.CipherSuiteID{dtls.TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256},
  34. LoggerFactory: logf,
  35. MTU: BufferSize,
  36. SessionStore: sessStore,
  37. ConnectContextMaker: func() (context.Context, func()) {
  38. return context.WithTimeout(context.Background(), 5*time.Second)
  39. },
  40. }
  41. addr, err := net.ResolveUDPAddr("udp", base.Cfg.ServerDTLSAddr)
  42. if err != nil {
  43. panic(err)
  44. }
  45. ln, err := dtls.Listen("udp", addr, config)
  46. if err != nil {
  47. panic(err)
  48. }
  49. base.Info("listen DTLS server", addr)
  50. for {
  51. conn, err := ln.Accept()
  52. if err != nil {
  53. base.Error("DTLS Accept error", err)
  54. continue
  55. }
  56. go func() {
  57. // time.Sleep(1 * time.Second)
  58. cc := conn.(*dtls.Conn)
  59. sessid := hex.EncodeToString(cc.ConnectionState().SessionID)
  60. sess := sessdata.Dtls2Sess(sessid)
  61. LinkDtls(conn, sess.CSess)
  62. }()
  63. }
  64. }
  65. // https://github.com/pion/dtls/blob/master/session.go
  66. type sessionStore struct{}
  67. func (ms *sessionStore) Set(key []byte, s dtls.Session) error {
  68. return nil
  69. }
  70. func (ms *sessionStore) Get(key []byte) (dtls.Session, error) {
  71. k := hex.EncodeToString(key)
  72. secret := sessdata.Dtls2MasterSecret(k)
  73. if secret == "" {
  74. return dtls.Session{}, errors.New("Dtls2MasterSecret is nil")
  75. }
  76. masterSecret, _ := hex.DecodeString(secret)
  77. return dtls.Session{ID: key, Secret: masterSecret}, nil
  78. }
  79. func (ms *sessionStore) Del(key []byte) error {
  80. return nil
  81. }