为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

Go
叮当猫咪 2022-10-04 16:50:52
我有以下代码: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.Connerr = c.(*tls.Conn).Handshake()dieIf(err)有什么想法吗?
查看完整描述

2 回答

?
小唯快跑啊

TA贡献1863条经验 获得超2个赞

package main


import "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)

}

请考虑忘记命名接收者自己(以及这个)。


查看完整回答
反对 回复 2022-10-04
?
慕桂英3389331

TA贡献2036条经验 获得超8个赞

在大多数情况下,@kostix的答案就足够了,但是如果要拦截 的读取和写入,则需要将包装器注入一个级别。tls.Conn.Handshake()mitmConn


下面是一个工作示例:


package main


import "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)

}


查看完整回答
反对 回复 2022-10-04
  • 2 回答
  • 0 关注
  • 244 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号