• 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31

   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

posted by Face Saturn on Wed 24 Dec 2014 at 22:09

Comments:

or Preview
Social Bookmarks
  • Delicious
  • B_entry2379
  • Clip_16_12_w
Services from s21g
twpro(ツイプロ)
Twitterプロフィールを快適検索
地価2009
土地の値段を調べてみよう
MyRestaurant
自分だけのレストラン手帳
Formula
ブログに数式を埋め込める数式コミュニティ