Trước khi tiến hành truyền số liệu, SSL thực hiện giao thức bắt tay để chứng thực website và chứng thực người duyệt web, trao đổi khóa phiên và thống nhất các thuật toán mã hóa được sử dụng. Sơ đồ bắt tay được minh họa trong hình bên dướị
(đường nét đứt là các thông điệp không bắt buộc, chỉ sử dụng khi cần chứng thực từ phía client)
Pha 1: Chọn thuật toán mã hóa
Pha 2: Server cung cấp chứng chỉ
Pha 3: Trao đổi khóa phiên
Truyền dữ liệu của giao thức HTTP
111
Hình 7-6. Giao thức bắt tay SSL
Sơ đồ trên gồm có 10 loại thông điệp và được chia thành 4 pha:
1) Pha 1: thỏa thuận về phương pháp mã hóa được sử dụng. Pha này bắt đầu bằng thông điệp client_hello được gửi từ client đến website, thông điệp này gồm các tham số sau:
• Version: phiên bản SSL cao nhất mà client sử dụng • Random: là một cấu trúc ngẫu nhiên gồm 32 byte
• SessionID: nếu bằng 0 có nghĩa là client muốn thiết lập một session mới hoàn toàn. Nếu khác 0 nghĩa là client muốn thiết lập một kết nối mới trong session nàỵ Việc dùng session giúp cho client và server giảm các bước thỏa thuận trong quá trình bắt taỵ
• CompressionMethod: phương pháp nén dữ liệu sử dụng trong quá trình truyền dữ liệu
• CipherSuite: Các phương pháp mã hóa khóa công khai dùng để trao đổi khóa phiên như RSA, Fixed Diffie-Hellman, Ephemeral Diffie-Hellman, Anonymous Diffie-Hellman. Phương pháp nào liệt kê trước thì có được ưu tiên hơn. Ứng với mỗi phương pháp trao đổi khóa là danh sách các loại mã hóa đối xứng được sử dụng. Gồm các tham số sau:
- CipherAlgorithm: phương pháp mã hóa đối xứng sử dụng (là một trong các phương pháp mã khối RC2, DES, 3DES, IDEA, AES, Fortezza hay mã dòng RC4)
- Hash Algorithm: MD5 hay SHA-1.
- CipherType: mã hóa đối xứng là mã khối hay mã dòng. - KeyMaterial: một chuỗi byte được dùng để sinh khóạ
- IV Size: kích thước của IV dùng trong mô hình CBC của mã khốị • Sau khi nhận được client_hello server sẽ trả lời bằng thông điệp
server_hello để xác các thuật toán được sử dụng.
2) Pha 2: chứng thực server và trao đổi khóa của mã hóa công khaị Sau khi đã xác nhận thuật toán mã hóa với client, server tiếp tục thực hiện các thông điệp sau:
- Thông điệp certificate: server cung cấp certificate của mình cho client (dưới dạng chứng chỉ X.509) .
- Thông điệp certificate_request: trong trường hợp server cần chứng thực người sử dụng, server sẽ gửi thông điệp này để yêu cầu client cung cấp chứng chỉ.
- Thông điệp server_hello_done: báo hiệu server đã hoàn tất pha 2.
3) Pha 3: chứng thực client và trao đổi khóa của mã hóa đối xứng
- Thông điệp certificate: nếu server yêu cầu certificate, client cung cấp certificate của mình cho server.
- Thông điệp client_key_exchange: trong bước này client gửi các thông số cần thiết cho server để tạo khóa bí mật. Ta cũng sẽ chỉ đề cập đến trường hợp RSẠ Trong trường hợp này client tạo một giá trị bất kỳ gọi là “tiền khóa chủ” (pre-master secret) có kích thước 48 byte, mã hóa bằng khóa
112
công khai của server. Sau khi có “pre-master secret”, client và server sẽ tính giá trị “khóa chủ” (master-secret) như sau:
master_secret = MD5(pre_master_secret || SHẮÁ || pre_master_secret ||ClientHellọrandom || ServerHellọrandom)) || MD5(pre_master_secret || SHẮBB' || pre_master_secret || ClientHellọrandom || ServerHellọrandom)) || MD5(pre_master_secret || SHẮCCC' || pre_master_secret || ClientHellọrandom || ServerHellọrandom))
Master_secret cũng có chiều dài là 48 byte (384 bít). Phép toán || là phép nối - Thông điệp certificate_verify: là chữ ký của client trong trường hợp server
cần chứng thực client. Client phải dùng khóa riêng để ký chữ ký, do đó server có thể đảm bảo được là không ai khác dùng certificate của client để giả mạọ
4) Pha 4: hoàn tất quá trình bắt taỵ Trong pha này client và server gửi thông điệp
finished để thông báo hoàn tất quá trình bắt tay lẫn nhaụ Tham số của thông điệp này là một giá trị hash để hai bên có thể kiểm tra lẫn nhaụ Giá trị hash này kết nối của 2 giá trị hash:
MD5(master_secret || pad2 ||
MD5(handshake_messages || Sender || master_secret || pad1)) SHĂmaster_secret || pad2 ||
SHĂhandshake_messages || Sender || master_secret || pad1))
Trong đó handshake_messages là tất cả các thông điệp đầu đến trước thông điệp finished nàỵ Sender là mã để phân biệt thông điệp finished này là từ client hay từ server. Đây là cơ chế chống replay attack dùng hàm hash mà chúng ta đã tìm hiểu trong chương 6.
Dựa trên giá trị master_secret, client và server sẽ tính các tham số cần thiết cho mã hóa đối xứng như sau:
- Hai khóa dành cho việc mã hóa dữ liệu, một khóa dành cho chiều server gửi client và 1 khóa dành cho chiều client và server.
- Hai giá trị IV, cũng dành cho server và client tương ứng
- Hai khóa dành cho việc tính giá trị MAC, cũng tương ứng cho server và client Tùy theo phương pháp mã hóa đối xứng được sử dụng mà các tham số này có chiều dài khác nhaụ Tuy nhiên, chúng được lấy từ dãy bít theo công thức sau:
key_block = MD5(master_secret || SHẮÁ || master_secret ||
ServerHellọrandom || ClientHellọrandom)) || MD5(master_secret || SHẮBB' || master_secret || ServerHellọrandom || ClientHellọrandom)) || MD5(master_secret || SHẮCCC' || master_secret || ServerHellọrandom ||ClientHellọrandom)) || . . .
113 Việc dùng các giá trị ClientHellọrandom và ServerHellọrandom sẽ làm phức tạp việc phá mã hơn.
Đến đây client và server đã hoàn tất quá trình bắt tay trao đổi khóa, sẵn sàng để truyền số liệu theo giao thức truyền số liệụ