拦截 tls。康恩的读取()和写入(),同时保留 tls。康恩功能

我有以下代码:


l, err := tls.Listen("tcp", "localhost:0", cfg)

dieIf(err)

c, err := l.Accept()

dieIf(err)

err = c.(*tls.Conn).Handshake()

dieIf(err)

它工作得很好,但我想拦截 的读取和写入。tls.Conn


我想过这样做:


type MitmConn struct {

  net.Conn

}


func (self *MitmConn) Read(b []byte) (n int, err error) {

  ...

}


func (self *MitmConn) Write(b []byte) (n int, err error) {

  ...

}


l, err := tls.Listen("tcp", "localhost:0", cfg)

dieIf(err)

c, err := l.Accept()

dieIf(err)

c = &MitmConn{c}

但是,这将失败:


// panic: interface conversion: net.Conn is *MitmConn, not *tls.Conn

err = c.(*tls.Conn).Handshake()

dieIf(err)

有什么想法吗?


叮当猫咪
浏览 245回答 2
2回答

小唯快跑啊

package mainimport "crypto/tls"func dieIf(err error) {    if err != nil {        panic(err)    }}type mitmConn struct {    *tls.Conn}func (mc *mitmConn) Read(b []byte) (n int, err error) {  return 0, nil}func (mc *mitmConn) Write(b []byte) (n int, err error) {  return 0, nil}func main() {    l, err := tls.Listen("tcp", "localhost:0", nil)    dieIf(err)    c, err := l.Accept()    dieIf(err)    mc := mitmConn{c.(*tls.Conn)}    err = mc.Handshake()    dieIf(err)}请考虑忘记命名接收者自己(以及这个)。

慕桂英3389331

在大多数情况下,@kostix的答案就足够了,但是如果要拦截 的读取和写入,则需要将包装器注入一个级别。tls.Conn.Handshake()mitmConn下面是一个工作示例:package mainimport "crypto/tls"func dieIf(err error) {    if err != nil {        panic(err)    }}type mitmConn struct {    // Since we went one level beneath, no need for *tls.Conn here    net.Conn}func (mc *mitmConn) Read(b []byte) (n int, err error) {  return 0, nil}func (mc *mitmConn) Write(b []byte) (n int, err error) {  return 0, nil}func main() {    // Don't use tls.Listen    l, err := net.Listen("tcp", "localhost:0")    dieIf(err)    c, err := l.Accept()    dieIf(err)    // Make a new tls.Conn.     // After the tls.Server() call, the nesting of Conn     // objects looks will be:    // - *tls.Conn    //  - mitmConn    //   - *net.TCPConn    c = tls.Server(mitmConn{c}, nil)    // Since tls.Server returns a net.Conn, not a *tls.Conn, we need to cast    err = c.(*tls.Conn).Handshake()    dieIf(err)}
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go