Certificate Pinning là cÆ¡ chế cố định chứng chỉ hoặc khóa công khai cá»§a máy chá»§, trong đó ứng dụng sá» dụng dấu vá»n tay đã biết trước để xác thá»±c kết nối HTTPS. Khác vá»›i chuá»—i tin cáºy tiêu chuẩn thông qua CA, pinning đảm bảo rằng ngay cả má»™t tổ chức chứng thá»±c bị xâm nháºp cÅ©ng không thể cấp chứng chỉ giả mạo cho miá»n cá»§a bạn. Theo OWASP MSTG (2025), Certificate Pinning nằm trong danh sách các kiểm soát bắt buá»™c cho ứng dụng ở mức bảo vệ L2. Việc triển khai bao gồm lưu trữ băm chứng chỉ trong mã và xác thá»±c ở má»—i yêu cầu.
Các Ä‘iểm chÃnh
Certificate Pinning là má»™t kỹ thuáºt bảo máºt mà ứng dụng lưu trữ dấu vân tay cá»§a má»™t chứng chỉ đáng tin cáºy và sá» dụng nó như tiêu chà duy nhất để thiết láºp kết nối HTTPS. Trong mô hình TLS tiêu chuẩn, máy khách xác thá»±c rằng chứng chỉ cá»§a máy chá»§ được ký bởi má»™t CA gốc đáng tin cáºy — bất kỳ má»™t trong số hà ng trăm tổ chức chứng thá»±c được cà i đặt sẵn trong hệ thống. Certificate Pinning thay thế chuá»—i nà y bằng má»™t kiểm tra trá»±c tiếp: chứng chỉ phải khá»›p vá»›i mẫu đã lưu hoặc chứa khóa công khai dá»± kiến.
Vấn Ä‘á»� vá»›i mô hình tiêu chuẩn trở nên rõ rà ng sau các sá»± cố xâm nháºp CA — DigiNotar (2011), Comodo (2011), TrustCor (2022). Nếu má»™t CA cấp chứng chỉ giả mạo cho miá»n cá»§a bạn, trình duyệt hoặc ứng dụng sẽ chấp nháºn nó là hợp lệ. Certificate Pinning ngăn chặn cuá»™c tấn công nà y: ngay cả má»™t chứng chỉ giả mạo được ký hoà n hảo cÅ©ng sẽ bị từ chối vì dấu vân tay cá»§a nó không khá»›p vá»›i dấu đã cố định trong ứng dụng.
Thuáºt ngữ pinning bắt nguồn từ pin — “chốt” hoặc “váºt cố định”: nhà phát triển cố định má»™t chứng chỉ đáng tin cáºy, và bất kỳ sai lệch nà o khá»�i nó sẽ chặn kết nối. Theo nghiên cứu cá»§a Mitre CWE-295, việc xác thá»±c chứng chỉ không đúng cách vẫn là má»™t trong 10 lá»—i bảo máºt nguy hiểm nhất trong các ứng dụng di động, và Certificate Pinning là phương pháp trá»±c tiếp để ngăn chặn nó.
Ban đầu, Certificate Pinning được sá» dụng trong trình duyệt thông qua cÆ¡ chế HPKP (HTTP Public Key Pinning), được tiêu chuẩn hóa trong RFC 7469. Nhà phát triển gá»i má»™t tiêu Ä‘á»� HTTP Public-Key-Pins chứa băm cá»§a các khóa dá»± kiến, và trình duyệt lưu trữ chúng trong má»™t khoảng thá»�i gian nhất định. Tuy nhiên, HPKP hóa ra nguy hiểm: chỉ má»™t lá»—i cấu hình có thể chặn má»™t trang web trong nhiá»�u tháng. Năm 2018, Chrome ngừng há»— trợ HPKP, và tiêu chuẩn hiện tại trở thà nh triển khai phÃa máy khách — bên trong ứng dụng di động hoặc tiện Ãch mở rá»™ng trình duyệt.
Quá trình Certificate Pinning bao gồm ba giai Ä‘oạn chÃnh: tÃnh toán dấu vân tay, xác thá»±c kết nối và xá» lý lá»—i. Trong giai Ä‘oạn chuẩn bị, nhà phát triển lấy băm SHA-256 cá»§a chứng chỉ hoặc khóa công khai cá»§a máy chá»§ sản xuất. Ä�ối vá»›i các ứng dụng tuân thá»§ GDPR và PCI DSS, cÅ©ng cần cố định dấu vân tay cá»§a các CA trung gian trong chuá»—i.
Vá»›i má»—i yêu cầu HTTPS, ứng dụng chặn callback xác thá»±c TLS, trÃch xuất chứng chỉ cá»§a máy chá»§ và tÃnh toán băm SHA-256 cá»§a nó. Băm nà y được so sánh vá»›i danh sách các dấu vân tay đáng tin cáºy đã lưu. Nếu tìm thấy sá»± khá»›p — kết nối tiếp tục. Nếu không — ứng dụng phải ngắt kết nối và báo cáo lá»—i mà không tiết lá»™ chi tiết triển khai cho kẻ tấn công.
fun validateCertificate(certificate: X509Certificate,
expectedHash: String): Boolean {
val digest = MessageDigest.getInstance("SHA-256")
val hash = Base64.encodeToString(
digest.digest(certificate.publicKey.getEncoded()),
Base64.DEFAULT
).trim()
return hash == expectedHash
}
Hà m nháºn má»™t đối tượng X509Certificate từ máy chá»§ và băm dá»± kiến. Nó đầu tiên trÃch xuất khóa công khai cá»§a chứng chỉ, tÃnh toán băm SHA-256 và mã hóa nó thà nh Base64. Kết quả được so sánh vá»›i dấu vân tay dá»± kiến. Trong môi trưá»�ng sản xuất, bạn nên thêm xác thá»±c vá»›i má»™t mảng gồm 2–3 dấu vân tay để há»— trợ luân chuyển.
Khi triển khai pinning, cần chá»�n đối tượng máºt mã nà o để cố định. Certificate Pinning liên kết vá»›i chÃnh chứng chỉ X.509 — số sê-ri, thá»�i hạn hiệu lá»±c và toà n bá»™ chuá»—i. Public Key Pinning chỉ cố định khóa công khai bên trong chứng chỉ, bá»� qua các trưá»�ng khác. Sá»± lá»±a chá»�n nà y ảnh hưởng đáng kể đến chi phà váºn hà nh.
| Tiêu chà | Certificate Pinning | Public Key Pinning |
|---|---|---|
| �ối tượng cố định | Toà n bộ chứng chỉ X.509 | Khóa công khai RSA/ECDSA |
| Luân chuyển | Yêu cầu cáºp nháºt má»—i lần cấp lại | Không thay đổi khi gia hạn chứng chỉ vá»›i cùng khóa |
| Bảo máºt | Liên kết chÃnh xác tối Ä‘a | Ã�t nhạy cảm vá»›i chi tiết |
| Linh hoạt | Thấp — chứng chỉ thay đổi má»—i 1–2 năm | Cao — khóa có thể dùng 5–10 năm |
| Khuyến nghị | Cho hệ thống quan trá»�ng có cáºp nháºt kiểm soát | Cho hầu hết ứng dụng di động và API |
Public Key Pinning là lá»±a chá»�n ưu tiên cho hầu hết các dá»± án. Các khóa công khai cá»§a máy chá»§ thưá»�ng không thay đổi khi cấp lại chứng chỉ — công ty chỉ ký khóa cÅ© vá»›i chứng chỉ má»›i. Ä�iá»�u nà y có nghÄ©a là ứng dụng không yêu cầu cáºp nháºt sau khi thay đổi chứng chỉ nếu cặp khóa không thay đổi. Ngược lại, Certificate Pinning được khuyến nghị cho các kịch bản mà nhà phát triển kiểm soát hoà n toà n cả máy chá»§ và mã máy khách, chẳng hạn như ứng dụng doanh nghiệp vá»›i chu kỳ cáºp nháºt chặt chẽ.
TOFU là má»™t chiến lược mà Certificate Pinning không được cấu hình trước mà ghi nhá»› chứng chỉ ở kết nối đầu tiên vá»›i máy chá»§. Cách tiếp cáºn nà y thuáºn tiện cho các ứng dụng không biết trước sẽ kết nối vá»›i máy chá»§ nà o. Nhược Ä‘iểm là dá»… bị tấn công ban đầu: nếu kết nối đầu tiên bị chặn, má»™t chứng chỉ giả mạo sẽ được chấp nháºn là đáng tin cáºy. TOFU được sá» dụng trong các kết nối SSH và má»™t số giao thức P2P.
Trên cả hai ná»�n tảng, Certificate Pinning được triển khai bằng cách chặn kết nối TLS ở cấp độ ngăn xếp mạng. Trên iOS, á»§y quyá»�n URLSession hoặc Alamofire ServerTrustManager được sá» dụng. Trên Android, phương pháp ưu tiên là OkHttp CertificatePinner, được tÃch hợp trong các trình khách HTTP phổ biến và há»— trợ cấu hình nhiá»�u dấu vân tay cho má»—i miá»n.
func validate(serverTrust: SecTrust,
pinnedHash: String) -> Bool {
guard let certificates = SecTrustCopyCertificateChain(serverTrust)
as? [SecCertificate] else { return false }
for certificate in certificates {
let data = SecCertificateCopyData(certificate)
var hash = Data(repeating: 0, count: Int(CC_SHA256_DIGEST_LENGTH))
data.withUnsafeBytes {
CC_SHA256($0.baseAddress,
CC_LONG(data.count), &hash)
}
if hash.base64EncodedString() == pinnedHash {
return true
}
}
return false
}
Trong hà m Swift, chuá»—i chứng chỉ được trÃch xuất từ serverTrust, băm SHA-256 được tÃnh cho má»—i chứng chỉ, và kết quả được so sánh vá»›i dá»± kiến. Việc lăp qua tất cả các chứng chỉ trong chuá»—i cho phép triển khai pinning ở cấp độ CA trung gian — nếu chứng chỉ trung gian khá»›p, kết nối được chấp nháºn. Ä�iá»�u nà y mang lại sá»± linh hoạt khi luân chuyển chứng chỉ lá.
Nếu ứng dụng không sỠdụng OkHttp, Certificate Pinning có thể được triển khai thông qua X509TrustManager tùy chỉnh. Phương pháp nà y yêu cầu nhi�u mã hơn nhưng cung cấp kiểm soát hoà n toà n quá trình xác thực. TrustManager ghi đè phương thức checkServerTrusted, nơi nhà phát triển tự xác thực thủ công các chứng chỉ của máy chủ và quyết định có tin tưởng hay không. Nó chỉ được khuyến nghị cho các kịch bản cụ thể m� thư viện OkHttp không có sẵn.
Lá»—i phổ biến nhất là thiếu backup pins. Nhà phát triển chỉ bao gồm má»™t dấu vân tay chứng chỉ duy nhất, và khi nó hết hạn, ngưá»�i dùng mất kết nối hà ng loạt. Cấu hình tối thiểu chấp nháºn được là hai dấu vân tay: chứng chỉ hiện tại và má»™t dá»± phòng. Lý tưởng là ba: hiện tại, má»™t dá»± phòng và dấu vân tay CA gốc là m phương án dá»± phòng.
Lá»—i thứ hai là lưu trữ pins ở dạng văn bản thuần trong mã. Kẻ tấn công có quyá»�n truy cáºp APK hoặc IPA có thể dá»… dà ng trÃch xuất và thay thế các dấu vân tay. Nên là m mÆ¡ băm: chia chuá»—i thà nh các phần, lưu trữ trong tà i nguyên đã mã hóa hoặc tÃnh toán trong thá»�i gian chạy. Ä�ối vá»›i Android, ProGuard vá»›i tÃnh năng là m mÆ¡ hằng chuá»—i là hiệu quả.
Lỗi thứ ba là pinning ở cấp độ chứng chỉ phát triển. Chứng chỉ phát triển và sản xuất thư�ng khác nhau, nhưng nhà phát triển thư�ng quên chuyển đổi pins khi xây dựng bản release. Kết quả là ứng dụng sản xuất không thể kết nối với máy chủ. Giải pháp là các cấu hình pin riêng cho debug và release thông qua BuildConfig hoặc tà i nguyên theo flavor.
Câu h�i thư�ng gặp
SSL Pinning là thuáºt ngữ chung cho việc liên kết vá»›i chứng chỉ SSL/TLS. Certificate Pinning là má»™t triển khai cụ thể cố định chÃnh chứng chỉ X.509, chứ không chỉ khóa công khai. Sá»± khác biệt nằm ở đối tượng liên kết: chứng chỉ so vá»›i khóa.
Nên lưu trữ băm trong tà i nguyên vá»›i tÃnh năng là m mÆ¡ qua ProGuard (Android) hoặc mã hóa qua Keychain (iOS). Tránh lưu trữ pins ở dạng văn bản thuần trong strings.xml hoặc Info.plist mà không mã hóa.
Má»—i khi thay đổi chứng chỉ trên máy chá»§. Nên thêm má»™t dấu vân tay má»›i là m backup pin 3–6 tháng trước khi dấu hiện tại hết hạn và xóa dấu cÅ© sau khi luân chuyển. Ã�t nhất má»™t backup pin là bắt buá»™c.
Có, thông qua biên dịch có Ä‘iá»�u kiện: pinning bị tắt trong bản debug và được báºt trong bản release. Sá» dụng BuildConfig.DEBUG trên Android hoặc #if DEBUG trên iOS để chuyển đổi. Không bao giá»� thá»±c hiện Ä‘iá»�u nà y thông qua cá»� chạy mà ngưá»�i dùng có thể truy cáºp.
Ngay láºp tức phát hà nh bản cáºp nháºt ứng dụng vá»›i dấu vân tay má»›i và công bố lên các cá»a hà ng. Sá» dụng cÆ¡ chế cáºp nháºt bắt buá»™c. Nếu backup pins bao gồm dấu vân tay cá»§a CA dá»± phòng, bạn có thể tạm thá»�i chuyển sang má»™t miá»�n khác vá»›i chứng chỉ khác.
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