Apk phải được ký với các chứng chỉ giống như phiên bản trước


200

Tôi đã tải ứng dụng của mình lên Google Play (trước đây khi nó được gọi là Android Market).

Hôm nay tôi đã cập nhật ứng dụng, nhưng tôi đã xóa kho khóa trước đó và tạo một cái mới.
Khi tải lên, nó cho biết APK phải được ký với cùng các chứng chỉ như phiên bản trước:

Tải lên thất bại

Bạn đã tải lên một APK được ký với một chứng chỉ khác với các APK trước đó của bạn. Bạn phải sử dụng cùng một chứng chỉ.

Các APK hiện có của bạn được ký với (các) chứng chỉ bằng dấu vân tay:
[SHA1: 89: 2F: 11: FE: CE: D6: CC: DF: 65: E7: 76: 3E: DD: A7: 96: 4F: 84: DD: BA: 33]
và (các) chứng chỉ được sử dụng để ký APK bạn đã tải lên có dấu vân tay:
[SHA1: 20: 26: F4: C1: DF: 0F: 2B: D9: 46: 03: FF: AB: 07: B1: 28: 7B: 9C: 75: 44: CC]

Nhưng tôi không có chứng chỉ này và không muốn xóa và xuất bản lại ứng dụng, vì nó có người dùng hoạt động.

Tôi có thể làm gì để ký ứng dụng của mình với chứng chỉ mới?


26
Tôi đang gặp một vấn đề khác: Tôi đã cố nâng cấp một ứng dụng nhưng nó khiến tôi nói lỗi này. Thực tế là, tôi chưa bao giờ thay đổi kho khóa !!! Tôi có thể làm gì?!?
Mariux

bạn đã giải quyết như thế nào ??
Elizabeth

@ int_32 bạn giải quyết thế nào ??
Amit Sharma

Câu trả lời:


187

Không có gì. Đọc tài liệu: Xuất bản cập nhật trên Android Market

Trước khi tải lên ứng dụng được cập nhật, hãy chắc chắn rằng bạn đã tăng các thuộc tính android: versionCode và android: versionName trong thành phần của tệp kê khai. Ngoài ra, tên gói phải giống nhau và .apk phải được ký với cùng khóa riêng. Nếu tên gói và chứng chỉ ký không khớp với phiên bản hiện tại, Market sẽ coi đó là một ứng dụng mới và sẽ không cung cấp cho người dùng dưới dạng cập nhật.


14
Câu trả lời chính xác. Tôi không bao giờ nhận ra rằng nếu mất khóa thì ứng dụng không thể được cập nhật. Phải ghi nhớ để sao lưu chìa khóa ở nơi an toàn.
Peter Knego

18
Những gì tôi sẽ làm bình thường là lưu trữ tệp kho khóa trong svn. Đặt một thư mục mới có tên là thông tin xác thực, cùng với thân / thẻ / nhánh và lưu trữ tệp kho khóa ở đó. Đồng thời thêm tệp .txt mới cho biết tệp kho khóa. Keystore cũng quan trọng như mã nguồn . Khi bạn bị mất mật khẩu (hoặc quên mật khẩu), bạn sẽ bị
SCREWED

42
Vui lòng KHÔNG kiểm tra mật khẩu kho khóa của bạn (hoặc bất kỳ mật khẩu nào cho vấn đề đó) vào kiểm soát nguồn, như @Krishnabhadra nói. Giữ kho khóa và mật khẩu riêng biệt và mật khẩu an toàn.
Christopher Orr

1
Gì?! Nhưng nó chỉ nói với tôi rằng chìa khóa của tôi đã quá cũ nên tôi đã xóa nó và tạo một cái mới bây giờ tôi nhận được cái này!?

2
@iwayneo Hệ thống xây dựng có thể đã nói với bạn rằng khóa gỡ lỗi của bạn đã quá cũ, nhưng điều đó rất khó xảy ra với khóa phát hành , vì Google Play sẽ từ chối các khóa hết hạn trước tháng 10 năm 2033 .
Christopher Orr

