SSL/TLS: các khái niệm chính và giao thức trong phát triển

Tác giả: IT Sectr Đã đăng: 2026-03-09 Thời gian đọc: 9 phút

SSL/TLS là các giao thức mật mã mã hóa dữ liệu giữa ứng dụng di động và máy chủ, đảm bảo tính bảo mật và toàn vẹn của lưu lượng truy cập. Theo Apple (2026), App Transport Security chặn các kết nối dưới TLS 1.2 theo mặc định trên tất cả thiết bị iOS. TLS 1.3 giảm thời gian bắt tay xuống 2 lần so với TLS 1.2, cải thiện trải nghiệm người dùng của ứng dụng di động.

Những điểm chính

  • TLS là giao thức mật mã hiện đại, kế thừa của SSL lỗi thời với bảo mật được cải thiện.
  • TLS 1.3 thực hiện bắt tay trong 1 RTT so với 2 RTT trong TLS 1.2, tăng tốc tải trang.
  • App Transport Security là cơ chế của Apple yêu cầu HTTPS với TLS 1.2+ trên iOS.
  • Network Security Config là cấu hình HTTPS cho Android qua XML.
  • Certificate Pinning bảo vệ khỏi các cuộc tấn công MitM bằng cách ghim dấu vân tay chứng chỉ trong mã.

SSL/TLS là gì?

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 qua mạng. SSL, được phát triển bởi Netscape vào những năm 1990, được coi là lỗi thời sau phiên bản 3.0 do các lỗ hổng POODLE và BEAST. TLS, kế thừa của nó, đã trải qua các phiên bản 1.0, 1.1, 1.2 và 1.3 — chỉ TLS 1.2 và TLS 1.3 được coi là hiện hành. Tất cả các nền tảng di động hiện đại đều yêu cầu TLS cho kết nối mạng, và App Store cùng Google Play kiểm tra điều này trong quá trình xét duyệt.

Tại sao cần TLS cho ứng dụng di động

Nếu không có TLS, lưu lượng truy cập giữa ứng dụng và máy chủ được truyền dưới dạng văn bản thuần túy — bất kỳ ai trên cùng mạng Wi-Fi đều có thể chặn tên đăng nhập, mật khẩu, token và dữ liệu cá nhân của người dùng bằng Wireshark hoặc tcpdump. TLS mã hóa tất cả dữ liệu được truyền (mã hóa ở lớp truyền tải) và xác minh tính xác thực của máy chủ thông qua chuỗi chứng chỉ X.509. Theo IETF (2018), TLS 1.3 chỉ sử dụng các bộ mã hóa AEAD hiện đại (AES-GCM, ChaCha20-Poly1305), loại trừ các thuật toán lỗi thời như RC4 và 3DES.

HTTPS và TLS

HTTPS (HTTP Secure) là HTTP qua TLS. Khi ứng dụng di động thực hiện yêu cầu qua https://, trước tiên nó thiết lập kết nối TLS với máy chủ, sau đó truyền các tiêu đề HTTP và nội dung yêu cầu qua kênh đã mã hóa. Nếu không có HTTPS, không có API nghiêm túc nào nên hoạt động — đó là vệ sinh bảo mật cơ bản. Theo OWASP (2026), các kết nối không an toàn nằm trong top 3 lỗ hổng của ứng dụng di động.

Cách thức hoạt động của TLS Handshake

TLS 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ủ. Các bên thương lượng phiên bản giao thức, chọn bộ mật mã (cipher suite), trao đổi khóa thông qua mật mã bất đối xứng và xác minh chứng chỉ. Trong TLS 1.2, quá trình bắt tay yêu cầu 2 Round Trip Time (2 RTT): máy khách → máy chủ với ClientHello, máy chủ → máy khách với ServerHello và Certificate, sau đó là các thông báo Finished cuối cùng. TLS 1.3 giảm quá trình này xuống còn 1 RTT.

Các giai đoạn chi tiết của bắt tay TLS 1.2

Giai đoạn đầu tiên: ClientHello — máy khách gửi các phiên bản TLS được hỗ trợ, danh sách các bộ mật mã và một số ngẫu nhiên. Máy chủ trả lời bằng ServerHello, chọn phiên bản và bộ mật mã, gửi chứng chỉ X.509 (Certificate) và thông báo ServerHelloDone. Máy khách xác minh chứng chỉ thông qua chuỗi các tổ chức chứng thực (CA) đáng tin cậy, tạo pre-master secret, mã hóa nó bằng khóa công khai từ chứng chỉ và gửi đến máy chủ trong ClientKeyExchange. Sau đó, cả hai bên tạo khóa phiên và trao đổi các thông báo ChangeCipherSpec và Finished. Từ thời điểm này, tất cả dữ liệu được mã hóa đối xứng.

