github.com/JimmyHuang454/JLS-go@v0.0.0-20230831150107-90d536585ba0/readme.md (about) 1 # JLS-go 2 3 本仓库完整实现 JLS 第 3 版本。 4 5 ## 其他实现 6 7 [vincentliu77/rustls-jls](https://github.com/vincentliu77/rustls-jls) 8 9 [vincentliu77/quinn-jls](https://github.com/vincentliu77/quinn-jls)(推荐,支持 QUIC) 10 11 ## 用法 12 13 跟`crypto/tls`标准库一样,但多了一些选项。 14 15 选项中可以自定义是否开启 0-RTT(默认关闭),比如说需要 QUIC 的 0-RTT,那么可以设置 SessionTicketsDisabled 为 false。需要特别注意,0-RTT 具有安全问题,不保证前向安全,不保证不会被重放攻击和特征识别,优点就是加上 QUIC 传输层,延迟很低,而且数据是无法被解密。 16 17 ### Client 18 19 ```go 20 import ( 21 "github.com/JimmyHuang454/JLS-go/tls" 22 ) 23 24 conn, err := tls.Dial("tcp", "127.0.0.1:443", 25 &tls.Config{InsecureSkipVerify: false, 26 ServerName: "abc.com", // 伪装域名 27 UseJLS: true, JLSPWD: []byte("密码"), JLSIV: []byte("随机数")}) 28 if err != nil{ 29 return; 30 } 31 defer conn.Close() 32 n, _ := conn.Read(buffer) 33 ``` 34 35 ### Server 36 37 ```go 38 import ( 39 "github.com/JimmyHuang454/JLS-go/tls" 40 ) 41 42 var certPem = []byte(`-----BEGIN CERTIFICATE----- 43 MIIBhTCCASugAwIBAgIQIRi6zePL6mKjOipn+dNuaTAKBggqhkjOPQQDAjASMRAw 44 DgYDVQQKEwdBY21lIENvMB4XDTE3MTAyMDE5NDMwNloXDTE4MTAyMDE5NDMwNlow 45 EjEQMA4GA1UEChMHQWNtZSBDbzBZMBMGByqGSM49AgEGCCqGSM49AwEHA0IABD0d 46 7VNhbWvZLWPuj/RtHFjvtJBEwOkhbN/BnnE8rnZR8+sbwnc/KhCk3FhnpHZnQz7B 47 5aETbbIgmuvewdjvSBSjYzBhMA4GA1UdDwEB/wQEAwICpDATBgNVHSUEDDAKBggr 48 BgEFBQcDATAPBgNVHRMBAf8EBTADAQH/MCkGA1UdEQQiMCCCDmxvY2FsaG9zdDo1 49 NDUzgg4xMjcuMC4wLjE6NTQ1MzAKBggqhkjOPQQDAgNIADBFAiEA2zpJEPQyz6/l 50 Wf86aX6PepsntZv2GYlA5UpabfT2EZICICpJ5h/iI+i341gBmLiAFQOyTDT+/wQc 51 6MF9+Yw1Yy0t 52 -----END CERTIFICATE-----`) 53 54 var keyPem = []byte(`-----BEGIN EC PRIVATE KEY----- 55 MHcCAQEEIIrYSSNQFaA2Hwf1duRSxKtLYX5CB04fSeQ6tF1aY/PuoAoGCCqGSM49 56 AwEHoUQDQgAEPR3tU2Fta9ktY+6P9G0cWO+0kETA6SFs38GecTyudlHz6xvCdz8q 57 EKTcWGekdmdDPsHloRNtsiCa697B2O9IFA== 58 -----END EC PRIVATE KEY-----`) 59 60 // 证书可以自己随便自签一个 61 cert, err := tls.X509KeyPair(certPem, keyPem) 62 assert.Nil(t, err) 63 cfg := &tls.Config{Certificates: []tls.Certificate{cert}, 64 ServerName: "abc.com", // 伪装站 65 UseJLS: true, JLSPWD: []byte("密码"), JLSIV: []byte("随机数")} 66 67 listener, err := tls.Listen("tcp", ":443", cfg) 68 assert.Nil(t, err) 69 70 inClient, err := listener.Accept() 71 if err == nil { 72 buf := make([]byte, 200) 73 _, err = inClient.Read(buf) 74 inClient.Close() 75 } 76 ``` 77 78 更多用法,参考 [测试用例](https://github.com/JimmyHuang454/JLS-go/tree/master/test) 79 80 <!-- ### QUIC --> 81 <!-- JLS 是支持 QUIC 的,因为 JLS 不依赖 SessionID,而 QUIC 对 TLS 中的 SessionID 有要求。以前的 crypto/tls 是不支持 0-RTT,所以 quic-go 是创建了 crypto/tls 的分支 qtls,以实现 quic 的 0-RTT,最近(2023 年)crypto/tls 加入了 0-RTT,但目前 quic-go 还在使用自己的 qtls。 -->