126

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ữuHợp lệ từ / cho đến ngày.


Nếu keytoollệnh đó không hoạt động ( -jarfiletù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 jarsignerlệ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.509CN=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.


Tôi đã thử lệnh bạn đã đưa ra, để kiểm tra gỡ lỗi (mà tôi thực sự đang tìm kiếm), nhưng nó trả về một lỗi mà bình chứa chữ ký không bao gồm dấu thời gian. Tôi đã tạo apk của mình bằng chủ đề này: stackoverflow.com/questions/16622843/ trên
CularBytes

@RageCompex Bạn không nhận được đầu ra và chỉ có một lỗi? Khi tôi chạy lệnh đó, tôi cũng nhận được cảnh báo dấu thời gian (không phải lỗi). Miễn là bạn có được đầu ra X.509, đó là tất cả những gì bạn cần.
Christopher Orr

Có, tôi nhận được đầu ra X.509, vì vậy đó không phải là vấn đề tôi đoán? Những gì về [CertPath not validated: Path does not chain with any of the trust anchors], không phải là một vấn đề eather? Tôi thấy tên của tôi tại CNvì vậy tôi đoán tôi đã ký đúng tên :)
CularBytes

@RageCompex Điều này đã được trả lời trong phần "Kiểm tra các khóa ký được sử dụng".
Christopher Orr

Tôi đã có một cơn đau tim nhỏ ngày hôm nay. Tôi đã sử dụng các dòng lệnh này để tìm ra Keystore ẩn. Cám ơn nhiều, ông bạn! Bạn đã cứu tôi ... Thực sự: D
Ajeet 27/12/18

11

Không có gì - Google nói rõ rằng ứng dụng được xác định bằng các phím được sử dụng để ký tên. Do đó, nếu bạn bị mất chìa khóa, bạn cần tạo một ứng dụng mới.


1
@sports Họ làm cảnh báo bạn. Lưu ý thông báo Cảnh báo lớn màu đỏ : developer.android.com/tools/publishing/
Kẻ

2
@sports Trong mọi trường hợp, bạn có thể xuất bản nhiều ứng dụng trên cùng một tài khoản nhà phát triển, do đó bạn không cần phải trả tiền nữa.
Christopher Orr

7

Hôm nay tôi phải đối mặt với cùng một vấn đề, thật không may, tôi đã có hai bí danh trong tệp kho khóa của mình.nhập mô tả hình ảnh ở đây


7

Tôi chỉ có điều này xảy ra trong màu xanh rõ ràng. Tôi thực sự không nghĩ rằng tôi đã thay đổi bất cứ điều gì.

Tuy nhiên, đã Build => Clean Projectsửa nó.


1
Hmm, tôi đã dành 1 tuần, làm mọi thứ có thể. và đã đến lúc nói "WTF", nhưng đó là điều duy nhất có ích. (Tôi cũng đã thử các bộ đệm không hợp lệ mà không giúp được ..) Cảm ơn
Upsilon42

1
Điều này đã khắc phục vấn đề sau khi phát điên trong một giờ
Boris Legovic

Cảm ơn vì điều đó; Đó là một trình tiết kiệm thực sự!
Ian Mbae

Tôi không thấy điều này có liên quan.
Vòng lặp vô hạn

Cảm ơn rất nhiều!. Tôi đã vô tình tạo ra một apk có chữ ký với các tệp và thông tin lưu trữ khóa khác nhau và tải nó lên. Giữ lỗi tương tự ngay cả sau khi tải lên apk với kho khóa chính xác. Sau một giờ tạo ra các bản phát hành mới với bộ đệm không hợp lệ, android studio và PC khởi động lại, điều này cuối cùng đã sửa nó.
Arun

5

Ở đây tôi nhận được câu trả lời cho câu hỏi đó. Sau khi tìm kiếm quá lâu cuối cùng tôi cũng có thể bẻ khóa và mật khẩu cho việc này. Tôi quên chìa khóa của mình và bí danh cũng là tập tin jks nhưng may mắn thay tôi biết rất nhiều mật khẩu những gì tôi đã đặt trong đó. nhưng tìm ra sự kết hợp chính xác cho điều đó là nhiệm vụ khó khăn nhất đối với tôi.

