• 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 Saturn Saturn on Wed 24 Dec 2014 at 22:17 with 0 comments

ruby>>
package main

import (
"net"
"sync"
"crypto/rand"
"crypto/tls"
"log"
"encoding/json"
)

func
main() {

cert, err := tls.LoadX509KeyPair( "OreOre.pem", "OreOre.pem" )
if err != nil { log.Fatalf( "LoadX509KeyPair:%v", err ) }
config := &tls.Config{
	Certificates: []tls.Certificate{ cert }, 
	ClientAuth: tls.VerifyClientCertIfGiven, 
	ServerName: "example.com",
	Rand:	rand.Reader,
}

connections := map[ net.Conn ] interface{} {}
mutex := sync.RWMutex{}

broadcaster := make( chan interface{} )
go func() {
	for {
		data, _ := json.Marshal( <- broadcaster )
		mutex.RLock()
		conns := connections
		mutex.RUnlock()
		for conn, _ := range conns { conn.Write( data ) }
	}
}()

listener, _ := tls.Listen( "tcp", ":6666", config )
defer listener.Close()
for {
	conn, _ := listener.Accept()
	mutex.Lock()
	connections[ conn ] = ""
	mutex.Unlock()
	go func() {
		decoder := json.NewDecoder( conn )
		for {
			var	w interface{}
			err := decoder.Decode( &w )
			if err != nil { break }
			broadcaster <- w 
		}
		mutex.Lock()
		delete( connections, conn )
		mutex.Unlock()
		conn.Close()
	}()
}

}
<<--

証明書がオレオレなので openssl で検証。

openssl s_client -tls1 -connect localhost:6666

posted by Saturn Saturn on Wed 24 Dec 2014 at 22:09 with 0 comments

ruby>>
package main

import (
"net"
"sync"
"encoding/json"
)

func
main() {

connections := map[ net.Conn ] interface{} {}
mutex := sync.RWMutex{}

broadcaster := make( chan interface{} )
go func() {
	for {
		data, _ := json.Marshal( <- broadcaster )
		mutex.RLock()
		conns := connections
		mutex.RUnlock()
		for conn, _ := range conns { conn.Write( data ) }
	}
}()

listener, _ := net.Listen( "tcp", ":6666" )
defer listener.Close()
for {
	conn, _ := listener.Accept()
	mutex.Lock()
	connections[ conn ] = ""
	mutex.Unlock()
	go func() {
		decoder := json.NewDecoder( conn )
		for {
			var	w interface{}
			err := decoder.Decode( &w )
			if err != nil { break }
			broadcaster <- w
		}
		mutex.Lock()
		delete( connections, conn )
		mutex.Unlock()
		conn.Close()
	}()
}

}
<<--

posted by Saturn Saturn on Wed 24 Dec 2014 at 22:07 with 0 comments