【问题标题】:Keystore SHA1 different from cert.rsa SHA1 from APKKeystore SHA1 与 APK 中的 cert.rsa SHA1 不同
【发布时间】:2016-09-05 10:40:43
【问题描述】:

我有一个首先使用 Adob​​e Air 创建的 android 应用程序(及其生产密钥库)。很久以前,该公司改用常规的 Android SDK 来开发应用程序,但由于该应用程序已经投入生产,我们使用的密钥库仍然是同一个(由 Adob​​e Air 创建)。

我使用 keytool 为 Google Places API 提取 SHA1,我得到了一些类似的东西:

Alias name: <alias_name>
Creation date: Jan 11, 2015
Entry type: PrivateKeyEntry
Certificate chain length: 1
Certificate[1]:
Owner: CN=<company_name>, OU=, O=, C=US
Issuer: CN=<company_name>, OU=, O=, C=US
Serial number: <lotsofnumbers>
Valid from: Mon Mar 28 14:08:17 IST 2011 until: Sat Mar 29 14:08:17 IDT 2036
Certificate fingerprints:
     MD5:  ..:8D:F7
     SHA1: ..:E6:69
     SHA256: ..:38:9A
     Signature algorithm name: SHA1withRSA
     Version: 3

Extensions: 

#1: ObjectId: 2.5.29.37 Criticality=false
ExtendedKeyUsages [
  codeSigning
]

这个 SHA1(由 E6:69 完成)从未在 Google Places API 中工作过,所以我检查了 apk 包含的 CERT.RSA 是什么,除了证书指纹外,它看起来几乎相同:

Valid from: Mon Mar 28 14:08:17 IST 2011 until: Sat Mar 29 14:08:17 IDT 2036
Certificate fingerprints:
     MD5:  ..:E1:30
     SHA1: ..:72:74
     SHA256: ..:9D:6D
     Signature algorithm name: SHA1withRSA
     Version: 3

Extensions: 

#1: ObjectId: 2.5.29.37 Criticality=false
ExtendedKeyUsages [
  codeSigning
]

这个 SHA1(在 72:74 完成)运行良好,我终于设法在生产环境中使用 Google Places API。但我不明白为什么这两个证书指纹不同。

我 1000% 确定它是同一个密钥库,那么这怎么可能?

当我查看 android 调试键时,信息的结构相同,但扩展名不同:

Alias name: androiddebugkey
Creation date: Oct 26, 2014
Entry type: PrivateKeyEntry
Certificate chain length: 1
Certificate[1]:
Owner: CN=Android Debug, O=Android, C=US
Issuer: CN=Android Debug, O=Android, C=US
Serial number: 3bddeb55
Valid from: Sun Oct 26 21:03:56 IST 2014 until: Tue Oct 18 22:03:56 IDT 2044
Certificate fingerprints:
     MD5:  ..:01:17
     SHA1: ..:00:77
     SHA256: ..:32:93
     Signature algorithm name: SHA256withRSA
     Version: 3

Extensions: 

#1: ObjectId: 2.5.29.14 Criticality=false
SubjectKeyIdentifier [
KeyIdentifier [
0000: <weird hexa number and characters>
0010: <weird hexa number and characters>
]
]

总结一下我的问题:

  1. SHA1 怎么可能不匹配?
  2. 可能是扩展的不同吗?
  3. 那么我如何使用 keytool(或其他工具)向我显示正确的 SHA1?
  4. 我可以摆脱这个代码签名扩展来回到“普通的 android 密钥库”吗?

【问题讨论】:

    标签: android ssl air keystore android-keystore


    【解决方案1】:

    使用android studio可以通过以下方式获取SHA1密钥

    然后转到工作室右侧的 Gradle 选项卡

    点击项目名称-> :app-> 任务-> android-> 签名报告(双击)

    这将在 RUN 控制台上打印 SHA1 和 MD5 密钥

    【讨论】:

    • 据我所知,此方法只会显示用于调试密钥库的 SHA1
    【解决方案2】:

    将有 2 个密钥库。调试和发布。我认为您正在使用调试密钥。

    如果您使用的是发行版。检查调试和发布 xml 中的 apikey 是否正确。因为通常你不会看到发布的 google xml。

    所以你创建了正确的 Api 密钥,但你没有把它放在发布 xml 文件中。

    【讨论】:

      【解决方案3】:

      这怎么可能 SHA1 不匹配?

      SHA-1 证书指纹是由您的 Keystore 定义的,可能您使用另一个 Keystore 签署了您的应用程序,或者您的 Keystore 已修改或重新创建,我自己使用调试 Keystore 经历过。强>

      那么我如何使用 keytool(或其他工具)向我展示正确的 SHA1?

      请记住,当您创建密钥库(包含唯一的 SHA-1 证书)来为生产应用签名时,您必须将此密钥库保存在安全的地方,并且必须使用它为 Google 为您的应用签名游戏商店

      如果您的 SHA-1(由 E6:69 完成)从未在 Google Places API 中工作过,则可能 SHA-1 证书指纹未在 https://console.developers.google.com/ 中注册。

      例如,对于 Google Places API,我需要使用我的调试密钥库的 SHA-1 证书(通常位于 C:\Users\[USER]\.android\debug.keystore)和我的生产密钥库的 SHA-1 证书注册我的应用程序。

      转到您的 Google 开发者控制台 https://console.developers.google.com/apis 在那里,您可以定义多个与您的应用程序包名称相关的 SHA-1,例如,您可以为调试密钥库定义一个,为生产密钥库定义另一个。

      我敢打赌,您使用不同的密钥库签名,因为它们的创建日期不同:

      Creation date: Jan 11, 2015
      Creation date: Oct 26, 2014
      

      【讨论】:

        【解决方案4】:

        检查几件事

        • 您拥有正确的签名密钥(检查日期)

        • 确保您的密码正确(必须正确才能发布发布的 apk)

        • 检查您的密钥别名是否正确。我花了几个小时才找到 我有两个。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2013-06-25
          • 2012-10-12
          • 2011-10-26
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2018-01-03
          相关资源
          最近更新 更多