swift
import Security

let url = URL(string: "https://api.example.com")!
let session = URLSession(configuration: .default,
                           delegate: self,
                           delegateQueue: nil)

func urlSession(
    _ session: URLSession,
    didReceive challenge: URLAuthenticationChallenge,
    completionHandler: @escaping (URLSession.AuthChallengeDisposition,
                                    URLCredential?) -> Void
) {
    let trust = challenge.protectionSpace.serverTrust
    guard let trust else {
        completionHandler(.cancelAuthenticationChallenge, nil)
        return
    }
    completionHandler(.useCredential, URLCredential(trust: trust))
}

Ví dụ xử lý URLAuthenticationChallenge trên iOS qua URLSessionDelegate. Phương thức này được gọi trong mỗi TLS Handshake, cho phép ứng dụng thực hiện xác minh chứng chỉ máy chủ tùy chỉnh. Để sử dụng trong sản xuất, hãy thêm xác minh chứng chỉ qua SecTrustEvaluateWithError và so sánh với dấu vân tay đã lưu trước — chỉ sau đó gọi useCredential.

TLS 1.2 so với TLS 1.3

TLS 1.3 (RFC 8446, 2018) là bản cập nhật giao thức lớn đầu tiên sau 10 năm. Các cải tiến chính: giảm bắt tay xuống 1 RTT (0 RTT cho kết nối lặp lại), loại bỏ các bộ mật mã lỗi thời (trao đổi khóa RSA, chế độ CBC), bắt buộc Perfect Forward Secrecy (PFS) và bảo vệ khỏi các cuộc tấn công hạ cấp qua signed transcript. Theo Qualys SSL Labs (2026), TLS 1.3 cung cấp khả năng bảo vệ ngay cả khi khóa máy chủ dài hạn bị xâm phạm nhờ PFS.

Đặc điểmTLS 1.2TLS 1.3
Bắt tay2 RTT (đầy đủ)1 RTT (0 RTT với PSK)
Bộ mật mã30+ tổ hợp (RSA, DH, ECDH)5 bộ AEAD (AES-GCM, ChaCha20)
Forward SecrecyTùy chọn (DHE, ECDHE)Bắt buộc (tất cả bộ)
Hỗ trợ iOSiOS 5+iOS 12+
Hỗ trợ AndroidAndroid 4.0+Android 10+
Thuật toán lỗi thờiRSA, CBC, RC4, 3DESĐã loại bỏ hoàn toàn

0-RTT (Zero Round Trip Time) là một tính năng của TLS 1.3 cho phép máy khách gửi dữ liệu ngay lập tức cùng với ClientHello trong kết nối lặp lại qua PSK (Pre-Shared Key). Điều này tăng tốc tải các màn hình tiếp theo trong ứng dụng di động, đặc biệt với các yêu cầu thường xuyên đến cùng một máy chủ. Tuy nhiên, dữ liệu 0-RTT không được bảo vệ khỏi các cuộc tấn công phát lại — nó có thể bị chặn và gửi lại. Chỉ sử dụng 0-RTT cho các yêu cầu đẳng năng (GET, PUT) không có tác dụng phụ.

TLS trên iOS: App Transport Security

App Transport Security (ATS) là cơ chế của Apple yêu cầu kết nối HTTPS với TLS 1.2 trở lên, được bật theo mặc định từ iOS 9. ATS chặn tất cả các kết nối HTTP và HTTPS với TLS dưới 1.2. Nhà phát triển có thể cấu hình ngoại lệ trong Info.plist qua NSAppTransportSecurity cho các tên miền cụ thể, nhưng Apple khuyến nghị giảm thiểu ngoại lệ và sử dụng HTTPS ở mọi nơi. Vi phạm yêu cầu ATS là lý do từ chối ứng dụng trong quá trình xét duyệt App Store.

