1 package main
2
3 import (
4 "net"
5 "sync"
6 "crypto/rand"
7 "crypto/tls"
8 "log"
9 "encoding/json"
10 )
11
12
13 func
14 main() {
15
16 cert, err := tls.LoadX509KeyPair( "OreOre.pem", "OreOre.pem" )
17 if err != nil { log.Fatalf( "LoadX509KeyPair:%v", err ) }
18 config := &tls.Config{
19 Certificates: []tls.Certificate{ cert },
20 ClientAuth: tls.VerifyClientCertIfGiven,
21 ServerName: "example.com",
22 Rand: rand.Reader,
23 }
24
25 connections := map[ net.Conn ] interface{} {}
26 mutex := sync.RWMutex{}
27
28 broadcaster := make( chan interface{} )
29 go func() {
30 for {
31 data, _ := json.Marshal( <- broadcaster )
32 mutex.RLock()
33 conns := connections
34 mutex.RUnlock()
35 for conn, _ := range conns { conn.Write( data ) }
36 }
37 }()
38
39 listener, _ := tls.Listen( "tcp", ":6666", config )
40 defer listener.Close()
41 for {
42 conn, _ := listener.Accept()
43 mutex.Lock()
44 connections[ conn ] = ""
45 mutex.Unlock()
46 go func() {
47 decoder := json.NewDecoder( conn )
48 for {
49 var w interface{}
50 err := decoder.Decode( &w )
51 if err != nil { break }
52 broadcaster <- w
53 }
54 mutex.Lock()
55 delete( connections, conn )
56 mutex.Unlock()
57 conn.Close()
58 }()
59 }
60 }
証明書がオレオレなので openssl で検証。
openssl s_client -tls1 -connect localhost:6666