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。 -->