运维开发网

golang tls 似乎例子

运维开发网 https://www.qedev.com 2020-03-07 10:04 出处:网络 作者:运维开发网整理
Hi,  Can you help to figure out what's wrong with the following TLS test code?  It's just a echo server, the expected result is to get echo string from  server, but client always gets nothing.  client

Hi, 

Can you help to figure out what's wrong with the following TLS test code? 

It's just a echo server, the expected result is to get echo string from 

server, but client always gets nothing. 

client.go: 

=============================================================== 

package main 

import ( "fmt" ; "crypto/tls"; "os" ) 

func main() { 

        conn , err := tls.Dial("tcp", "127.0.0.1:8000", nil) 

        if err != nil { 

                fmt.Println("Fatal error ", err.String()) 

                os.Exit(1) 

        } 

        defer conn.Close() 

        state := conn.ConnectionState() 

        fmt.Println("handshaked: ", state.HandshakeComplete) 

        fmt.Println("NegotiatedProtocolIsMutual: ", 

state.NegotiatedProtocolIsMutual) 

        fmt.Println("local address: ", conn.LocalAddr()) 

        conn.Write([]byte("Hello")) 

        var retbuf []byte 

//        conn.SetReadTimeout(1000000) 

        n, error := conn.Read(retbuf) 

        fmt.Println(n, " bytes read from socket", error) 

        fmt.Println(string(retbuf)) 

=============================================================== 

server.go 

=============================================================== 

package main 

import ("fmt"; "os"; "crypto/tls"; "net"; "crypto/rand"; "time") 

func main() { 

        cert, err := 

tls.LoadX509KeyPair("/etc/ssl/certs/ssl-cert-snakeoil.pem", 

"/etc/ssl/private/ssl-cert-snakeoil.key") 

        //cert, err := tls.LoadX509KeyPair("jan.newmarch.name.pem", 

"private.pem") 

        checkError(err) 

        config := tls.Config {Certificates: []tls.Certificate {cert}} 

        now := time.Seconds() 

        config.Time = func() int64 { return now } 

        config.Rand = rand.Reader 

        service := "0.0.0.0:8000" 

        listener, err := tls.Listen("tcp", service, &config) 

        checkError(err) 

        fmt.Println("Listening") 

        for { 

                conn, err := listener.Accept() 

                if err != nil { 

                        fmt.Println(err.String()) 

                        continue 

                } 

                fmt.Println("Accepted") 

                //tlsConn := tls.Server(conn, &config) 

                go handleClient(conn) 

        } 

func handleClient(conn net.Conn) { 
        defer conn.Close() 

        var buf [512]byte 

        for { 

                fmt.Println("Trying to read") 

                n, err := conn.Read(buf[0:]) 

                if err != nil { 

                        return 

                } 

                fmt.Println(string(buf[0:100])) 

                _, err2 := conn.Write(buf[0:n]) 

                if err2 != nil { 

                        return 

                } 

                fmt.Println("Echo done") 

//                time.Sleep(5000000); 

        } 

func checkError(err os.Error) { 
        if err != nil { 
                fmt.Println("Fatal error ", err.String()) 
                os.Exit(1) 
        } 

====================================================== 

Use the following openssl test tool can always get correct result. 

openssl s_client -tls1 -connect localhost:8000 

Thanks, 

-Jon. 

jon....@gmail.com 

0

精彩评论

暂无评论...
验证码 换一张
取 消