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)
}
請考慮忘記命名接收者自己
(以及這個)。

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)
}
- 2 回答
- 0 關注
- 221 瀏覽