news 2026/5/15 4:58:14

linux测试quic-go

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
linux测试quic-go

代码和编译

下载git

yum install git

安装go

wget https://storage.googleapis.com/golang/go1.14.linux-amd64.tar.gz
(或者从https://golang.google.cn/dl/或者https://studygolang.com/dl下载)
tar -zxf go1.14.linux-amd64.tar.gz -C /usr/local/
在 /etc/profile 添加:

#go安装路径 export GOROOT=/usr/local/go #go代码的运行路径 export GOPATH=/home/test export PATH=$PATH:$GOROOT/bin

然后执行 source /etc/profile

也可以不安装go,直接运行其他环境上生成的二进制文件,
编译二进制文件:go build xxxx

下载quic-go代码

#老的路径是github.com/lucas-clemente/quic-go go get -v -t -u github.com/quic-go/quic-go

依赖库被墙:golang.org/x/下不下来,需要设置代理
推荐方法:
设置环境变量(~/.bashrc等)

export GO111MODULE=on export GOPROXY=https://goproxy.cn,direct

注:go1.13以上才支持这种方式,go version确定版本,低的话需要升级

如果go下载有问题可以使用git clone https://github.com/quic-go/quic-go.git
然后go build或者go run自动下载依赖库

提示错误:

error: RPC failed; curl 56 OpenSSL SSL_read: SSL_ERROR_SYSCALL, errno 10054 fatal: the remote end hung up unexpectedly fatal: early EOF fatal: index-pack failed

一般是本地缓存不够,可重新设置:

git config http.postBuffer 524288000

有时候直接重新下载也会成功。

证书和密钥

服务端代码example/main.go默认读取quic-go/internal/testdata下的cert.pem和priv.key;
客户端代码example/client/main.go默认加载系统ca证书。
客户端quic-go/internal/testdata下的根证书ca.pem需要加载到系统中,见客户端增加证书信任机构章节

查看证书内容:

openssl x509-incert.pem-text-noout

证书的域名如图所示:

使用localhost访问

如果是服务端和客户端都在本地,可以直接使用quic-go/internal/testdata下的ca和证书。
系统CA池在windows上可能获取不到,client可以修改为用局部pool(example/client/main.go):

pool, err := x509.SystemCertPool() 修改为 pool := testdata.NewCertPool()

制作证书(使用localhost访问不需要)

生成ca证书

internal/testdata下的ca证书没有配套的key,没办法颁发服务端证书,重新生成ca.pem和ca.key(可参考internal/testdata下的generate_key.sh):

openssl req-x509-sha256-nodes-days3650-newkeyrsa:2048\-keyoutca.key-outca.pem\-subj"/O=quic-go Certificate Authority/"

确定需要使用的域名,比如www.example.com,server的IP地址,比如172.2.202.17

颁发证书

1、编写配置文件

catexample.cnf[req]default_bits=2048distinguished_name=req_distinguished_name req_extensions=req_ext prompt=no[req_distinguished_name]countryName=CN stateOrProvinceName=Beijing localityName=Beijing organizationName=Example Inc commonName=example.com[req_ext]subjectAltName=@alt_names[alt_names]DNS.1=example.com DNS.2=www.example.com IP.1=192.168.1.8

2、CA颁发证书

openssl req -new -newkey rsa:2048 -nodes -keyout example.key -out example.csr -config example.cnf #使用刚才生成的ca.pem和ca.key颁发 openssl x509 -req -in example.csr -CA ca.pem -CAkey ca.key -CAcreateserial -out example.crt -days 365 -extensions req_ext -extfile example.cnf # 代码中使用的是cert.pem cp example.crt cert.pem

本地认证和寻址

修改客户端DNS(使用localhost可略过)

修改/etc/hosts
增加 172.2.202.17 www.example.com(本机测试用127.0.0.1)
重启网络服务或者重启linux:

sudosystemctl restart systemd-resolved

windows上hosts位置:c:/windows/system32/drivers/etc/hosts
修改后刷新ipconfig /flushdns
查看是否生效ipconfig /displaydns

修改服务端DNS

再hosts中增加:
0.0.0.0 example.com

客户端增加证书信任机构

Ubuntu

cp ca.crt /usr/local/share/ca-certificates(颁发机构证书) update-ca-certificates

centOS

cp cacert.crt /etc/ssl/certs/ update-ca-trust

编译go

若提示招不到某import包,先检查执行目录是否正确,一般需要在github.com/lucas-clemente/quic-go下执行,然后确定环境变量GOMOD是否正确,如:

"/home/mylib/src/github.com/lucas-clemente/quic-go/go.mod"

到代码目录下编译二进制文件(qui-go/example/):

go build -o server cd client go build -o client

老的go版本需要在quic-go下执行

go mod init go mod vendor

新的go版本如果提示依赖找不到可以执行go mod tidy

创建http数据

源码中给出了/demo/tile、/demo/tiles、/demo/echo等的http处理,客户端访问这几个url不需要特别处理
但如果直接获取/服务端默认返回index.html,需要自己创建文件

<html> <head> <title> </title> </head> <body> HELLO WORLD!! </body> </html>

请求具体数据test001.dat,可以随便加内容

证书加载

源码中默认放在lucas-clemente/quic-go/internal\testdata下,但源码中测试的域名是localhost,如果测试两台机器之间的连通性需要替换证书或者修改代码
可以使用openssl x509 -in cert.pem -text -noout查看证书内容:

服务端

server端修改example/main.go

err = server.ListenAndServeTLS("/home/test/httpd.crt", "/home/test/httpd.key")

注意:windows路径中不能使用\要使用\

或者把证书和私钥放到testdata下面,并替换掉原来的证书。

客户端

客户端主要是增加信任自己的根证书,代码逻辑是先加载系统的ca pool,然后添加testdata中的证书,所以把自制根证书加载在系统中或者替换到internal\testdata下都可以(名为ca.pem,crt转pem使用openssl命令)

linux把信任CA根证书加载到系统中:
Ubuntu

cp cacert.crt /usr/local/share/ca-certificates(颁发机构证书) update-ca-certificates

centOS

cp cacert.crt /etc/ssl/certs/ update-ca-trust

运行

go run /home/mylib/src/github.com/lucas-clemente/quic-go/example/main.go -bind example.com:4443 -www /home/test/ (index.html或者test001.dat路径)
go run /home/mylib/src/github.com/lucas-clemente/quic-go/example/client/main.go https://example.com:4443/test001.dat (要求服务端返回test001中数据)
go run /home/mylib/src/github.com/lucas-clemente/quic-go/example/client/main.go https://example.com:4443 (服务端默认返回index.html)

或者:

./server.exe -v true -qlog true ./client.exe -v true -qlog true https://localhost:6121/demo/tile https://localhost:6121/demo/tiles

注意:windows路径中不要使用\,一律换成\,比如 D:\test

###运行中的问题
服务端可打开 -v true查看具体信息
1、windows客户端提示crypto/x509: system root pool is not available on Windows
原因:x509.SystemCertPool()返回错误,具体原因为止
解决办法:修改main.go中先获取本机cert pool再添加测试ca根证书的逻辑,为先new一个pool,再添加ca根证书
pool, err := x509.SystemCertPool()
if err != nil {
log.Fatal(err)
}
testdata.AddRootCA(pool)
修改为:
pool := testdata.GetRootCA()

2、服务端提示 CRYPTO_ERROR: ALPN negotiation failed. Client offered: [“h3-27”]
客户端提示client Peer closed session with error: CRYPTO_ERROR: tls: no application protocol

原因:tls版本不一致
解决办法:两端更新github.com/marten-seemann/qtls到最新版本后解决。

3、http提示错误

Got response for https://www.example.com:4443: &http.Response{Status:"404 Not Found", StatusCode:404, Proto:"HTTP/3", ProtoMajor:3, ProtoMinor:0, Header:http.Header{"Content-Type":[]string{"text/plain; charset=utf-8"}, "X-Content-Type-Options":[]string{"nosniff"}}, Body:(*http3.body)(0xc000086240), ContentLength:0, TransferEncoding:[]string(nil), Close:false, Uncompressed:false, Trailer:http.Header(nil), Request:(*http.Request)(nil), TLS:(*tls.ConnectionState)(nil)} Request Body: 404 page not found client Closing session with error: Application error 0x100

原因一般是http文件(客户端请求的文件或者默认的index.html)找不到,可能是路径问题或者文件不存在。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/5/15 4:58:11

【案例分析】【软硬件结合:某单位基于储物柜的改造项目】

【软硬件结合&#xff1a;某单位基于储物柜的改造项目】1. 前言2. 项目约束3. 项目介绍3.1合同管理3.2 项目目标3.3项目计划3.4 项目需求3.5 管理平台业务 ![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/bb879a58f5e84f628f95ec5e177fc746.png)3.5 终端业务4. 项目总…

作者头像 李华
网站建设 2026/5/15 4:57:25

基于 HarmonyOS 6.0 的学习计划页面开发实战:构建高颜值跨端应用界面

基于 HarmonyOS 6.0 的学习计划页面开发实战&#xff1a;构建高颜值跨端应用界面 前言 随着 HarmonyOS 生态的不断完善&#xff0c;HarmonyOS 6.0 在跨端协同、分布式能力以及 ArkUI 声明式开发方面已经进入了一个更加成熟的阶段。相比传统移动端开发模式&#xff0c;HarmonyOS…

作者头像 李华
网站建设 2026/5/15 4:57:10

ARM架构FPSID寄存器详解与应用场景

1. ARM浮点系统ID寄存器(FPSID)概述在ARM架构的浮点运算单元(FPU)和Advanced SIMD扩展中&#xff0c;FPSID(Floating-Point System ID Register)是一个关键的识别寄存器。这个32位寄存器包含了实现者代码、子架构版本、部件编号等关键信息&#xff0c;相当于浮点单元的"身…

作者头像 李华
网站建设 2026/5/15 4:57:08

Godot 4动态网格形变插件:实现软体物理碰撞与实时形变

1. 项目概述&#xff1a;当物理碰撞遇上动态形变 如果你在Godot引擎里做过3D物理交互&#xff0c;大概率遇到过这个经典难题&#xff1a;一个刚体球砸向一个静态的网格模型&#xff0c;比如一个沙袋或者一个枕头&#xff0c;你期望看到它被砸出一个凹陷&#xff0c;但结果往往是…

作者头像 李华
网站建设 2026/5/15 4:53:10

终极Java代码重构指南:提升代码质量的10个实战技巧

终极Java代码重构指南&#xff1a;提升代码质量的10个实战技巧 【免费下载链接】CodeGuide :books: 本代码库是作者小傅哥多年从事一线互联网 Java 开发的学习历程技术汇总&#xff0c;旨在为大家提供一个清晰详细的学习教程&#xff0c;侧重点更倾向编写Java核心内容。如果本仓…

作者头像 李华
网站建设 2026/5/15 4:51:51

AI编程新范式:从Cursor工具使用到人机协同开发策略

1. 项目概述&#xff1a;从“光标使用”到高效编程的思维跃迁最近在开发者社区里&#xff0c;一个名为ofershap/cursor-usage的项目引起了我的注意。乍一看标题&#xff0c;你可能会觉得这只是一个关于如何操作 Cursor 这款 AI 代码编辑器的简单教程。但作为一名在编程一线摸爬…

作者头像 李华