SSL (Secure Sockets Layer) và TLS (Transport Layer Security) là các giao thức mật mã đảm bảo truyền dữ liệu an toàn giữa máy khách và máy chủ qua mạng. Chúng mã hóa toàn bộ lưu lượng, ngăn chặn việc đánh chặn và sửa đổi dữ liệu bởi kẻ tấn công. Theo Google Transparency Report (2025), hơn 95% lưu lượng di động trên thế giới sử dụng mã hóa TLS. Nếu không có giao thức này, bất kỳ thông tin nào gửi qua Wi-Fi mở hoặc mạng di động đều có thể bị đọc bởi bên thứ ba. Cloudflare, 2024
Các điểm chính
SSL (Secure Sockets Layer) là một giao thức được Netscape phát triển vào năm 1995 để bảo vệ lưu lượng web. Phiên bản đầu tiên SSL 1.0 chưa bao giờ được công bố; SSL 2.0 (1995) và SSL 3.0 (1996) được sử dụng cho đến đầu những năm 2000 nhưng chứa các lỗ hổng nghiêm trọng. SSL được kế thừa bởi TLS (Transport Layer Security) — một phiên bản cải tiến được IETF chuẩn hóa. TLS 1.0 (1999) dựa trên SSL 3.0, trong khi các phiên bản sau TLS 1.1 (2006), TLS 1.2 (2008) và TLS 1.3 (2018) dần dần tách khỏi kiến trúc ban đầu, thêm các thuật toán mã hóa mới và sửa lỗ hổng. Ngày nay, SSL được coi là lỗi thời và tất cả các hệ thống hiện đại đều sử dụng TLS, mặc dù cả hai giao thức thường được nhắc đến cùng nhau như SSL/TLS theo thói quen.
Lịch sử của SSL/TLS bắt đầu với nhu cầu truyền dữ liệu an toàn trên web sơ khai. Năm 1994, Netscape đã phát triển SSL 1.0 cho trình duyệt Navigator của mình, nhưng giao thức này chưa bao giờ được công bố do các vấn đề bảo mật nghiêm trọng. SSL 2.0 được phát hành vào năm 1995 và được sử dụng thực tế, nhưng chứa nhiều lỗ hổng: thiếu bảo vệ chống tấn công Man-in-the-Middle, thuật toán mã hóa yếu và dễ bị tấn công cắt ngắn. SSL 3.0 (1996) đã sửa hầu hết các vấn đề, nhưng đến năm 2014, lỗ hổng POODLE được phát hiện, sau đó IETF chính thức tuyên bố tất cả các phiên bản SSL đều lỗi thời. TLS 1.0–1.3 đã cải thiện dần dần độ mạnh mật mã, hiệu suất và quyền riêng tư, với TLS 1.3 giảm bắt tay từ hai vòng xuống một vòng — điều cực kỳ quan trọng cho các ứng dụng di động có kết nối không ổn định.
Bắt tay (Handshake) là quá trình thiết lập kết nối an toàn giữa máy khách và máy chủ. Nó bao gồm một số bước tuần tự trong đó các bên thống nhất về phiên bản giao thức, chọn thuật toán mã hóa, trao đổi khóa và xác thực lẫn nhau. Trong TLS 1.3, bắt tay chỉ mất một vòng mạng (1-RTT), trong khi TLS 1.2 cần hai vòng (2-RTT).
Bước đầu tiên là máy khách gửi ClientHello — một thông điệp chứa danh sách các phiên bản TLS được hỗ trợ, bộ mã hóa và một số ngẫu nhiên. Máy chủ trả lời bằng ServerHello với phiên bản và bộ mã hóa đã chọn, chứng chỉ X.509 và chữ ký số. Máy khách xác minh chứng chỉ qua chuỗi cơ quan cấp chứng chỉ (CA), tạo khóa phiên và gửi nó được mã hóa bằng khóa công khai của máy chủ từ chứng chỉ. Sau khi máy chủ xác nhận, việc truyền dữ liệu an toàn bắt đầu. Toàn bộ quá trình bắt tay mất 1–3 mili giây trên các thiết bị hiện đại, khiến nó không thể nhận thấy đối với người dùng.
Nền tảng của xác thực TLS là Cơ sở hạ tầng khóa công khai (PKI) được xây dựng trên các chứng chỉ định dạng X.509. Mỗi chứng chỉ chứa: tên miền (Common Name hoặc Subject Alternative Name), khóa công khai của máy chủ, tên nhà phát hành (Cơ quan cấp chứng chỉ), ngày hết hạn và chữ ký số của CA. Máy khách xác minh chứng chỉ của máy chủ dọc theo chuỗi tin cậy: từ chứng chỉ máy chủ đến CA gốc, chứng chỉ của CA này được nhúng trong hệ điều hành. Trên thiết bị Android, chứng chỉ gốc được lưu trữ trong kho khóa hệ thống, được cập nhật qua Google Play Services; trên iOS — qua các bản cập nhật iOS. Nếu bất kỳ mắt xích nào trong chuỗi bị đứt (chứng chỉ hết hạn, không khớp tên miền, CA không xác định), máy khách sẽ ngắt kết nối. Đối với chứng chỉ tự ký (được sử dụng trong phát triển), cần có sự tin cậy rõ ràng — trên Android qua Network Security Config, trên iOS qua NSExceptionDomains trong Info.plist. Quá trình xác thực chuỗi chứng chỉ cũng bao gồm kiểm tra trạng thái thu hồi qua CRL (Danh sách thu hồi chứng chỉ) hoặc OCSP (Giao thức trạng thái chứng chỉ trực tuyến), mặc dù trên thiết bị di động, các yêu cầu OCSP thường bị bỏ qua để tăng tốc kết nối — đây là sự đánh đổi giữa bảo mật và hiệu suất mà các kiến trúc sư cần cân nhắc.
Mặc dù các thuật ngữ SSL và TLS thường được sử dụng thay thế cho nhau, nhưng có những khác biệt kỹ thuật cơ bản giữa chúng ảnh hưởng đến bảo mật và hiệu suất của ứng dụng di động.
| Đặc điểm | SSL 3.0 | TLS 1.2 | TLS 1.3 |
|---|---|---|---|
| Năm phát hành | 1996 | 2008 | 2018 |
| Trạng thái | Lỗi thời (RFC 7568) | Hoạt động (khuyến nghị) | Hiện tại (tốt nhất) |
| Số vòng | 2 | 2 | 1 |
| Thuật toán trao đổi khóa | RSA | RSA, ECDHE | ECDHE (chỉ) |
| Mã hóa xác thực | Không | GCM, CCM | AEAD bắt buộc |
| Perfect Forward Secrecy | Không | Tùy chọn | Bắt buộc |
Sự khác biệt chính giữa TLS 1.3 và các phiên bản trước là việc sử dụng bắt buộc Perfect Forward Secrecy (PFS) thông qua giao thức ECDHE. Điều này có nghĩa là ngay cả khi kẻ tấn công có được khóa riêng của máy chủ, chúng cũng không thể giải mã lưu lượng đã bị chặn trước đó. Đối với các ứng dụng di động, nơi máy chủ bị xâm phạm là mối đe dọa thực tế, TLS 1.3 với PFS là một yêu cầu bảo mật bắt buộc.
Các phiên bản cũ của SSL và TLS có các lỗ hổng được ghi chép đầy đủ khiến chúng không phù hợp để sử dụng trong sản xuất. POODLE (CVE-2014-3566) tấn công SSL 3.0 thông qua padding oracle, cho phép giải mã cookie phiên trong 256 yêu cầu. BEAST (CVE-2011-3389) khai thác lỗ hổng trong chế độ CBC của TLS 1.0 thông qua IV có thể dự đoán trước. Heartbleed (CVE-2014-0160) — không phải lỗ hổng giao thức mà là lỗi trong triển khai OpenSSL cho phép đọc bộ nhớ máy chủ: theo Netcraft, hơn 500.000 máy chủ đã bị ảnh hưởng vào năm 2014. Bắt đầu từ Android 10 (API 29) và iOS 13, tất cả các giao thức này đều bị vô hiệu hóa ở cấp hệ thống. Tuy nhiên, các nhà phát triển nên kiểm tra cấu hình máy chủ của mình thông qua SSL Labs Test (qualys.com) trước khi ra mắt ứng dụng để đảm bảo không có bộ mã hóa lỗi thời và TLS 1.3 được hỗ trợ.
Trong các ứng dụng di động, TLS bảo vệ dữ liệu ở ba cấp độ: mã hóa nội dung (không ai ngoài máy chủ có thể đọc dữ liệu), xác minh tính toàn vẹn (dữ liệu không thể bị thay đổi trong quá trình truyền) và xác thực máy chủ (máy khách chắc chắn rằng mình đang kết nối với đúng máy chủ). Xác thực đặc biệt quan trọng: nếu không có nó, kẻ tấn công có thể giả mạo máy chủ thông qua giả mạo DNS hoặc điểm truy cập Wi-Fi giả.
Theo một nghiên cứu của Google Play Protect (2024), 76% ứng dụng Android sử dụng TLS đúng cách với xác minh chứng chỉ. 24% còn lại mắc lỗi: họ vô hiệu hóa xác minh chứng chỉ để thử nghiệm (và quên bật lại trong sản xuất), sử dụng chứng chỉ tự ký mà không xác thực hoặc cho phép các giao thức lỗi thời như SSL 3.0 và TLS 1.0. Apple App Transport Security (ATS) trên iOS yêu cầu tối thiểu TLS 1.2 từ năm 2017 và bắt đầu từ iOS 15, nó sử dụng TLS 1.3 theo mặc định cho tất cả các yêu cầu mạng. Để bảo vệ thêm, cũng nên triển khai Certificate Pinning — gắn với một chứng chỉ máy chủ cụ thể.
Hãy xem xét một ví dụ về cấu hình kết nối HTTPS an toàn trong Android sử dụng OkHttp — một trong những thư viện mạng phổ biến nhất. Cấu hình đúng bao gồm việc bắt buộc sử dụng TLS 1.3 và xác minh chứng chỉ.
val client = OkHttpClient.Builder()
.connectionSpecs(
listOf(
ConnectionSpec.Builder(ConnectionSpec.MODERN_TLS)
.tlsVersions(TlsVersion.TLS_1_3, TlsVersion.TLS_1_2)
.cipherSuites(
CipherSuite.TLS_AES_128_GCM_SHA256,
CipherSuite.TLS_AES_256_GCM_SHA384,
CipherSuite.TLS_CHACHA20_POLY1305_SHA256
)
.build()
)
)
.hostnameVerifier { hostname, session ->
SSLSession.DefaultHostnameVerifier.verify(hostname, session)
}
.build()
Trong ví dụ này, chúng tôi giới hạn tập hợp các phiên bản TLS được hỗ trợ chỉ còn 1.3 và 1.2, loại trừ TLS 1.0/1.1 lỗi thời. Các bộ mã hóa được chọn từ các thuật toán hiện đại với chế độ AEAD và Perfect Forward Secrecy bắt buộc. HostnameVerifier kiểm tra tên máy chủ khớp với chứng chỉ. Trên iOS, cấu hình tương tự được thực hiện thông qua cấu hình URLSession với tham số tlsMinimumSupportedSupportedProtocolVersion được đặt thành .TLSv13. Ngoài ra, trên iOS có thể đặt tlsMaximumSupportedProtocolVersion để giới hạn phiên bản tối đa — hữu ích cho khả năng tương thích với các máy chủ cũ chưa nâng cấp lên TLS 1.3. Cấu hình như vậy đảm bảo mức bảo mật tối đa cho việc truyền dữ liệu trong ứng dụng di động.
Các câu hỏi thường gặp
TLS là phiên bản mới hơn và an toàn hơn của giao thức. SSL đã lỗi thời và không nên được sử dụng (RFC 7568). Trong thực tế, cả hai thuật ngữ đều chỉ mã hóa HTTPS, nhưng về mặt kỹ thuật, tất cả các hệ thống hiện đại đều hoạt động qua TLS 1.2 hoặc 1.3.
Cài đặt một công cụ proxy như Burp Suite hoặc Charles Proxy và chặn lưu lượng của ứng dụng. Nếu kết nối sử dụng HTTPS và chứng chỉ hợp lệ — ứng dụng đang sử dụng TLS. Nếu lưu lượng đi qua HTTP — không có mã hóa.
Chỉ TLS 1.2 và TLS 1.3 được phép cho bản dựng sản xuất. Các giao thức SSL 3.0, TLS 1.0 và TLS 1.1 phải bị vô hiệu hóa trên cả máy chủ và ứng dụng khách. Kể từ năm 2020, các nền tảng chính (Android, iOS, trình duyệt) yêu cầu tối thiểu TLS 1.2.
Có, nên sử dụng. TLS xác minh chứng chỉ thông qua chuỗi cơ quan cấp chứng chỉ, nhưng nếu bất kỳ CA nào bị xâm phạm (như đã xảy ra với DigiNotar năm 2011), kẻ tấn công có thể cấp chứng chỉ giả. Pinning thêm một lớp xác minh bổ sung.
TLS 1.3 giảm thời gian thiết lập kết nối từ 2 vòng xuống còn 1, mang lại cải thiện 30–50% ở lần kết nối đầu tiên. Đối với các ứng dụng di động có kết nối không ổn định (tàu điện ngầm, tàu hỏa), điều này cực kỳ quan trọng cho tốc độ tải dữ liệu.
Tổng kết
Chúng tôi sẽ phát triển ứng dụng di động chìa khóa trao tay
IT Sectr tạo các ứng dụng iOS và Android cho các công ty khởi nghiệp và doanh nghiệp từ năm 2017. Chúng tôi sẽ tư vấn và đề xuất giải pháp tốt nhất cho bạn.
Đọc thêm