Keystore là một kho lưu trữ mật mã an toàn được sử dụng trong phát triển Android để lưu trữ khóa riêng tư và chứng chỉ ký ứng dụng. Theo Android Developers Documentation, 2026, mọi APK hoặc App Bundle phải được ký bằng chữ ký số từ Keystore trước khi xuất bản lên Google Play. Hãy cùng tìm hiểu về các định dạng Keystore, cách tạo và sử dụng trong dự án.
Những điểm chính
Keystore (KeyStore) là một cơ chế tiêu chuẩn của Java Cryptography Architecture (JCA) để lưu trữ khóa mật mã, chứng chỉ và các mục đáng tin cậy. Trong phát triển Android, Keystore được sử dụng để lưu trữ khóa riêng tư dùng để ký ứng dụng trước khi xuất bản. Chữ ký đảm bảo rằng ứng dụng thực sự được phát hành bởi nhà phát triển đã chỉ định và mã của nó không bị thay đổi sau khi xuất bản. Mọi bản cập nhật ứng dụng phải được ký bằng cùng một khóa, nếu không Google Play sẽ từ chối APK hoặc App Bundle.
Keystore có thể chứa nhiều mục (bí danh), mỗi mục đại diện cho một cặp khóa (riêng tư và công khai) với một chứng chỉ. Bí danh (Alias) là tên mục duy nhất mà ứng dụng sử dụng để truy cập khóa trong quá trình ký. Trong một dự án Android điển hình, Keystore chứa một mục để ký phiên bản phát hành và có thể chứa các mục bổ sung để ký các bản dựng gỡ lỗi. Google Play Console hiển thị dấu vân tay chứng chỉ SHA-1 và SHA-256 cho mỗi ứng dụng đã tải lên.
Android Studio bao gồm hỗ trợ Keystore tích hợp thông qua menu Build → Generate Signed Bundle / APK. Trình hướng dẫn ký của Android Studio cho phép bạn tạo Keystore mới hoặc chọn Keystore hiện có, chỉ định bí danh, mật khẩu Keystore và khóa, cũng như dữ liệu chứng chỉ (tên tổ chức, thành phố, quốc gia). Dữ liệu này được nhúng vào chứng chỉ và hiển thị cho người dùng khi xác minh chữ ký APK. Google Play yêu cầu chứng chỉ có hiệu lực ít nhất 25 năm — Android kiểm tra ngày hết hạn khi cài đặt ứng dụng.
Các bản cập nhật ứng dụng trên Google Play chỉ có thể thực hiện được với cùng một khóa đã ký phiên bản đầu tiên. Nếu Keystore bị mất, không thể xuất bản bản cập nhật — ứng dụng sẽ phải được phát hành lại với tên gói khác. Theo Google Play Console Help (2026), khóa ký ứng dụng chỉ có thể được khôi phục thông qua Google Play App Signing — một dịch vụ lưu trữ khóa về phía Google. Nếu nhà phát triển đã sử dụng tùy chọn này, việc mất Keystore cục bộ không phải là vấn đề nghiêm trọng.
Quy trình ký một ứng dụng Android bao gồm việc tạo một bản tóm tắt (hash) nội dung APK và mã hóa nó bằng khóa riêng tư từ Keystore. Android SDK Build Tools bao gồm tiện ích apksigner, thực hiện ký bằng APK Signature Scheme v2 (hoặc v3 cho Android 9+). Khi cài đặt ứng dụng, Android xác minh chữ ký: giải mã chữ ký bằng khóa công khai của chứng chỉ, so sánh hash APK với bản gốc — nếu hash không khớp, quá trình cài đặt bị từ chối.
Android hỗ trợ nhiều lược đồ ký: v1 (ký JAR), v2 (APK Signature Scheme), v3 (APK Signature Scheme với hỗ trợ xoay vòng khóa) và v4 (cài đặt gia tăng cho Android 11+). Google Play yêu cầu v2 hoặc v3 cho các ứng dụng mới. apksigner tự động thêm tất cả các lược đồ cần thiết trong quá trình ký nếu khóa hỗ trợ các thuật toán tương ứng. Android 11+ hỗ trợ cài đặt ADB với chữ ký v4, giúp tăng tốc tải gia tăng các APK lớn lên thiết bị.
Thuật toán: Android khuyến nghị sử dụng RSA-2048 hoặc ECDSA P-256 cho khóa ký. Chứng chỉ phải là X.509 v3. Android xác minh rằng chứng chỉ còn hiệu lực tại thời điểm cài đặt — nếu hết hạn, quá trình cài đặt bị chặn. Đây là lý do Google khuyến nghị đặt thời hạn hiệu lực của chứng chỉ ít nhất 25 năm. Google Play App Signing sử dụng hai khóa: khóa ký ứng dụng (app signing key) và khóa tải lên (upload key) — nhà phát triển sử dụng khóa tải lên để tải APK lên Console và Google ký ứng dụng cho người dùng bằng khóa chính.
Java hỗ trợ hai định dạng Keystore chính: JKS (Java KeyStore) — định dạng độc quyền của Oracle đã tồn tại từ JDK 1.2 và PKCS12 — định dạng Public-Key Cryptography Standards #12 đã được chuẩn hóa từ RSA Laboratories. JKS sử dụng định dạng lưu trữ dữ liệu riêng và chỉ được hỗ trợ trong hệ sinh thái Java. PKCS12 là một tiêu chuẩn mở được hỗ trợ bởi Java, .NET, OpenSSL, Python (cryptography) và hầu hết các thư viện mật mã khác.
Google Play khuyến nghị PKCS12 là định dạng ưa thích cho các Keystore mới được tạo sau năm 2021. JDK 9 trở lên tạo Keystore ở định dạng PKCS12 theo mặc định (trước đây mặc định là JKS). Ưu điểm chính của PKCS12 là khả năng tương thích: tệp .p12 có thể được mở trong bất kỳ môi trường nào không phụ thuộc vào Java. OpenSSL có thể trích xuất chứng chỉ từ PKCS12 và chuyển đổi chúng sang định dạng PEM. Các tệp JKS yêu cầu tiện ích JDK để đọc và không thể xử lý bằng OpenSSL.
Việc chuyển đổi giữa các định dạng được thực hiện bằng tiện ích keytool từ JDK. Khi di chuyển từ JKS sang PKCS12, hãy đảm bảo rằng tất cả bí danh và mật khẩu được chuyển đúng cách. Lệnh keytool -importkeystore cho phép nhập nội dung của Keystore này sang Keystore khác bất kể định dạng. Sau khi chuyển đổi, tốt nhất nên xóa tệp JKS cũ để tránh nhầm lẫn về phiên bản khóa. Android Studio hỗ trợ cả hai định dạng khi tạo bản dựng đã ký.
| Đặc điểm | JKS | PKCS12 |
|---|---|---|
| Tiêu chuẩn | Độc quyền (Oracle) | Mở (RSA Labs) |
| Phần mở rộng | .jks / .keystore | .p12 / .pfx |
| Hỗ trợ | Chỉ Java | Java, OpenSSL, .NET, Python |
| Mặc định | Đến JDK 8 | JDK 9+ |
| Khuyến nghị của Google | Kế thừa | Ưa thích |
Tiện ích keytool là một phần của JDK (Java Development Kit) và cung cấp một bộ lệnh hoàn chỉnh để tạo, xem và quản lý Keystore. Để tạo Keystore mới với một cặp khóa, sử dụng lệnh keytool -genkeypair với định dạng PKCS12, thuật toán RSA, kích thước khóa và thời hạn hiệu lực của chứng chỉ. Google Play yêu cầu chứng chỉ có hiệu lực ít nhất 25 năm (9125 ngày) — nên chỉ định giá trị này trong tham số -validity.
Ví dụ tạo Keystore ở định dạng PKCS12 cho dự án Android. Tham số -dname chứa Distinguished Name X.500 của chứng chỉ. Tham số -ext bao gồm Subject Alternative Name nếu cần — đối với Android, Basic Constraints là đủ:
# Tạo Keystore PKCS12 cho Android
keytool -genkeypair -alias "upload_key" \
-keyalg RSA -keysize 2048 -validity 9125 \
-keystore "release-keystore.p12" \
-storetype PKCS12 \
-dname "CN=Developer,O=Company,C=RU"
Keytool sẽ yêu cầu mật khẩu Keystore và mật khẩu khóa (có thể giống nhau). Tham số -storetype PKCS12 tạo tệp ở định dạng hiện đại. -keysize 2048 đáp ứng yêu cầu của Google về kích thước khóa RSA tối thiểu. -validity 9125 (25 năm) đảm bảo khả năng tương thích trong suốt vòng đời dự kiến của ứng dụng. Sau khi tạo Keystore, nên kiểm tra nội dung của nó bằng lệnh keytool -list -v -keystore release-keystore.p12.
Để kiểm tra các mục Keystore, sử dụng lệnh với cờ -list. Đầu ra bao gồm bí danh, ngày tạo và hết hạn, loại mục và dấu vân tay SHA-256. Android Studio hiển thị cùng thông tin trong hộp thoại Generate Signed Bundle / APK khi chọn Keystore hiện có:
# Xem các mục Keystore
keytool -list -v -keystore "release-keystore.p12" \
-storetype PKCS12
Trong đường ống CI/CD, Keystore phải được lưu trữ an toàn và chuyển đến tác nhân xây dựng mà không có nguy cơ bị xâm phạm. GitHub Actions cung cấp Secrets để lưu trữ tệp nhị phân ở định dạng base64. Keystore được mã hóa bằng lệnh base64, chuỗi kết quả được lưu trong bí mật kho lưu trữ và trong giai đoạn xây dựng, nó được giải mã trở lại thành tệp. GitLab CI sử dụng cơ chế tương tự thông qua Variables loại File.
Ví dụ về thiết lập bản dựng CI với Keystore trong GitHub Actions bao gồm giải mã Keystore từ bí mật, cấu hình thuộc tính Gradle và thực thi bản dựng đã ký. Gradle, plugin Android, đọc đường dẫn Keystore và mật khẩu từ tệp keystore.properties (được loại trừ khỏi .gitignore cho phát triển cục bộ) hoặc từ biến môi trường của hệ thống CI:
// build.gradle (app) — cấu hình ký
@Override
android {
signingConfigs {
release {
storeFile file("release-keystore.p12")
storePassword System.getenv("STORE_PASSWORD")
keyAlias System.getenv("KEY_ALIAS")
keyPassword System.getenv("KEY_PASSWORD")
}
}
buildTypes {
release {
signingConfig signingConfigs.release
}
}
}
Gradle đọc các biến môi trường do hệ thống CI đặt. Tệp Keystore nên được đặt trong thư mục gốc của mô-đun ứng dụng, như được chỉ định trong storeFile. Vì lý do bảo mật, không bao giờ lưu trữ mật khẩu trong kho lưu trữ — hãy sử dụng Secrets của hệ thống CI. Fastlane cho Android cung cấp plugin supply, hoạt động với Google Play Console, nhưng việc ký APK vẫn yêu cầu Keystore cục bộ trên tác nhân.
Một giải pháp thay thế là Google Play App Signing. Khi sử dụng tùy chọn này, nhà phát triển chỉ tải khóa tải lên (upload key) lên Google Play và Google ký APK cuối cùng bằng khóa riêng của mình. Trong trường hợp này, Keystore chỉ được sử dụng để tạo khóa tải lên và việc mất nó không chặn các bản cập nhật — có thể tạo khóa tải lên mới và đăng ký trong Console. Google Play App Signing là bắt buộc đối với các ứng dụng mới kể từ tháng 8 năm 2021.
Mất Keystore là một trong những vấn đề nghiêm trọng nhất trong phát triển Android. Không có bản sao lưu, không thể phát hành bản cập nhật cho ứng dụng hiện có — Google Play từ chối các APK được ký bằng khóa khác. Nên giữ ít nhất hai bản sao lưu Keystore ở các kho lưu trữ vật lý hoặc đám mây khác nhau: ví dụ: tệp được mã hóa trong kho lưu trữ đám mây của nhóm và phương tiện vật lý trong két an toàn của tổ chức. Mật khẩu Keystore và khóa được lưu trữ riêng biệt với tệp, ví dụ: trong trình quản lý mật khẩu có kiểm soát truy cập.
Android Studio, khi tạo Keystore mới trong hộp thoại Generate Signed Bundle / APK, đề nghị ghi nhớ đường dẫn cho các bản dựng trong tương lai. Tuy nhiên, bản thân môi trường phát triển không tạo bản sao lưu — đây là trách nhiệm của nhà phát triển. Đối với phát triển nhóm, nên sử dụng Google Play App Signing với khóa tải lên được truyền qua kênh an toàn cho tất cả thành viên trong nhóm. Gradle có thể tự động ký các bản dựng gỡ lỗi bằng debug.keystore được tạo, không yêu cầu sao lưu — nó giống nhau cho tất cả các cài đặt Android Studio.
Bảo mật Keystore khi truyền: các tệp .p12 hoặc .jks chỉ được truyền qua các kênh được mã hóa (SFTP, HTTPS, tệp đính kèm email được mã hóa). Không bao giờ đưa Keystore vào kho lưu trữ mã nguồn — ngay cả kho riêng tư. GitGuardian hoặc GitHub secret scanning tự động phát hiện việc công bố thông tin xác thực, nhưng lưu trữ Keystore trong kho lưu trữ vẫn là vi phạm bảo mật. Đối với CI/CD, hãy sử dụng cơ chế bí mật của nền tảng (GitHub Actions Secrets, GitLab CI Variables, Jenkins Credentials) với mã hóa ở cấp cơ sở hạ tầng.
Các câu hỏi thường gặp
Nếu bạn đang sử dụng Google Play App Signing, chỉ mất khóa tải lên — bạn có thể tạo khóa mới và đăng ký nó trong Google Play Console. Nếu App Signing không được bật, mất Keystore đồng nghĩa với việc bạn không thể cập nhật ứng dụng — bạn sẽ phải xuất bản ứng dụng mới với tên gói khác.
Có, một Keystore có thể chứa nhiều bí danh (mục) với các khóa khác nhau cho các ứng dụng khác nhau. Nên sử dụng một bí danh riêng cho mỗi ứng dụng trong cùng một Keystore. Google Play hỗ trợ các khóa khác nhau cho các ứng dụng khác nhau — không có hạn chế nào về việc sử dụng một Keystore cho nhiều dự án.
Android hỗ trợ cả hai thuật toán, nhưng ECDSA P-256 được ưa thích hơn: nó cung cấp bảo mật tương đương RSA-2048 với kích thước chữ ký nhỏ hơn và xác minh nhanh hơn. Tuy nhiên, nếu yêu cầu tương thích với Android 4.4 trở xuống, hãy chọn RSA — ECDSA chỉ được hỗ trợ trên Android 4.3+.
Android kiểm tra thời hạn hiệu lực của chứng chỉ khi cài đặt ứng dụng. Nếu chứng chỉ đã hết hạn, quá trình cài đặt bị chặn — ngay cả khi đó là bản cập nhật của ứng dụng hiện có. 25 năm là thời hạn tối thiểu được Google khuyến nghị để bao phủ toàn bộ vòng đời dự kiến của ứng dụng di động mà không cần cấp chứng chỉ mới.
Debug.keystore được tạo tự động bởi Android SDK và được sử dụng để ký các bản dựng gỡ lỗi. Nó giống nhau cho tất cả các cài đặt Android Studio (mật khẩu tiêu chuẩn: android). Keystore phát hành được nhà phát triển tạo để ký phiên bản xuất bản trên Google Play và phải được giữ an toàn — việc mất nó là nghiêm trọng.
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