前提

https://nativesupport.dcloud.net.cn/AppDocs/usesdk/appkey.html#
根据上面的教程,都配置好了,发现打包之后还是出现"未配置AppKey或配置错误"。
想了很久才去想是不是离线AppKey错了。

解决办法

在uniapp 开发者后台把应用的 Android 应用签名SHA1值Android 应用签名MD5 两个值设置成一样,保存后获取新的 AppKey 重新打包就可以了

原因

专门问了一下claude2这个AI才知道,我电脑上的不同版本的jdk输出的证书文件(keystore文件)的SHA1和MD5值是不一样的,到底 uniapp 开发者后台用的是哪个为准我是不知道的,反正测几次

同一个keystore文件,使用不同版本的keytool去获取MD5和SHA1的值,可能会不一样。

这是因为keytool在不同版本之间算法实现存在差异所导致的。

具体来说,在Java 7之前,keytool使用的是MD5+SHA1的组合算法,计算过程是:

对证书内容计算MD5哈希
对上一步的MD5哈希再计算SHA1哈希
最终输出的是第二步的SHA1哈希值
而从Java 7开始,keytool切换到仅使用SHA1算法,直接对证书内容计算SHA1哈希值。

因此,Java 7之前的keytool版本获取到的SHA1值,实际上是证书MD5值的SHA1哈希;但Java 7+版本获取到的就是证书原始内容的SHA1哈希。

那么如何处理这个差异呢?

尽量使用Java 7以上版本的keytool,直接获取SHA1值
对比服务端需要的到底是SHA1还是MD5值
在不同keytool版本之间保持一致,不要混用
向服务端确认清楚需要使用的是哪个值
可以同时提供MD5和SHA1两个值
所以keytool的版本差异会导致签名哈希值可变是需要注意的,需要根据实际情况处理。

根据Keytool命令的变更历史,从Java 7版本(Java 7u6准确来说)开始,keytool在输出keystore信息时不再包含MD5值,仅输出SHA1值。

具体的变更点是:

Java 7u6之前 - 输出SHA1值(实际是证书MD5值的SHA1哈希)和MD5值
Java 7u6 到 Java 8 - 只输出SHA1值(证书内容的SHA1哈希)
Java 9 到 Java 11 - 输出SHA256值
Java 12之后 - 同时输出SHA256和SHA512值
所以可以总结如下:

Java 7u6之前 - 有MD5值
Java 7u6开始 - 没有MD5值
这是因为Java 7u6开始Keytool切换到了只使用SHA1算法,不再先计算MD5然后SHA1的方式。

所以从Java 7u6+的keytool版本开始,就不会再输出keystore证书内容的MD5值了。

如果必须要获取MD5值用来兼容某些老系统,可以使用Java 7u6之前的keytool版本,或者使用其他工具计算证书文件的MD5值。

所以准确来说,keytool不再出现MD5值的分界点是Java 7u6这个版本。

最后发现用Java 8的Keytool拿到sha1值之后,把值填到Android 应用签名SHA1值Android 应用签名MD5 就行了。

Logo

华为开发者空间,是为全球开发者打造的专属开发空间,汇聚了华为优质开发资源及工具,致力于让每一位开发者拥有一台云主机,基于华为根生态开发、创新。

更多推荐