Alternative TLS implementation in Go
Não pode escolher mais do que 25 tópicos Os tópicos devem começar com uma letra ou um número, podem incluir traços ('-') e podem ter até 35 caracteres.

76 linhas
1.6 KiB

  1. package main
  2. import (
  3. "bufio"
  4. "crypto/tls"
  5. "flag"
  6. "fmt"
  7. "io"
  8. "net/http"
  9. "net/url"
  10. "os"
  11. )
  12. var tlsVersionToName = map[string]uint16{
  13. "tls10": tls.VersionTLS10,
  14. "tls11": tls.VersionTLS11,
  15. "tls12": tls.VersionTLS12,
  16. "tls13": tls.VersionTLS13,
  17. }
  18. // Usage client args host:port
  19. func main() {
  20. var version string
  21. var addr string
  22. var enableEMS bool
  23. var resume bool
  24. var config tls.Config
  25. var cache tls.ClientSessionCache
  26. cache = tls.NewLRUClientSessionCache(0)
  27. flag.StringVar(&version, "version", "tls12", "Version of TLS to use")
  28. flag.BoolVar(&enableEMS, "m", false, "Enable EMS")
  29. flag.BoolVar(&resume, "r", false, "Attempt Resumption")
  30. flag.Parse()
  31. config.MinVersion = tlsVersionToName[version]
  32. config.MaxVersion = tlsVersionToName[version]
  33. config.InsecureSkipVerify = true
  34. config.UseExtendedMasterSecret = !enableEMS
  35. config.ClientSessionCache = cache
  36. var iters int
  37. if resume {
  38. iters = 2
  39. } else {
  40. iters = 1
  41. }
  42. addr = flag.Arg(0)
  43. for ; iters > 0; iters-- {
  44. conn, err := tls.Dial("tcp", addr, &config)
  45. if err != nil {
  46. fmt.Println("Error %s", err)
  47. os.Exit(1)
  48. }
  49. var req http.Request
  50. var response *http.Response
  51. req.Method = "GET"
  52. req.URL, err = url.Parse("https://" + addr + "/")
  53. if err != nil {
  54. fmt.Println("Failed to parse url")
  55. os.Exit(1)
  56. }
  57. req.Write(conn)
  58. reader := bufio.NewReader(conn)
  59. response, err = http.ReadResponse(reader, nil)
  60. if err != nil {
  61. fmt.Println("HTTP problem")
  62. fmt.Println(err)
  63. os.Exit(1)
  64. }
  65. io.Copy(os.Stdout, response.Body)
  66. conn.Close()
  67. if resume && iters == 2 {
  68. fmt.Println("Attempting resumption")
  69. }
  70. }
  71. os.Exit(0)
  72. }