Android APK 서명 인증서 만료 문제 및 업데이트 서명 체계 v3

최근 갑자기 회사의 친족 서명 만료가 임박했다는 사실을 알고 서둘러 해결책을 연구하기 시작했고 여기에 채택한 방법을 기록했습니다.

1. 인증서 만료

  • 먼저 만료된 서명 인증서를 갱신하거나 재생성할 방법이 없습니다 . 인증서를 교체하는 경우 버전을 설치하기 전에 원래 설치된 앱을 제거해야 합니다.앱이 이미 앱 마켓에 있는 경우 인증서가 일치하지 않는 APK 파일은 업데이트할 수 없습니다.일부 앱 마켓은 인증서를 제출할 수 있습니다. 업데이트를 신청하려면 주문을 해야 하지만 재고 사용자는 새 버전을 업데이트하기 전에 항상 원래 앱을 제거해야 하며 그 영향은 매우 심각합니다.
  • 그래서 여기에 서명 인증서를 생성할 때 지정된 유효 기간에 주의해야 한다는 점을 알려드립니다. 기본 유효 기간은 25년입니다. Google Play에도 엄격한 규칙이 있습니다. 만료 날짜가 수정된 것이 아니라 아무런 문제가 되지 않습니다.

둘, 해결책

이것도 안드로이드 9.0 이후 도입된 APK 서명 체계 v3 인 구글에서 제공하는 솔루션이다 .

Android는 세 가지 애플리케이션 서명 체계를 지원합니다.

서명 체계 v3는 v2의 개선된 버전이라고 할 수 있습니다.여전히 압축된 패키지 전체를 확인하는 검증 방법을 사용합니다.서명은 APK 서명 블록에 저장됩니다.차이점은 v3 체계는 형식으로 여러 인증서 저장을 지원한다는 것입니다. 서명 블록에 이전 인증서 서명을 추가하고 서명 키 순환 방식으로 서명의 교체 및 업그레이드를 실현할 수 있는 연결 목록의.

이렇게 하면 사용자가 Android 9 이상에서 v3 서명 체계로 서명된 APK로 업데이트할 때 APK가 APK 서명 체계 v3, v2 또는 v1에 대해 순차적으로 확인됩니다. 이전 플랫폼은 v3 서명을 무시하고 v2 서명을 확인한 다음 v1을 확인하려고 합니다. 처음으로 APK를 업데이트하는 경우에는 스톡 앱이 아직 v3 서명 체계를 사용하지 않았기 때문에 이전 인증서의 v2 및 v1 서명을 차례로 직접 확인하고 v3 서명 확인을 시작합니다.
APK 유효성 검사 프로세스

3. v3 서명 체계 프로세스 업데이트

1. 회전 서명 키

새로 생성된 서명 인증서와 이전 인증서 파일을 준비하고 다음 명령을 사용하여 서명 키를 순환하여 계보 파일을 생성합니다. API 28 이상을 사용하여 apksigner를 생성 해야 합니다 (Android 9.0 이후 v3 서명 체계 지원).

apksigner rotate --out *lineage --old-signer --ks *old-signer-jks --new-signer --ks *new-signer-jks
  • *lineage : 생성된 계보 파일 경로(예: d:\lineage)
  • *old-signer-jks : 이전 서명자 인증서 경로
  • *new-signer-jks : 새 서명 인증서 경로

참고: Window 환경에서는 해당 환경 변수 Path를 구성하여 디렉토리를 자르지 않고 직접 apksigner 명령을 사용할 수 있습니다.
환경 변수 구성

2. APK 서명

계보 파일을 가져오는 이전 단계를 완료한 후 다음 명령을 사용하여 APK에 서명할 수 있습니다(여전히 API 28 이상).

apksigner sign --ks *old-signer-jks --next-signer --ks *new-signer-jks --lineage *lineage app.apk
  • *lineage : 이전 단계에서 생성된 계보 파일
  • *old-signer-jks : 이전 서명 인증서
  • *new-signer-jks : 새 서명 인증서
  • app.apk : 서명할 APK

입력이 완료되면 확인 후 프롬프트에 따라 이전 인증서와 새 인증서의 비밀번호를 각각 입력하면 APK의 v3 서명이 완료됩니다.

