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.pem và priv.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 đó.