Khái niệm cơ bản về thuật toán kháng lượng tử (PQC)
Trước khi bắt tay vào cấu hình, bạn cần hiểu rõ ba họ thuật toán chính mà chúng ta sẽ tích hợp vào OpenSSL thông qua module OQS-provider (Open Quantum Safe).
Kyber (ML-KEM): Đây là thuật toán dùng cho mã hóa khóa công khai (Key Encapsulation Mechanism). Trong hệ thống thực tế, Kyber được dùng để trao đổi khóa bí mật (Secret Key Exchange) một cách an toàn trước các cuộc tấn công của máy tính lượng tử.
Dilithium (ML-DSA): Thuật toán chữ ký số (Digital Signature) dựa trên mạng lưới (Lattice-based). Nó thay thế cho RSA và ECDSA để xác thực danh tính và đảm bảo tính toàn vẹn dữ liệu trong tương lai.
SPHINCS+: Thuật toán chữ ký số dựa trên hàm băm (Hash-based). Đây là phương án dự phòng (fallback) an toàn nhất về mặt lý thuyết, thường được dùng để ký các bản cập nhật quan trọng khi cần độ bảo mật tuyệt đối, dù tốc độ chậm hơn Dilithium.
Trong bài này, chúng ta sẽ biên dịch OpenSSL 3.2 để hỗ trợ các thuật toán này thông qua cơ chế "Provider" mới của OpenSSL, cho phép Postgres sử dụng chúng ở các phần sau.
Tải và biên dịch OpenSSL 3.2 với OQS-provider
OpenSSL 3.x không hỗ trợ PQC "out-of-the-box" trong bản phát hành chuẩn. Chúng ta cần biên dịch từ source code và gắn kết (link) với thư viện OQS-Provider.
1. Cài đặt các công cụ biên dịch cần thiết
Bước này đảm bảo môi trường Ubuntu 24.04 có đầy đủ trình biên dịch C, thư viện phát triển và công cụ quản lý gói để compile OpenSSL.
sudo apt update && sudo apt install -y build-essential git cmake libssl-dev pkg-config
Kết quả mong đợi: Các gói `gcc`, `g++`, `make`, `git`, `cmake` được cài đặt thành công, không có lỗi thiếu dependency.
2. Tải mã nguồn OQS-Provider
OQS-Provider là module bổ sung cho OpenSSL 3.x, chứa các cài đặt thực thi của các thuật toán PQC.
cd /usr/local/src
git clone --recurse-submodules https://github.com/open-quantum-safe/oqs-provider.git
cd oqs-provider
Kết quả mong đợi: Thư mục `oqs-provider` được tạo ra với đầy đủ các file nguồn, bao gồm cả submodule `oqs-provider-src`.
3. Tải và chuẩn bị OpenSSL 3.2
Chúng ta cần phiên bản OpenSSL 3.2.0 trở lên để hỗ trợ cơ chế Provider động cho OQS.
cd /usr/local/src
wget https://www.openssl.org/source/openssl-3.2.0.tar.gz
tar -xzf openssl-3.2.0.tar.gz
cd openssl-3.2.0
Kết quả mong đợi: Thư mục `openssl-3.2.0` được giải nén, chứa file `Configure` và `config`.
4. Biên dịch OpenSSL tích hợp OQS
Đây là bước quan trọng nhất. Chúng ta sẽ chạy script `Configure` của OpenSSL với tham số `enable-oqsprovider` để trỏ đến đường dẫn thư viện OQS-Provider đã tải ở bước 2.
cd /usr/local/src/openssl-3.2.0
./config enable-oqsprovider --with-oqs-provider=/usr/local/src/oqs-provider shared zlib -lssl3.2
Tham số `shared` tạo thư viện động, `-lssl3.2` đảm bảo đặt tên file chuẩn cho Ubuntu 24.04.
Kết quả mong đợi: Quá trình cấu hình chạy xong, hiển thị dòng "Configured OpenSSL for x86_64-linux-gnu" và thông báo "OQS provider: enabled".
5. Compile và cài đặt OpenSSL
Chạy lệnh `make` để biên dịch và `make install` để đưa các file nhị phân và thư viện vào hệ thống.
make -j$(nproc)
sudo make install
Kết quả mong đợi: Quá trình biên dịch hoàn tất không lỗi. Các file `.so` (thư viện động) được copy vào `/usr/local/lib64` và các binary vào `/usr/local/bin`.
Cấu hình file openssl.cnf để kích hoạt PQC
Mặc định, OpenSSL chỉ tải các provider chuẩn (default, fips). Để dùng được PQC, ta phải khai báo OQS-provider trong file cấu hình `openssl.cnf`.
1. Xác định vị trí file cấu hình
Chúng ta sẽ chỉnh sửa file cấu hình toàn cục của OpenSSL đã cài đặt từ source (thường nằm tại `/usr/local/lib/ssl/openssl.cnf`).
ls -l /usr/local/lib/ssl/openssl.cnf
Kết quả mong đợi: File tồn tại. Nếu không thấy, hãy tạo file mới tại `/etc/ssl/openssl.cnf` và copy nội dung mẫu từ `/usr/local/lib/ssl/openssl.cnf`.
2. Chỉnh sửa phần [system_default_sect]
Bạn cần thêm dòng `activate = oqs` vào phần `[system_default_sect]` để kích hoạt provider OQS khi khởi động OpenSSL.
Tìm đoạn mã sau trong file `/usr/local/lib/ssl/openssl.cnf` (hoặc `/etc/ssl/openssl.cnf` nếu bạn dùng cấu hình riêng):
system_default_sect = system_default_sect
[system_default_sect]
secrets = provider_sect
certs = provider_sect
crls = provider_sect
activate = default
activate = fips
activate = oqs
Đảm bảo dòng `activate = oqs` được thêm vào ngay sau các dòng activate mặc định.
Kết quả mong đợi: File cấu hình đã được lưu, chứa tham số kích hoạt OQS-provider.
3. Khai báo đường dẫn module OQS (nếu cần)
Trong phiên bản mới, OpenSSL thường tự động tìm module trong thư mục providers mặc định. Tuy nhiên, để chắc chắn, ta cần khai báo phần `[providers]` để trỏ đúng đường dẫn thư viện `liboqs-provider.so`.
Thêm hoặc sửa phần `[providers]` trong cùng file `openssl.cnf`:
[providers]
oqs = oqs_sect
[oqs_sect]
activate = 1
provider_path = /usr/local/lib64/liboqs-provider.so
Kết quả mong đợi: Cấu hình đã định nghĩa rõ ràng đường dẫn đến thư viện OQS-provider.
Kiểm tra và xác minh khả năng tạo key PQC
Bây giờ chúng ta sẽ kiểm tra xem OpenSSL đã nhận diện được các thuật toán PQC chưa và thử tạo một cặp khóa thực tế.
1. Kiểm tra danh sách các Provider đã kích hoạt
Dùng lệnh `openssl providers list` để xem danh sách các module đang hoạt động. Bạn phải thấy `oqs` trong danh sách.
openssl providers list
Kết quả mong đợi: Xuất hiện danh sách bao gồm:
- default: (Default provider)
- fips: (FIPS provider - nếu có)
- oqs: (OQS provider) - Đây là mục tiêu cần thấy
Nếu không thấy `oqs`, hãy kiểm tra lại bước cấu hình `openssl.cnf` hoặc đảm bảo biến môi trường `OPENSSL_CONF` trỏ đúng file cấu hình.
2. Liệt kê các thuật toán PQC khả dụng
Dùng lệnh `openssl pkeyutl -list` hoặc `openssl genpkey -list` để xem các thuật toán có sẵn trong provider OQS.
openssl genpkey -provider oqs -list
Kết quả mong đợi: Danh sách các thuật toán PQC xuất hiện, bao gồm:
- ML-KEM-512 (tương ứng Kyber-512)
- ML-KEM-768 (tương ứng Kyber-768)
- ML-KEM-1024 (tương ứng Kyber-1024)
- ML-DSA-4 (tương ứng Dilithium-2)
- ML-DSA-5 (tương ứng Dilithium-3)
- ML-DSA-6 (tương ứng Dilithium-5)
- SLH-DSA-SHA2-256 (tương ứng SPHINCS+)
3. Tạo cặp khóa PQC (ML-KEM-768)
Thực hành tạo một cặp khóa dùng thuật toán Kyber (ML-KEM) để chứng minh hệ thống hoạt động. Chúng ta sẽ xuất ra file PEM chứa cả private key và public key.
openssl genpkey -provider oqs -algorithm ML-KEM-768 -out /tmp/kyber768.pem
Kết quả mong đợi: File `/tmp/kyber768.pem` được tạo thành công, không báo lỗi "algorithm not found".
4. Xác minh nội dung file khóa
Sử dụng lệnh `openssl pkey -text` để đọc và hiển thị chi tiết file khóa vừa tạo, xác nhận đây là khóa PQC.
openssl pkey -in /tmp/kyber768.pem -text -noout
Kết quả mong đợi: Đầu ra hiển thị thông tin chi tiết về khóa, bao gồm dòng:
Public Key Algorithm: ML-KEM-768 (hoặc OQS-ML-KEM-768 tùy phiên bản)
Và các tham số như `Parameters: ...`, `Public key: ...`.
Đến đây, bạn đã hoàn tất việc chuẩn bị OpenSSL 3.2 với khả năng hỗ trợ các thuật toán kháng lượng tử. Môi trường này đã sẵn sàng để tích hợp vào PostgreSQL trong phần tiếp theo.
Điều hướng series:
Mục lục: Series: Triển khai Database Quantum-safe với Postgres và Ubuntu 24.04
« Phần 1: Chuẩn bị môi trường Ubuntu 24.04 và công cụ cần thiết
Phần 3: Tích hợp PQC vào PostgreSQL thông qua GUC và extension »