CONNECT туннелийг Go-ийн SMTP клиентэд шилжүүлэх
Аль хэдийн үүссэн туннельтэй smtp.NewClient ашиглаж, SMTP хост нэр болон STARTTLS гар барилтыг прокси тохиргооноос тусад нь байлгаарай.
smtp.Dial өөрийн хаяг руу шинэ холболт нээдэг. HTTP CONNECT проксигоор холболт авсны дараа тэр байгаа урсгалыг оронд нь smtp.NewClient-д дамжуулна.
Илгээх порт дээрээ STARTTLS шаарддаг SMTP серверийн хувьд шилжүүлэлт дараах байдалтай байж болно:
func smtpOverTunnel(conn net.Conn, mailHost string) (*smtp.Client, error) {
client, err := smtp.NewClient(conn, mailHost)
if err != nil {
conn.Close()
return nil, err
}
err = client.StartTLS(&tls.Config{
ServerName: mailHost,
MinVersion: tls.VersionTLS12,
})
if err != nil {
client.Close()
return nil, err
}
return client, nil
}Багцууд нь net, net/smtp болон crypto/tls юм. Дуудагч нь зорьсон SMTP хост болон порттой аль хэдийн холбогдсон туннелийг өгдөг, проксийн CONNECT солилцоо дууссан. Прокси руу зөвхөн TCP нээх нь хангалтгүй: HTTP хариу бол SMTP мэндчилгээ биш.
mailHost нь SMTP серверийн хост нэр, портгүй. Тэр таних тэмдгийг SMTP баталгаажуулалт болон гэрчилгээ шалгахад хадгална. HTTPS прокси руу TLS холболт нь маршрутын өөр хэсгийг хамгаална.
Буцаасан клиент нь програмын одоогийн SMTP баталгаажуулалт болон шуудангийн гүйлгээнд бэлэн байна. Дуусмагц хаа. Залгах, CONNECT болон дараагийн протоколын үйлдлүүдийг програмын хугацааны бодлогоор хязгаарла.
Прокси нь сонгосон шуудангийн порт руу CONNECT зөвшөөрөх ёстой. Зарим нь үүнийг 443 порт дээрх HTTPS очих газарт хязгаарладаг. Далд TLS-тэй SMTP-ийн хувьд STARTTLS гаргахын оронд NewClient дуудахаас өмнө очих газрын TLS сессийг үүсгэ.