xml
<!-- Info.plist — App Transport Security -->
<key>NSAppTransportSecurity</key>
<dict>
    <key>NSAllowsArbitraryLoads</key>
    <false/>
    <key>NSExceptionDomains</key>
    <dict>
        <key>cdn.example.com</key>
        <dict>
            <key>NSExceptionAllowsInsecureHTTPLoads</key>
            <false/>
            <key>NSExceptionMinimumTLSVersion</key>
            <string>TLSv1.2</string>
        </dict>
    </dict>
    <key>NSAllowsLocalNetworking</key>
    <true/>
</dict>

Cấu hình ATS trong Info.plist. NSAllowsArbitraryLoads được đặt thành false — tất cả các kết nối phải sử dụng HTTPS. Cho tên miền cdn.example.com, phiên bản TLS tối thiểu 1.2 được chỉ định, NSAllowsLocalNetworking=true cho phép HTTP cho mạng cục bộ (hữu ích cho máy chủ phát triển). Apple khuyến nghị mạnh mẽ không bật NSAllowsArbitraryLoads mà không có NSExceptionDomains — đây nên là một ngoại lệ, không phải quy tắc chung.

TLS trên Android: Network Security Config

Network Security Config là cơ chế của Android để cấu hình HTTPS và TLS mà không cần thay đổi mã Java/Kotlin. Cấu hình được chỉ định trong tệp network_security_config.xml và được kết nối trong AndroidManifest qua thuộc tính android:networkSecurityConfig. Hỗ trợ cấu hình chứng chỉ đáng tin cậy (CA người dùng và hệ thống), Certificate Pinning, vô hiệu hóa HTTP văn bản thuần túy, ghi đè gỡ lỗi và chuyển hướng lưu lượng.

xml
<!-- res/xml/network_security_config.xml -->
<network-security-config>
    <base-config cleartextTrafficPermitted="false">
        <trust-anchors>
            <certificates src="system" />
        </trust-anchors>
    </base-config>
    <domain-config cleartextTrafficPermitted="false">
        <domain includeSubdomains="true">api.example.com</domain>
        <pin-set expiration="2027-01-01">
            <pin digest="SHA-256">
                47DEQpj8HBSa+/TImW+5JCeuQeRkm5NMpJWZG3hSuFU=
            </pin>
        </pin-set>
    </domain-config>
</network-security-config>

Network Security Config cho Android. Base-config chặn lưu lượng văn bản thuần túy và chỉ tin tưởng chứng chỉ CA hệ thống (không có chứng chỉ người dùng — bảo vệ khỏi việc cài đặt chứng chỉ MitM bởi người dùng). Domain-config cho api.example.com chứa pin-set với dấu vân tay SHA-256 của chứng chỉ. Nếu chứng chỉ máy chủ thay đổi trước ngày hết hạn được chỉ định, kết nối sẽ bị từ chối — đây là hình thức nghiêm ngặt của Certificate Pinning.

Certificate Pinning và bảo mật

Certificate Pinning là kỹ thuật cố định chứng chỉ hoặc khóa công khai của máy chủ trong mã ứng dụng. Trong mỗi TLS Handshake, máy khách so sánh chứng chỉ máy chủ với dấu vân tay đã lưu trước (băm SHA-256). Ngay cả khi kẻ tấn công có được chứng chỉ CA đáng tin cậy hoặc xâm phạm tổ chức chứng thực, chúng không thể thực hiện tấn công MitM — ứng dụng kiểm tra dấu vân tay cụ thể, không phải chuỗi CA. Điều này đặc biệt quan trọng đối với ứng dụng tài chính và ứng dụng xử lý dữ liệu nhạy cảm.

Rủi ro và giải pháp thay thế cho Pinning

Certificate Pinning đòi hỏi thận trọng: khi chứng chỉ máy chủ thay đổi, tất cả phiên bản cũ của ứng dụng sẽ ngừng kết nối. Nên lưu trữ nhiều dấu vân tay dự phòng (chính + dự phòng), chỉ định ngày hết hạn pin-set và triển khai cơ chế dự phòng qua xác minh CA tiêu chuẩn. Một giải pháp thay thế là Trust On First Use (TOFU), nơi ứng dụng ghi nhớ chứng chỉ ở lần kết nối đầu tiên và cảnh báo người dùng khi nó thay đổi. Theo OWASP (2026), việc thiếu Certificate Pinning nằm trong top 3 lỗ hổng ứng dụng di động (M3: Giao tiếp không an toàn).

Triển khai Pinning trong Alamofire

