Bạn đã ký với khóa gỡ lỗi do nhầm lẫn?
Google Play không cho phép bạn xuất bản một ứng dụng được ký với kho khóa gỡ lỗi của bạn. Nếu bạn cố tải lên APK như vậy, Google Play sẽ thất bại với thông báo "Bạn đã tải lên APK đã được đăng nhập ở chế độ gỡ lỗi. Bạn cần phải đăng nhập APK của mình ở chế độ phát hành."
Tuy nhiên, nếu bạn cố tải lên bản cập nhật được ký với kho khóa gỡ lỗi, bạn sẽ không thấy thông báo này; Google Play sẽ hiển thị thông báo hiển thị trong câu hỏi, đề cập đến dấu vân tay SHA1.
Vì vậy, trước tiên, hãy kiểm tra xem bạn đã ký ứng dụng với khóa gỡ lỗi chưa.
Làm cách nào để kiểm tra khóa ký nào đã được sử dụng?
Thu thập thông tin từ APK
Bạn có thể kiểm tra các chứng chỉ mà APK gốc và APK cập nhật đã được ký bằng cách sử dụng các lệnh này, sử dụng Java keytool
:
keytool -list -printcert -jarfile original.apk
keytool -list -printcert -jarfile update.apk
Điều này cho bạn thấy thông tin chi tiết về cách APK được ký, ví dụ:
Owner: CN=My App, O=My Company, L=Somewhere, C=DE
Issuer: CN=My App, O=My Company, L=Somewhere, C=DE
Serial number: 4790b086
Valid from: Mon Nov 11 15:01:28 GMT 2013 until: Fri Mar 29 16:01:28 BST 2041
Certificate fingerprints:
MD5: A3:2E:67:AF:74:3A:BD:DD:A2:A9:0D:CA:6C:D4:AF:20
SHA1: A6:E7:CE:64:17:45:0F:B4:C7:FC:76:43:90:04:DC:A7:84:EF:33:E9
SHA256: FB:6C:59:9E:B4:58:E3:62:AD:81:42:...:09:FC:BC:FE:E7:40:53:C3:D8:14:4F
Signature algorithm name: SHA256withRSA
Version: 3
Các phần quan trọng cần lưu ý ở đây - cho mỗi APK - là giá trị vân tay SHA1 , giá trị nhận dạng Chủ sở hữu và Hợp lệ từ / cho đến ngày.
Nếu keytool
lệnh đó không hoạt động ( -jarfile
tùy chọn yêu cầu Java 7), bạn có thể nhận thêm thông tin cơ bản thông qua jarsigner
lệnh:
jarsigner -verify -verbose:summary -certs original.apk
jarsigner -verify -verbose:summary -certs update.apk
Thật không may, điều này không hiển thị dấu vân tay SHA1, nhưng không hiển thị danh tính chủ sở hữu X.509, cùng với ngày hết hạn của chứng chỉ. Ví dụ:
sm 4642892 Thu Apr 17 10:57:44 CEST 2014 classes.dex (and 412 more)
X.509, CN=My App, O=My Company, L=Somewhere, C=DE
[certificate is valid from 11/11/13 12:12 to 29/03/41 12:12]
[CertPath not validated: Path does not chain with any of the trust anchors]
Bạn có thể bỏ qua mọi thông báo "CertPath không được xác thực", cùng với các cảnh báo về chuỗi chứng chỉ hoặc dấu thời gian; chúng không liên quan trong trường hợp này.
So sánh giá trị của Chủ sở hữu, SHA1 và Hết hạn giữa các APK
Nếu giá trị danh tính Chủ sở hữu / X.509 là CN=Android Debug, O=Android, C=US
, thì bạn đã ký APK bằng khóa gỡ lỗi , không phải khóa phát hành gốc
Nếu giá trị dấu vân tay SHA1 khác nhau giữa các APK gốc và cập nhật, thì bạn đã không sử dụng cùng một khóa ký cho cả hai APK
Nếu giá trị nhận dạng của Chủ sở hữu / X.509 khác nhau hoặc ngày hết hạn của chứng chỉ khác nhau giữa hai APK, thì bạn đã không sử dụng cùng một khóa ký cho cả hai APK
Lưu ý rằng ngay cả khi các giá trị Chủ sở hữu / X.509 giống hệt nhau giữa hai chứng chỉ, điều này không có nghĩa là các chứng chỉ giống hệt nhau - nếu mọi thứ khác không khớp - chẳng hạn như các giá trị dấu vân tay - thì các chứng chỉ khác nhau.
Tìm kiếm kho khóa gốc, kiểm tra bản sao lưu
Nếu hai APK có thông tin chứng chỉ khác nhau, thì bạn phải tìm kho khóa gốc, tức là tệp có giá trị vân tay SHA1 đầu tiên mà Google Play (hoặc keytool
) đã nói với bạn.
Tìm kiếm trong tất cả các tệp kho khóa bạn có thể tìm thấy trên máy tính của mình và trong mọi bản sao lưu bạn có, cho đến khi bạn có tệp có dấu vân tay SHA1 chính xác:
keytool -list -keystore my-release.keystore
Chỉ cần nhấn Enternếu được nhắc nhập mật khẩu - bạn không nhất thiết phải nhập mật khẩu nếu bạn chỉ muốn kiểm tra nhanh giá trị SHA1.
Tôi không thể tìm thấy kho khóa gốc ở bất cứ đâu
Nếu bạn không thể tìm thấy kho khóa gốc, bạn sẽ không bao giờ có thể xuất bản bất kỳ bản cập nhật nào cho ứng dụng cụ thể này.
Android đề cập rõ ràng điều này trên trang Ký ứng dụng của bạn :
Cảnh báo: Giữ kho khóa và khóa riêng của bạn ở nơi an toàn và bảo mật, và đảm bảo rằng bạn có bản sao lưu an toàn của chúng. Nếu bạn xuất bản ứng dụng lên Google Play và sau đó mất khóa mà bạn đã ký ứng dụng, bạn sẽ không thể xuất bản bất kỳ bản cập nhật nào cho ứng dụng của mình, vì bạn phải luôn ký tất cả các phiên bản ứng dụng của mình bằng cùng một khóa.
Sau lần phát hành đầu tiên của APK, tất cả các bản phát hành tiếp theo phải được ký với cùng một khóa chính xác.
Tôi có thể trích xuất khóa ký ban đầu từ APK gốc không?
Không, điều này là không thể. APK chỉ chứa thông tin công khai chứ không chứa thông tin khóa riêng của bạn.
Tôi có thể chuyển sang khóa ký mới không?
Không. Ngay cả khi bạn tìm thấy bản gốc, bạn không thể ký APK bằng khóa A, sau đó ký bản cập nhật tiếp theo bằng cả hai phím A và B, sau đó ký bản cập nhật tiếp theo sau đó chỉ bằng phím B.
Việc ký APK (hoặc bất kỳ tệp JAR nào) bằng nhiều khóa là có thể về mặt kỹ thuật , nhưng Google Play không còn chấp nhận APK có nhiều chữ ký.
Cố gắng làm như vậy sẽ dẫn đến thông báo "APK của bạn đã được ký với nhiều chứng chỉ. Vui lòng chỉ ký tên với một chứng chỉ và tải lại."
Tôi có thể làm gì?
Bạn sẽ phải xây dựng ứng dụng của mình bằng ID ứng dụng mới (ví dụ: thay đổi từ "com.example.myapp" thành "com.example.myapp2") và tạo một danh sách hoàn toàn mới trên Google Play.
Có thể bạn cũng sẽ phải thay đổi mã của mình để mọi người có thể cài đặt ứng dụng mới ngay cả khi họ đã cài đặt ứng dụng cũ, ví dụ: bạn cần đảm bảo rằng bạn không có nhà cung cấp nội dung xung đột.
Bạn sẽ mất cơ sở cài đặt hiện tại, đánh giá, v.v. và sẽ phải tìm cách khiến khách hàng hiện tại của bạn gỡ cài đặt ứng dụng cũ và cài đặt phiên bản mới.
Một lần nữa, đảm bảo bạn có bản sao lưu an toàn của kho khóa và mật khẩu bạn sử dụng cho phiên bản này.