config.go 1.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970
  1. package tls
  2. import (
  3. "context"
  4. "crypto/tls"
  5. "v2ray.com/core/app/log"
  6. "v2ray.com/core/common/net"
  7. "v2ray.com/core/transport/internet"
  8. )
  9. var (
  10. globalSessionCache = tls.NewLRUClientSessionCache(128)
  11. )
  12. func (c *Config) BuildCertificates() []tls.Certificate {
  13. certs := make([]tls.Certificate, 0, len(c.Certificate))
  14. for _, entry := range c.Certificate {
  15. keyPair, err := tls.X509KeyPair(entry.Certificate, entry.Key)
  16. if err != nil {
  17. log.Trace(newError("ignoring invalid X509 key pair").Base(err).AtWarning())
  18. continue
  19. }
  20. certs = append(certs, keyPair)
  21. }
  22. return certs
  23. }
  24. func (c *Config) GetTLSConfig() *tls.Config {
  25. config := &tls.Config{
  26. ClientSessionCache: globalSessionCache,
  27. NextProtos: []string{"http/1.1"},
  28. }
  29. if c == nil {
  30. return config
  31. }
  32. config.InsecureSkipVerify = c.AllowInsecure
  33. config.Certificates = c.BuildCertificates()
  34. config.BuildNameToCertificate()
  35. if len(c.ServerName) > 0 {
  36. config.ServerName = c.ServerName
  37. }
  38. return config
  39. }
  40. type Option func(*Config)
  41. func WithDestination(dest net.Destination) Option {
  42. return func(config *Config) {
  43. if dest.Address.Family().IsDomain() && len(config.ServerName) == 0 {
  44. config.ServerName = dest.Address.Domain()
  45. }
  46. }
  47. }
  48. func ConfigFromContext(ctx context.Context, opts ...Option) *Config {
  49. securitySettings := internet.SecuritySettingsFromContext(ctx)
  50. if securitySettings == nil {
  51. return nil
  52. }
  53. if config, ok := securitySettings.(*Config); ok {
  54. for _, opt := range opts {
  55. opt(config)
  56. }
  57. return config
  58. }
  59. return nil
  60. }