Trong Alamofire 5+, Certificate Pinning được cấu hình qua ServerTrustManager với PinnedCertificatesTrustEvaluator (kiểm tra toàn bộ chứng chỉ) hoặc PublicKeysTrustEvaluator (chỉ khóa công khai). Khóa công khai được ưu tiên hơn — nó không thay đổi khi gia hạn chứng chỉ với cùng CA. Tạo ServerTrustManager với từ điển [host: evaluator], chuyển nó cho Session và sử dụng cho tất cả yêu cầu đến API được bảo vệ.

Các câu hỏi thường gặp

Sự khác biệt giữa SSL và TLS là gì?

SSL là giao thức lỗi thời (phiên bản 2.0 và 3.0), được coi là không an toàn do các lỗ hổng POODLE và BEAST. TLS là kế thừa của nó, bắt đầu với TLS 1.0 (RFC 2246, 1999). Bất kỳ “chứng chỉ SSL” hiện đại nào cũng là chứng chỉ X.509 được giao thức TLS sử dụng. SSL 3.0 bị cấm trong tất cả hệ điều hành và trình duyệt hiện đại.

Tại sao Apple chặn kết nối HTTP?

App Transport Security là yêu cầu bảo mật của Apple đối với ứng dụng. HTTP truyền dữ liệu dưới dạng văn bản thuần túy, cho phép chặn token và dữ liệu cá nhân của người dùng trên mạng Wi-Fi công cộng. ATS chặn HTTP và HTTPS với TLS dưới 1.2 theo mặc định, bảo vệ người dùng ngay cả khi không có sự can thiệp của nhà phát triển.

Làm thế nào để kiểm tra máy chủ có hỗ trợ TLS 1.3 không?

Sử dụng SSL Labs (ssllabs.com/ssltest) hoặc dòng lệnh: openssl s_client -tls1_3 -connect example.com:443. Trên hầu hết các nền tảng đám mây (AWS CloudFront, Cloudflare, Nginx 1.19+, Caddy), TLS 1.3 được bật theo mặc định. Trên Android 10+, hỗ trợ được tích hợp trong nhà cung cấp hệ thống Conscrypt.

Chứng chỉ tự ký là gì và có thể sử dụng trong sản xuất không?

Chứng chỉ tự ký là chứng chỉ được ký bởi chính nó, không phải bởi tổ chức chứng thực. Không thể sử dụng trong sản xuất — hệ điều hành di động không tin tưởng chứng chỉ như vậy. Nó được sử dụng cho phát triển cục bộ: thêm chứng chỉ vào danh sách đáng tin cậy qua MDM hoặc sử dụng bản gỡ lỗi với xác minh bị vô hiệu hóa.

Làm thế nào để cấu hình Pinning trong Alamofire?

Tạo ServerTrustManager với PinnedCertificatesTrustEvaluator hoặc PublicKeysTrustEvaluator. Cái đầu tiên kiểm tra toàn bộ chứng chỉ, cái thứ hai — chỉ khóa công khai (ưu tiên hơn). Chuyển trình quản lý cho Session(configuration: serverTrustManager:) và sử dụng phiên cho tất cả yêu cầu API.

Tổng kết

  • TLS là giao thức mã hóa hiện đại, kế thừa của SSL lỗi thời, bắt buộc cho tất cả ứng dụng di động.
  • TLS 1.3 thực hiện bắt tay trong 1 RTT (nhanh gấp 2 lần TLS 1.2) với Forward Secrecy bắt buộc và chỉ dùng bộ mã hóa AEAD.
  • App Transport Security (iOS) tự động chặn HTTP và TLS dưới 1.2 trên tất cả thiết bị Apple với iOS 9+.
  • Network Security Config (Android) cấu hình HTTPS, Certificate Pinning và cấm văn bản thuần túy qua XML mà không cần thay đổi mã.
  • Certificate Pinning bảo vệ khỏi tấn công MitM bằng cách ghim dấu vân tay SHA-256 của chứng chỉ trong Network Security Config hoặc ServerTrustManager.
  • TLS 1.3 sử dụng 5 bộ mã hóa AEAD, loại trừ trao đổi khóa RSA lỗi thời và chế độ mã hóa CBC.
  • Cấu hình TLS là bước xuất bản bắt buộc: App Store kiểm tra ATS, Google Play kiểm tra lưu lượng văn bản thuần túy qua Network Security Config.

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.

Thảo luận dự án

Đọc thêm