Giải pháp - Tải xuống này - Plugin Keytool IUI phiên bản 2.4.1 nhập mô tả hình ảnh ở đây

cửa sổ sẽ bật lên ngay bây giờ nó hiển thị tên bí danh .. nếu tệp jks của bạn là chính xác .. nhấp chuột phải vào bí danh và nhấn "xem chuỗi chứng chỉ" .. nó sẽ hiển thị Khóa SHA1 .. khớp khóa này với khóa tha bạn nhận được trong khi bạn đang tải lên apk trong cửa hàng ứng dụng google ...

nếu nó phù hợp thì bạn với tập tin jks đúng và bí danh ..

Bây giờ may mắn tôi có một loạt mật khẩu để khớp .. nhập mô tả hình ảnh ở đây

bây giờ hãy vào phần này, đặt cùng một đường dẫn jks .. và mật khẩu (trong số mật khẩu bạn có) đặt bất kỳ đường dẫn nào vào "Tệp chứng chỉ"

nếu màn hình hiển thị bất kỳ lỗi nào thì mật khẩu không khớp .. nếu nó không hiển thị bất kỳ lỗi nào thì có nghĩa là bạn đang ở với tệp jks chính xác. bí danh và mật khẩu chính xác () bây giờ với điều đó bạn có thể tải lên apk của mình trong cửa hàng play :)


bạn bị mất khóa riêng và bạn có thể lấy nó theo cách này? Nếu câu trả lời là có, bạn có thể liên kết nơi tải xuống công cụ không? Và làm thế nào để tôi mở ứng dụng?
LS_

4

Nếu bạn có tệp apk trước đó với bạn (sao lưu) thì hãy sử dụng jarSigner để trích xuất chứng chỉ từ apk đó, sau đó sử dụng khóa đó hoặc sử dụng keytool để sao chép chứng chỉ đó, có thể sẽ giúp ... tài liệu jarsigner tài liệu keytool .


5
".. sử dụng jarSigner để trích xuất chứng chỉ từ apk đó" - Hãy cho chúng tôi biết cách thực hiện?
Rubycon

14
Điều đó sẽ không phục hồi khóa riêng mà bạn cần để đăng nhập lại apk.
chạm đáy

Apk phải được ký với cùng một khóa riêng
om252345

3

Tôi đặc biệt khuyên dùng Keystore Explorer ( https://keystore-explorer.org/ ) cho phép bạn truy cập kho khóa của mình mà không cần phải tải nó lên Google Play. Bằng cách này bạn có thể khắc phục sự cố cho dù bạn nhập mật khẩu không chính xác.


1

Bạn có thể sử dụng tính năng mới ký ứng dụng Google play để tạo tệp khóa mới.

Sau tháng 5 năm 2017, cửa hàng Google play thêm một tính năng mới trên Cửa hàng Play và Đó là Tin tốt cho các nhà phát triển Android. Từ tính năng này, Nhà phát triển có thể cập nhật ứng dụng của họ hoặc Apk đã mất tệp KeyStore. bạn cần kích hoạt ứng dụng google play trên bảng điều khiển cửa hàng play.

https://support.google.com/googleplay/android-developer đá / 7384423? hl = vi

http://www.geekcodehub.com/2018/05/23/keystore-lost-in-android/


0

Gần đây tôi đã gặp phải vấn đề này, sau khi thử các cách khác nhau để đăng nhập như bật V1 hoặc V2, đăng nhập bằng cách thay đổi tên bí danh và cuối cùng biết rằng tôi đang sử dụng tệp lưu trữ khóa sai


0

Lỗi [ngớ ngẩn] của tôi là tôi đã sử dụng tệp app-debug.apk thay vì tệp app-release.apk. Bạn cần chọn "phát hành" trong khung "Biến thể xây dựng" khi bạn tạo APK đã ký. Tệp app-release.apk phải được đặt trong thư mục "app \ release" trong thư mục gốc của dự án.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.