ping.go 2.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114
  1. package tls
  2. import (
  3. "crypto/tls"
  4. "crypto/x509"
  5. "fmt"
  6. "net"
  7. "github.com/xtls/xray-core/main/commands/base"
  8. )
  9. // cmdPing is the tls ping command
  10. var cmdPing = &base.Command{
  11. UsageLine: "{{.Exec}} tls ping [-ip <ip>] <domain>",
  12. Short: "Ping the domain with TLS handshake",
  13. Long: `
  14. Ping the domain with TLS handshake.
  15. Arguments:
  16. -ip
  17. The IP address of the domain.
  18. `,
  19. }
  20. func init() {
  21. cmdPing.Run = executePing // break init loop
  22. }
  23. var (
  24. pingIPStr = cmdPing.Flag.String("ip", "", "")
  25. )
  26. func executePing(cmd *base.Command, args []string) {
  27. if cmdPing.Flag.NArg() < 1 {
  28. base.Fatalf("domain not specified")
  29. }
  30. domain := cmdPing.Flag.Arg(0)
  31. fmt.Println("Tls ping: ", domain)
  32. var ip net.IP
  33. if len(*pingIPStr) > 0 {
  34. v := net.ParseIP(*pingIPStr)
  35. if v == nil {
  36. base.Fatalf("invalid IP: %s", *pingIPStr)
  37. }
  38. ip = v
  39. } else {
  40. v, err := net.ResolveIPAddr("ip", domain)
  41. if err != nil {
  42. base.Fatalf("Failed to resolve IP: %s", err)
  43. }
  44. ip = v.IP
  45. }
  46. fmt.Println("Using IP: ", ip.String())
  47. fmt.Println("-------------------")
  48. fmt.Println("Pinging without SNI")
  49. {
  50. tcpConn, err := net.DialTCP("tcp", nil, &net.TCPAddr{IP: ip, Port: 443})
  51. if err != nil {
  52. base.Fatalf("Failed to dial tcp: %s", err)
  53. }
  54. tlsConn := tls.Client(tcpConn, &tls.Config{
  55. InsecureSkipVerify: true,
  56. NextProtos: []string{"http/1.1"},
  57. MaxVersion: tls.VersionTLS12,
  58. MinVersion: tls.VersionTLS12,
  59. })
  60. err = tlsConn.Handshake()
  61. if err != nil {
  62. fmt.Println("Handshake failure: ", err)
  63. } else {
  64. fmt.Println("Handshake succeeded")
  65. printCertificates(tlsConn.ConnectionState().PeerCertificates)
  66. }
  67. tlsConn.Close()
  68. }
  69. fmt.Println("-------------------")
  70. fmt.Println("Pinging with SNI")
  71. {
  72. tcpConn, err := net.DialTCP("tcp", nil, &net.TCPAddr{IP: ip, Port: 443})
  73. if err != nil {
  74. base.Fatalf("Failed to dial tcp: %s", err)
  75. }
  76. tlsConn := tls.Client(tcpConn, &tls.Config{
  77. ServerName: domain,
  78. NextProtos: []string{"http/1.1"},
  79. MaxVersion: tls.VersionTLS12,
  80. MinVersion: tls.VersionTLS12,
  81. })
  82. err = tlsConn.Handshake()
  83. if err != nil {
  84. fmt.Println("handshake failure: ", err)
  85. } else {
  86. fmt.Println("handshake succeeded")
  87. printCertificates(tlsConn.ConnectionState().PeerCertificates)
  88. }
  89. tlsConn.Close()
  90. }
  91. fmt.Println("Tls ping finished")
  92. }
  93. func printCertificates(certs []*x509.Certificate) {
  94. for _, cert := range certs {
  95. if len(cert.DNSNames) == 0 {
  96. continue
  97. }
  98. fmt.Println("Allowed domains: ", cert.DNSNames)
  99. }
  100. }