Triển khai và kiểm thử giao thức QUIC với thư viện quic-go trên môi trường Linux

Chuẩn bị môi trường hệ thống

Để bắt đầu thử nghiệm giao thức QUIC, bạn cần cài đặt Git và ngôn ngữ lập trình Go. Dưới đây là các bước thiết lập cơ bản trên Linux.

Cài đặt Git và Go

Sử dụng trình quản lý gói để cài đặt Git:

yum install git -y

Tải xuống và cài đặt Go (khuyến nghị phiên bản mới để hỗ trợ đầy đủ các tính năng của QUIC):

curl -OL https://golang.org/dl/go1.21.0.linux-amd64.tar.gz
tar -C /usr/local -xzf go1.21.0.linux-amd64.tar.gz

Thiết lập biến môi trường trong tệp /etc/profile hoặc ~/.bashrc:

export GOROOT=/usr/local/go
export GOPATH=/home/dev/go_workspace
export PATH=$PATH:$GOROOT/bin:$GOPATH/bin

Kích hoạt cấu hình mới: source /etc/profile

Tải mã nguồn và xử lý phụ thuộc

Thư viện quic-go yêu cầu các module phụ thuộc. Do một số hạn chế về mạng, bạn nên sử dụng Proxy để tải các gói từ golang.org/x/.

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

git clone https://github.com/quic-go/quic-go.git
cd quic-go

Nếu gặp lỗi bộ nhớ đệm Git khi clone (lỗi RPC), hãy tăng kích thước http.postBuffer:

git config --global http.postBuffer 524288000

Quản lý Chứng chỉ số (Certificates)

Mặc định, ví dụ của quic-go tìm kiếm tệp cert.pempriv.key. Để kiểm thử giữa các máy chủ khác nhau, chúng ta cần tạo chứng chỉ tự ký riêng.

Tạo Certificate Authority (CA) nội bộ

openssl req -x509 -sha256 -nodes -days 3650 -newkey rsa:2048 \
  -keyout internal_ca.key -out internal_ca.pem \
  -subj "/O=QUIC Test Authority/"

Cấu hình và cấp phát chứng chỉ cho Server

Tạo tệp cấu hình server_ext.cnf để định nghĩa tên miền và IP:

[req]
distinguished_name = req_distinguished_name
req_extensions = v3_req
prompt = no

[req_distinguished_name]
CN = myquic.local

[v3_req]
subjectAltName = @alt_names

[alt_names]
DNS.1 = myquic.local
IP.1 = 192.168.1.10

Tiến hành ký chứng chỉ:

openssl req -new -newkey rsa:2048 -nodes -keyout server.key -out server.csr -config server_ext.cnf
openssl x509 -req -in server.csr -CA internal_ca.pem -CAkey internal_ca.key -CAcreateserial \
  -out server.crt -days 365 -extensions v3_req -extfile server_ext.cnf

Cấu hình hệ thống và Tin cậy chứng chỉ

Ánh xạ tên miền

Chỉnh sửa tệp /etc/hosts trên cả máy khách và máy chủ để nhận diện tên miền:

192.168.1.10 myquic.local

Thêm CA vào hệ thống tin cậy

Để Client không báo lỗi bảo mật khi kết nối, hãy thêm CA vào kho lưu trữ của hệ điều hành.

Ubuntu/Debian:

sudo cp internal_ca.pem /usr/local/share/ca-certificates/internal_ca.crt
sudo update-ca-certificates

CentOS/RHEL:

sudo cp internal_ca.pem /etc/pki/ca-trust/source/anchors/
sudo update-ca-trust extract

Biên dịch và Chạy ứng dụng

Di chuyển vào thư mục ví dụ của quic-go để build các tệp thực thi:

# Build Server
cd example
go build -o quic_server main.go

# Build Client
cd client
go build -o quic_client main.go

Chạy máy chủ với tệp dữ liệu tĩnh:

./quic_server -bind myquic.local:4443 -www /home/dev/www_root/

Chạy máy khách để gửi yêu cầu:

./quic_client https://myquic.local:4443/index.html

Xử lý các vấn đề thường gặp

Lỗi ALPN Negotiation

Nếu bạn nhận được thông báo CRYPTO_ERROR: ALPN negotiation failed, nguyên nhân thường do sự không tương thích giữa các phiên bản giao thức TLS được hỗ trợ. Hãy đảm bảo cả hai phía đều cập nhật thư viện qtls hoặc sử dụng cùng một phiên bản quic-go.

Vấn đề chứng chỉ trên Windows

Nếu chạy Client trên Windows và gặp lỗi system root pool is not available, bạn cần thay đổi cách khởi tạo CertPool trong mã nguồn:

// Thay thế logic mặc định
// certPool, err := x509.SystemCertPool()
// Sử dụng pool từ testdata trực tiếp
certPool := testdata.GetRootCA()

Lỗi 404 Not Found

Khi Server phản hồi 404, hãy kiểm tra lại đường dẫn được truyền vào tham số -www. Đảm bảo tệp tin yêu cầu tồn tại và ứng dụng có quyền đọc thư mục đó.

Thẻ: quic-go quic linux openssl golang

Đăng vào ngày 31 tháng 7 lúc 01:07