Last active
June 8, 2016 17:39
-
-
Save mediocregopher/9ba5a0fbfcfc60592fcc3cd4a25a857d to your computer and use it in GitHub Desktop.
Example of a TLS echo server and client which also use the PROXY protocol
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
package main | |
import ( | |
"crypto/tls" | |
"fmt" | |
"io" | |
"log" | |
"net" | |
"os" | |
) | |
func main() { | |
c, err := net.Dial("tcp", "127.0.0.1:9000") | |
if err != nil { | |
log.Fatal(err) | |
} | |
fmt.Fprint(c, "PROXY TCP4 8.8.8.8 127.0.0.1 45535 443\r\n") | |
tc := tls.Client(c, &tls.Config{ | |
ServerName: "example.com", | |
InsecureSkipVerify: true, | |
}) | |
go io.Copy(tc, os.Stdin) | |
io.Copy(os.Stdout, tc) | |
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
package main | |
import ( | |
"crypto/tls" | |
"io" | |
"log" | |
"net" | |
"github.com/armon/go-proxyproto" | |
) | |
func main() { | |
log.Print("creating raw listen") | |
netln, err := net.Listen("tcp", ":9000") | |
if err != nil { | |
log.Fatal(err) | |
} | |
log.Print("wrapping listen in proxy proto") | |
netln = &proxyproto.Listener{Listener: netln} | |
log.Print("loading cert") | |
cert, err := tls.X509KeyPair([]byte(dummyCert), []byte(dummyKey)) | |
if err != nil { | |
log.Fatal(err) | |
} | |
tlsconf := &tls.Config{ | |
Certificates: []tls.Certificate{cert}, | |
} | |
tlsconf.BuildNameToCertificate() | |
log.Print("wrapping listen in tls") | |
netln = tls.NewListener(netln, tlsconf) | |
log.Print("listening") | |
for { | |
c, err := netln.Accept() | |
if err != nil { | |
log.Fatal(err) | |
} | |
log.Printf("got conn from: %s", c.RemoteAddr().String()) | |
go func() { | |
io.Copy(c, c) | |
}() | |
} | |
} | |
// dummyCert/Key are self-signed for example.com. They're more or less useless | |
// outside of testing | |
var dummyCert = ` | |
-----BEGIN CERTIFICATE----- | |
MIID0TCCArmgAwIBAgIJAONFEUkqT73SMA0GCSqGSIb3DQEBCwUAMH8xCzAJBgNV | |
BAYTAlVTMQswCQYDVQQIDAJGTDEUMBIGA1UEBwwLR2FpbmVzdmlsbGUxEzARBgNV | |
BAoMCkxldmVuIExhYnMxFDASBgNVBAMMC2V4YW1wbGUuY29tMSIwIAYJKoZIhvcN | |
AQkBFhNicmlhbkBsZXZlbmxhYnMuY29tMB4XDTE1MTAxMzIwNDc1OFoXDTE1MTEx | |
MjIwNDc1OFowfzELMAkGA1UEBhMCVVMxCzAJBgNVBAgMAkZMMRQwEgYDVQQHDAtH | |
YWluZXN2aWxsZTETMBEGA1UECgwKTGV2ZW4gTGFiczEUMBIGA1UEAwwLZXhhbXBs | |
ZS5jb20xIjAgBgkqhkiG9w0BCQEWE2JyaWFuQGxldmVubGFicy5jb20wggEiMA0G | |
CSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCl/Rt1cYSpaJsx1ASXcOyKmU1YhVk3 | |
Tz8QFKl57OgLSkykstMLz6+GLD667fakU+Z3m0n5cckQfcExhV3ly40ruVrDSfFw | |
y4mkvRaGBHVet4S+3VsQjQRFG/j8QXT7gnS5xh8ntdjd+fU5XLJDWKNkP+V8wDyQ | |
LtQWMg93KmEXJ3mq6efAeocraJScjWBWe0N0C4pBCFWj6AdtIeuT1rmjFXD14lag | |
eFsZEMgRodp9gAuWoTCNeLYlSGE3Xvy+jIHiALjMKygdyIwv2Hm69p0LP1p3o6Ag | |
pwJElZDEyvwLB6IyGaAWOpYGdJwtwOaHjj9Py7//hIZg2v/0kbsDC6ttAgMBAAGj | |
UDBOMB0GA1UdDgQWBBR9Q5dIdPSesnnzx/x49sDz2CdBfDAfBgNVHSMEGDAWgBR9 | |
Q5dIdPSesnnzx/x49sDz2CdBfDAMBgNVHRMEBTADAQH/MA0GCSqGSIb3DQEBCwUA | |
A4IBAQB3KbsiGKsMsLqL4x8E8rVHKGj4S01GkNCg9IO9pHQK4WxyGAT4tcn5VKj7 | |
YYsltiFlrsFwZTBriX+scntdlXAPgKW5JmV9mzuSbyRxL9aTLK9eQcIrwnEscPFz | |
dKjT57dvYGfgiuO2ScRgN6J4efrgmuTC8XoSovDGzvp9q2KhirITBDCxc4mbH6lv | |
sASSXabAYFYwMlMUtnL735pdgDkIjrl9sOb7LRUCsewaSRFOUlDvXRb++n/5f3LC | |
EL6G06gkl38TD0mchfJws7xlmhECkWRAIABDW4vE3Dolmgl5l/DEH3r3wmieE+lG | |
m7sKABXDdq4ML32CBswghUGSvt21 | |
-----END CERTIFICATE-----` | |
var dummyKey = ` | |
-----BEGIN PRIVATE KEY----- | |
MIIEvgIBADANBgkqhkiG9w0BAQEFAASCBKgwggSkAgEAAoIBAQCl/Rt1cYSpaJsx | |
1ASXcOyKmU1YhVk3Tz8QFKl57OgLSkykstMLz6+GLD667fakU+Z3m0n5cckQfcEx | |
hV3ly40ruVrDSfFwy4mkvRaGBHVet4S+3VsQjQRFG/j8QXT7gnS5xh8ntdjd+fU5 | |
XLJDWKNkP+V8wDyQLtQWMg93KmEXJ3mq6efAeocraJScjWBWe0N0C4pBCFWj6Adt | |
IeuT1rmjFXD14lageFsZEMgRodp9gAuWoTCNeLYlSGE3Xvy+jIHiALjMKygdyIwv | |
2Hm69p0LP1p3o6AgpwJElZDEyvwLB6IyGaAWOpYGdJwtwOaHjj9Py7//hIZg2v/0 | |
kbsDC6ttAgMBAAECggEBAJEtVx7ZMpaZD2P9dCagdcKjYqrRtr5RaW6/I5uoQSve | |
yDokzcG+3F4VxKfqCZagayqhf4nUo27xDlApvX6HEen0LBYyTiHBY5naaCC/NYiq | |
KkhlgohvThTD6nl3JsHzz/PL/OPWgN9lB74r/R46IG5GFImP+WiCDK19C1nGjzSX | |
wY+D32Dna3grASpMRzEHKy7h+KFwU6o7IZlOITc/z7to397bkRI1A0lB+y7GGyqA | |
0v3CJptNrk9M6YvephBbPl8tg26ozzah7aNnmsP176K2e+pNaY5WYwOJlD7zkOPW | |
RJfdzxP7QefdIqYI6H3sHJPIWmiINa0sbNKq9Nq2mgECgYEAz+12RSif38IAJEJg | |
i+ghWfpzk1/U0Z9yJ/0yH2s1iFd+50dMbNviTb132KdT9VRCYqcC1vpGcvri9WUp | |
5DXSJt2zk4q/fla6illo3p7b4gq3yE8yORIvB7E/5tMP7so5OrnNfsqTRAB8yW5i | |
1BKOwC3DWIbsEJXypknO0WohKfECgYEAzF1sR6QUMbiyraPTEkEyYG0jBlXRM6ak | |
Dbj37rh4kq3E73nMVEBA66xAINNOh5VgHTSNksnzOpF/EixHqpmDzXuDMTTKCJr+ | |
1sKVM4PJm+or5VUG8qttbsInt44C3kWZBdSKIABTcAWdc+hwsZCGU92EkkVP+Tdo | |
bkBKCuhKfT0CgYAyptlB3bSckKjyLE1Sp7jAL5fKFfVFH39yqGZ2aup+jTn341GF | |
z0bgw0AXwiNcxyro12CEuDFDP0TcnMlIs6e/GhDt50Xg5AXLQB6g5LgR56R/onNM | |
ndZhHFfBxjbCZ/brDGo38edQEIJVm5NtsBugS0WkIjINlEmpIp/EOgNcMQKBgGcJ | |
CxirnwrahiuJl1dyy4VWQPxmtA0IjVnl0grnstKxDcN3cw9fPdwUgliKcONm6oiP | |
AHnrm9gBl0GAVbmroIovJZvfc6UXEDkS7cqFPVaAoBUF43Th/VCETyX6UXPjPx1z | |
ZRhxUZ//FL1libvck/0giEB+9a0+xEYh37LUHwo5AoGBAIKukJP3W1MV57niKzF6 | |
VvG61PXboy/rpfZRnY+EU8wVi/r8eOqHAzSNEGTuSuZl84KKaL7KGU16HPuXXkZT | |
+zpNS1z4fBA34czW2m16C3mgWFxeWzuqPC5mOnw8Jg5DjcX4TOBt5NGnXejl0fmV | |
IGNFn+7hm2PmDzXt3gRWIfBf | |
-----END PRIVATE KEY-----` |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment