本仓库完整实现 JLS 第 3 版本。
vincentliu77/quinn-jls(推荐,支持 QUIC)
跟crypto/tls
标准库一样,但多了一些选项。
选项中可以自定义是否开启 0-RTT(默认关闭),比如说需要 QUIC 的 0-RTT,那么可以设置 SessionTicketsDisabled 为 false。需要特别注意,0-RTT 具有安全问题,不保证前向安全,不保证不会被重放攻击和特征识别,优点就是加上 QUIC 传输层,延迟很低,而且数据是无法被解密。
import (
"github.com/JimmyHuang454/JLS-go/tls"
)
conn, err := tls.Dial("tcp", "127.0.0.1:443",
&tls.Config{InsecureSkipVerify: false,
ServerName: "abc.com", // 伪装域名
UseJLS: true, JLSPWD: []byte("密码"), JLSIV: []byte("随机数")})
if err != nil{
return;
}
defer conn.Close()
n, _ := conn.Read(buffer)
import (
"github.com/JimmyHuang454/JLS-go/tls"
)
var certPem = []byte(`-----BEGIN CERTIFICATE-----
MIIBhTCCASugAwIBAgIQIRi6zePL6mKjOipn+dNuaTAKBggqhkjOPQQDAjASMRAw
DgYDVQQKEwdBY21lIENvMB4XDTE3MTAyMDE5NDMwNloXDTE4MTAyMDE5NDMwNlow
EjEQMA4GA1UEChMHQWNtZSBDbzBZMBMGByqGSM49AgEGCCqGSM49AwEHA0IABD0d
7VNhbWvZLWPuj/RtHFjvtJBEwOkhbN/BnnE8rnZR8+sbwnc/KhCk3FhnpHZnQz7B
5aETbbIgmuvewdjvSBSjYzBhMA4GA1UdDwEB/wQEAwICpDATBgNVHSUEDDAKBggr
BgEFBQcDATAPBgNVHRMBAf8EBTADAQH/MCkGA1UdEQQiMCCCDmxvY2FsaG9zdDo1
NDUzgg4xMjcuMC4wLjE6NTQ1MzAKBggqhkjOPQQDAgNIADBFAiEA2zpJEPQyz6/l
Wf86aX6PepsntZv2GYlA5UpabfT2EZICICpJ5h/iI+i341gBmLiAFQOyTDT+/wQc
6MF9+Yw1Yy0t
-----END CERTIFICATE-----`)
var keyPem = []byte(`-----BEGIN EC PRIVATE KEY-----
MHcCAQEEIIrYSSNQFaA2Hwf1duRSxKtLYX5CB04fSeQ6tF1aY/PuoAoGCCqGSM49
AwEHoUQDQgAEPR3tU2Fta9ktY+6P9G0cWO+0kETA6SFs38GecTyudlHz6xvCdz8q
EKTcWGekdmdDPsHloRNtsiCa697B2O9IFA==
-----END EC PRIVATE KEY-----`)
// 证书可以自己随便自签一个
cert, err := tls.X509KeyPair(certPem, keyPem)
assert.Nil(t, err)
cfg := &tls.Config{Certificates: []tls.Certificate{cert},
ServerName: "abc.com", // 伪装站
UseJLS: true, JLSPWD: []byte("密码"), JLSIV: []byte("随机数")}
listener, err := tls.Listen("tcp", ":443", cfg)
assert.Nil(t, err)
inClient, err := listener.Accept()
if err == nil {
buf := make([]byte, 200)
_, err = inClient.Read(buf)
inClient.Close()
}
更多用法,参考 测试用例