Certificate Pinning là một kỹ thuật bảo mật trong đó ứng dụng di động xác minh rằng chứng chỉ của máy chủ khớp với mẫu đã biết trước, thay vì chỉ tin tưởng bất kỳ chứng chỉ nào từ chuỗi CA. Không giống như kiểm tra TLS thông thường, dựa vào hàng trăm tổ chức chứng thực, pinning thu hẹp sự tin cậy vào một chứng chỉ cụ thể hoặc khóa công khai của nó. Theo Hướng dẫn Kiểm tra Bảo mật Di động OWASP (2024), việc triển khai Certificate Pinning chặn 100% các kịch bản tấn công Man-in-the-Middle liên quan đến việc thay thế chứng chỉ. OWASP MSTG, 2024
Những điểm chính
Certificate Pinning là một cơ chế bảo mật trong đó ứng dụng lưu trữ (hoặc “gắn”) một mẫu chứng chỉ của máy chủ và so sánh chứng chỉ nhận được với mẫu này ở mỗi kết nối. Nếu chứng chỉ không khớp — kết nối bị chấm dứt, ngay cả khi nó được ký chính thức bởi một tổ chức chứng thực đáng tin cậy. Điều này bảo vệ chống lại các cuộc tấn công mà kẻ tấn công có được chứng chỉ giả thông qua CA bị xâm phạm (như đã xảy ra với DigiNotar năm 2011 hoặc Comodo năm 2011).
Quy trình pinning bao gồm ba giai đoạn: trích xuất dấu vân tay (fingerprint) của chứng chỉ hoặc khóa công khai từ một phiên bản đáng tin cậy; lưu trữ dấu vân tay này trong mã nguồn hoặc tài nguyên ứng dụng; so sánh trong quá trình bắt tay TLS. Nhà phát triển có thể gắn dấu vân tay SHA-256 của toàn bộ chứng chỉ hoặc chỉ khóa công khai (Public Key Pinning). Cách tiếp cận thứ hai được ưu tiên hơn: khi chứng chỉ được gia hạn, khóa công khai thường giữ nguyên và ứng dụng không mất kết nối với máy chủ. Theo khuyến nghị của OWASP, số lượng pin tối thiểu là 2: một pin hiện tại và một pin dự phòng cho việc luân chuyển khóa. Các thư viện hiện đại như OkHttp và TrustKit tự động hóa quy trình xác minh các pin được chỉ định trong mỗi kết nối TLS mà không cần nỗ lực thêm từ nhà phát triển. Điều quan trọng là hiểu rằng pinning không thay thế kiểm tra TLS tiêu chuẩn, mà bổ sung cho nó: đầu tiên, một bắt tay thông thường với xác thực chuỗi chứng chỉ được thực hiện, sau đó là kiểm tra pinning bổ sung. Sự bảo vệ hai lớp này loại bỏ các lỗ hổng liên quan đến xâm phạm CA, bao gồm các trường hợp cấp chứng chỉ sai và tấn công vào cơ sở hạ tầng tổ chức chứng thực.
Có một số cách tiếp cận để triển khai Certificate Pinning, mỗi cách có đặc điểm lưu trữ và xác minh riêng. Việc lựa chọn phương pháp phụ thuộc vào kiến trúc ứng dụng, tần suất cập nhật chứng chỉ và yêu cầu về tính linh hoạt.
| Loại pinning | Nội dung lưu trữ | Tính linh hoạt | Ví dụ sử dụng |
|---|---|---|---|
| Certificate Pinning | Toàn bộ chứng chỉ X.509 | Thấp | Chứng chỉ cố định trong 1–2 năm |
| Public Key Pinning | Khóa công khai (SPKI) | Trung bình | Phương pháp OWASP khuyến nghị |
| Hash Pinning | Dấu vân tay SHA-256 | Trung bình | Phổ biến trong OkHttp (certificatePinner) |
| CA Pinning | CA trung gian | Cao | Ứng dụng doanh nghiệp |
Phương pháp cân bằng nhất là Public Key Pinning, được OWASP và Google khuyến nghị. Thay vì một chứng chỉ cụ thể (thay đổi sau mỗi 1–2 năm), ứng dụng lưu trữ dấu vân tay SubjectPublicKeyInfo — một sự trừu tượng hóa của khóa công khai. Nếu chứng chỉ được gia hạn với cùng khóa (tái sử dụng khóa), pin vẫn còn hiệu lực. Nếu khóa thay đổi — nhà phát triển thêm một pin dự phòng trong bản cập nhật ứng dụng trước đó. Trong các dự án di động, chiến lược pin tối thiểu/tối đa được sử dụng: tối thiểu 2 pin bao gồm dự phòng và tối đa 4 để tránh phình to và tăng thời gian xác minh.
Việc lựa chọn loại pinning cụ thể phụ thuộc vào kiến trúc và yêu cầu của ứng dụng. Đối với các ứng dụng di động công cộng làm việc với API REST qua một tên miền duy nhất, Public Key Pinning với hai pin qua OkHttp hoặc TrustKit là tối ưu. Đối với các ứng dụng doanh nghiệp có tổ chức chứng thực riêng, CA Pinning phù hợp — nó không yêu cầu cập nhật khi chứng chỉ khách hàng thay đổi, vì sự tin cậy được gắn với CA, không phải chứng chỉ cuối. Đối với hệ thống IoT và nhúng, Certificate Pinning với gắn kết toàn bộ chứng chỉ được khuyến nghị: thiết bị hiếm khi được cập nhật, do đó kiểm soát toàn bộ chuỗi tin cậy là rất quan trọng. Giám sát ngày hết hạn của pin là thực hành bắt buộc: thiết lập cảnh báo 30, 14 và 7 ngày trước khi chứng chỉ hết hạn để phát hành bản cập nhật ứng dụng với pin mới trước khi chứng chỉ hiện tại trở nên không hợp lệ. Để tự động hóa việc phát hành các bản cập nhật với pin mới, nên sử dụng Firebase Remote Config hoặc API cấu hình tùy chỉnh cho phép cập nhật động danh sách pin mà không cần phát hành phiên bản mới trên cửa hàng ứng dụng.
Certificate Pinning tăng cường đáng kể bảo mật ứng dụng di động nhưng đặt gánh nặng vận hành lên nhóm phát triển. Điều quan trọng là cân nhắc lợi ích bảo mật so với rủi ro chặn kết nối do triển khai không đúng cách.
Ưu điểm chính là bảo vệ chống lại các cuộc tấn công Man-in-the-Middle, bao gồm các trường hợp xâm phạm CA. Pinning làm cho các chứng chỉ giả do kẻ tấn công phát hành trở nên vô dụng: ngay cả khi CA đã ký một chứng chỉ giả mạo, ứng dụng sẽ từ chối nó. Một lợi ích bổ sung là bảo vệ chống lại các máy chủ proxy doanh nghiệp thay thế chứng chỉ để kiểm tra lưu lượng. Theo Google Security Blog (2023), các ứng dụng có pinning có khả năng bị xâm phạm thông qua chặn lưu lượng thấp hơn 86% so với các ứng dụng chỉ sử dụng kiểm tra TLS tiêu chuẩn.
Nhược điểm chính của pinning là rủi ro tự chặn: nếu chứng chỉ máy chủ thay đổi (gia hạn, thay đổi nhà cung cấp, luân chuyển khóa) trước khi bản cập nhật ứng dụng được phát hành, người dùng mất quyền truy cập vào máy chủ. Nhược điểm bổ sung: độ phức tạp gỡ lỗi (mọi thay đổi cấu hình đều yêu cầu cập nhật pin), tăng kích thước APK thêm 5–15 KB khi sử dụng TrustKit và không thể khôi phục thay đổi nhanh chóng mà không có bản phát hành mới. Để giảm thiểu rủi ro, các pin dự phòng, luân chuyển tự động 2–3 tháng một lần và thời gian gia hạn được sử dụng, trong đó ứng dụng chấp nhận cả chứng chỉ cũ và mới. Cũng cần xem xét rằng trong quá trình phát triển với pinning được bật, các công cụ proxy (Burp Suite, Charles) không thể được sử dụng để gỡ lỗi các yêu cầu mạng — cho các bản dựng phát triển, pinning phải được tắt thông qua cờ BuildConfig.DEBUG và kiểm thử QA phải được thực hiện trên chữ ký phát hành với bảo vệ được bật. Một số nhóm sử dụng tên miền staging với chứng chỉ pinning riêng cho môi trường phát triển để duy trì bảo vệ ngay cả trong quá trình phát triển.
Hãy xem xét một ví dụ về triển khai Certificate Pinning trên Android sử dụng OkHttp — thư viện tiêu chuẩn cho các yêu cầu mạng. OkHttp cung cấp CertificatePinner tích hợp chấp nhận các hàm băm SHA-256 của khóa công khai.
val certificatePinner = CertificatePinner.Builder()
.add(
"api.example.com",
"sha256/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA="
)
.add(
"api.example.com",
"sha256/BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB="
)
.build()
val client = OkHttpClient.Builder()
.certificatePinner(certificatePinner)
.build()
Trong mã trên, chúng tôi thêm hai pin cho tên miền api.example.com: pin chính (chứng chỉ hiện tại) và pin dự phòng (cho luân chuyển). OkHttp tự động xác minh rằng chứng chỉ của máy chủ khớp với một trong các dấu vân tay SHA-256 được chỉ định. Để lấy dấu vân tay SHA-256 của chứng chỉ, sử dụng lệnh: openssl s_client -connect api.example.com:443 | openssl x509 -pubkey -noout | openssl pkey -pubin -outform der | openssl dgst -sha256 -binary | base64. Điều quan trọng là lưu trữ dấu vân tay không phải dưới dạng văn bản thuần trong mã, mà được mã hóa hoặc làm rối: phân tích tĩnh MobSF dễ dàng tìm thấy các chuỗi SHA-256 thô trong tệp DEX. Nên lưu trữ pin trong tài nguyên res/raw, được mã hóa qua AES và giải mã khi khởi động ứng dụng thông qua mã gốc (NDK/JNI).
Trên iOS, công cụ chính cho Certificate Pinning là thư viện mã nguồn mở TrustKit. Không giống như OkHttp, TrustKit được cấu hình khai báo thông qua Info.plist, cho phép thay đổi pin mà không cần biên dịch lại ứng dụng. Cấu hình bao gồm một từ điển với các tên miền và một mảng các dấu vân tay SHA-256 của khóa công khai. TrustKit tự động chặn các yêu cầu NSURLSession và xác minh chứng chỉ trước khi bắt đầu truyền dữ liệu. Một tính năng quan trọng của TrustKit là hỗ trợ báo cáo xác thực pin: thư viện có thể gửi báo cáo đến một điểm cuối được chỉ định khi xảy ra không khớp pin, cho phép phản ứng nhanh với các bất thường của chứng chỉ. Apple cũng cung cấp cơ chế gốc NSPinnedDomains trong Info.plist từ iOS 14, nhưng TrustKit vẫn là lựa chọn ưa thích do cấu hình linh hoạt hơn, hỗ trợ báo cáo và khả năng trao đổi pin nóng mà không cần cập nhật hệ điều hành. Điều quan trọng cần lưu ý là TrustKit tích hợp với URLSession thông qua delegate didReceiveChallenge, trả về .performDefaultHandling khi xác thực pin thành công và .cancelAuthenticationChallenge khi không khớp. Để giám sát các báo cáo xác thực pin, nên thiết lập một điểm cuối riêng phân tích tần suất lỗi: nếu số lượng báo cáo tăng mạnh — điều này có thể chỉ ra một cuộc tấn công MitM hoặc chứng chỉ sắp hết hạn yêu cầu cập nhật pin ngay lập tức.
Câu hỏi thường gặp
Certificate Pinning giống như lưu dấu vân tay của bạn bè trong điện thoại của bạn: bạn nhớ chứng chỉ máy chủ “đúng” trông như thế nào và không tin tưởng bất kỳ ai khác, ngay cả khi ai đó xuất trình giấy tờ tùy thân từ cơ quan “chính thức”.
HTTPS thông thường tin tưởng bất kỳ chứng chỉ nào được ký bởi bất kỳ CA nào trong số hàng trăm tổ chức. Certificate Pinning thêm một kiểm tra bên trên: chứng chỉ không chỉ phải hợp lệ, mà cụ thể phải là chứng chỉ bạn đã mã cứng trong mã ứng dụng.
Nên lưu trữ 2–3 pin: pin hiện tại và pin dự phòng cho chứng chỉ mới. 1–2 tháng trước khi thay đổi chứng chỉ, hãy phát hành phiên bản mới của ứng dụng với pin của chứng chỉ tương lai được thêm vào. Sau khi thay đổi, pin cũ sẽ bị xóa trong bản phát hành tiếp theo.
Có, được. Pinning hoạt động với mọi chứng chỉ, bao gồm Let’s Encrypt. Điều quan trọng cần nhớ là chứng chỉ miễn phí có thời hạn hiệu lực ngắn (3 tháng), do đó chiến lược pin dự phòng và luân chuyển tự động trở thành bắt buộc.
Sử dụng Burp Suite hoặc mitmproxy để kiểm tra pinning. Nếu ứng dụng với pinning được cấu hình đúng cách, công cụ proxy sẽ không thể chặn lưu lượng — kết nối sẽ bị chấm dứt ở giai đoạn bắt tay. Đối với kiểm thử tích hợp, hãy sử dụng MockWebServer của OkHttp.
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