dtls.go 2.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100
  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. did := hex.EncodeToString(cc.ConnectionState().SessionID)
  60. cSess := sessdata.Dtls2CSess(did)
  61. if cSess == nil {
  62. conn.Close()
  63. return
  64. }
  65. LinkDtls(conn, cSess)
  66. }()
  67. }
  68. }
  69. // https://github.com/pion/dtls/blob/master/session.go
  70. type sessionStore struct{}
  71. func (ms *sessionStore) Set(key []byte, s dtls.Session) error {
  72. return nil
  73. }
  74. func (ms *sessionStore) Get(key []byte) (dtls.Session, error) {
  75. k := hex.EncodeToString(key)
  76. secret := sessdata.Dtls2MasterSecret(k)
  77. if secret == "" {
  78. return dtls.Session{}, errors.New("Dtls2MasterSecret is nil")
  79. }
  80. masterSecret, _ := hex.DecodeString(secret)
  81. return dtls.Session{ID: key, Secret: masterSecret}, nil
  82. }
  83. func (ms *sessionStore) Del(key []byte) error {
  84. return nil
  85. }