• 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

キーチェーンアクセス -> 証明書アシスタント -> 証明書を作成

OreOre.tiff

できた証明書を p12 で書き出し。

openssl pkcs12 -in OreOre.p12 -nodes -out OreOre.pem

でパスワードがついていない pem を作成。 この中に証明書も鍵も入っているので、tls.LoadX509KeyPair の引数は両方とも "OreOre.pem" で大丈夫。

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

   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

   1  package main
   2   
   3  import (
   4  	"net"
   5  	"sync"
   6  	"encoding/json"
   7  )
   8   
   9  func
  10  main() {
  11  
  12  	connections := map[ net.Conn ] interface{} {}
  13  	mutex := sync.RWMutex{}
  14  
  15  	broadcaster := make( chan interface{} )
  16  	go func() {
  17  		for {
  18  			data, _ := json.Marshal( <- broadcaster )
  19  			mutex.RLock()
  20  			conns := connections
  21  			mutex.RUnlock()
  22  			for conn, _ := range conns { conn.Write( data ) }
  23  		}
  24  	}()
  25  
  26  	listener, _ := net.Listen( "tcp", ":6666" )
  27  	defer listener.Close()
  28  	for {
  29  		conn, _ := listener.Accept()
  30  		mutex.Lock()
  31  		connections[ conn ] = ""
  32  		mutex.Unlock()
  33  		go func() {
  34  			decoder := json.NewDecoder( conn )
  35  			for {
  36  				var	w interface{}
  37  				err := decoder.Decode( &w )
  38  				if err != nil { break }
  39  				broadcaster <- w
  40  			}
  41  			mutex.Lock()
  42  			delete( connections, conn )
  43  			mutex.Unlock()
  44  			conn.Close()
  45  		}()
  46  	}
  47  }

posted by Face Saturn on Wed 24 Dec 2014 at 22:07
Contents
OreOre.pem の作り方
JSON Chat Server Skelton in GoLang TLS Ver.
JSON Chat Server Skelton in GoLang
Services from s21g
twpro(ツイプロ)
Twitterプロフィールを快適検索
地価2009
土地の値段を調べてみよう
MyRestaurant
自分だけのレストラン手帳
Formula
ブログに数式を埋め込める数式コミュニティ