3. APK 서명 확인

검증 링크에 도달하면 서명 후 APK 서명이 성공했는지, 서명 정보에 문제가 없는지 확인해야 하는데 여기서는 API 버전별로 획득한 APK 서명 인증서 정보를 보다 직관적으로 표시하는 방법을 사용합니다. 확인을 제공하는 방법은 다음 두 가지 명령입니다.

apksigner verify -v --print-certs app-name.apk

apksigner verify -v --print-certs --max-sdk-version [sdkversion] [apk]
  • 명령 1은 사용 중인 apksigner의 해당 API 버전에서 지원하는 서명 체계의 최상위 버전에 대한 인증서 정보를 보는 데 더 일반적으로 사용됩니다.

  • 여기에서 우리는 APK 서명 정보를 완전히 확인해야 합니다. 사용해야 하는 것은 명령 2입니다. 여기에 새로운 매개변수가 있습니다. 이 매개변수는
    --max-sdk-version [sdkversion]APK 서명이 확인을 통과하는지 확인하기 위해 apksigner에서 사용하는 가장 높은 Android 프레임워크 API 수준입니다. Android 버전에 해당하는 휴대폰으로 이해할 수 있으며 APK의 서명 체계 버전의 서명 정보를 확인합니다.

리프트 밤:

apksigner verify -v --print-certs --max-sdk-version 22 app-name.apk

SDK 버전 = 22

apksigner verify -v --print-certs --max-sdk-version 26 app-name.apk`

SDK 버전 = 26

apksigner verify -v --print-certs --max-sdk-version 30 app-name.apk

SDK 버전 = 30

  • Android 7.0(API 24) 이상은 v2 서명 메커니즘을 지원합니다.
  • Android 9.0(API 28) 이상은 v3 서명 메커니즘을 지원합니다.
  1. sdkversion = 22 인 경우 Android 5.1은 V1 서명 체계만 지원하기 때문에 Verifies의 v1 체계만 참이므로 이 버전의 Android 휴대전화는 v1의 서명 정보만 확인하고 APK도 주식을 성공적으로 덮어쓰고 설치할 수 있습니다. 업그레이드할 앱
  2. 마찬가지로 sdkversion = 26 이면 v1과 v2가 모두 true입니다. 여기에서 API 22와 26의 경우 획득한 APK 서명 정보가 동일하다는 것을 알 수 있습니다. 이는 이전 인증서의 정보이며 이전 인증서가 성공적으로 상속되었음을 나타냅니다.
  3. 이때 sdkversion = 30 , v3, v2, v1 서명 방식이 동시에 지원될 예정이고 획득한 서명 정보가 위의 두 가지와 다른 경우 이는 우리가 새로 만든 인증서의 정보입니다. 인증서를 성공적으로 완료했습니다. Android 9.0 이상 플랫폼의 업그레이드 및 교체는 확인을 위해 이 인증서의 정보를 사용합니다.
  • 참고: keytool -printcert -jarfile app-name.apk를 사용하여 APK 인증서 정보를 보는 것은 권장되지 않습니다. keytool은 Java JDK에서 제공하는 인증서 관리 도구이며 JAR 기반 APK의 v1 서명 정보만 볼 수 있기 때문입니다. 서명.

확장: 일부 앱은 런타임 서명 인증서 확인을 수행합니다.여기에서 얻은 인증서 정보는 실제로 v1의 서명 정보이므로 주식 클라이언트를 덮어쓰고 업데이트한 후에 얻은 인증서 정보의 불일치에 대해 걱정할 필요가 없습니다. 다음은 앱에서 인증서 정보를 얻는 방법이며 테스트 후 덮어쓰고 정상적으로 설치할 수 있습니다.

PackageInfo pi = packageManager.getPackageInfo(packageName, PackageManager.GET_SIGNING_CERTIFICATES);
SigningInfo signingInfo = pi.signingInfo;
if (signingInfo.hasMultipleSigners()) {
    return signingInfo.getApkContentsSigners();
} else {
    return signingInfo.getSigningCertificateHistory();
}

상호 격려!

참조> https://developer.android.google.cn/studio/command-line/apksigner?hl=zh-cn

추천

출처blog.csdn.net/wsHHo/article/details/128874650