一. android签名
1. 生成新的密钥库文件
-
-keystore ~/your-release-key.jks: ❗️❗️❗️要指定密钥库your-release-key.jks的路径和名称。 -
-keyalg RSA:指定密钥算法,这里使用 RSA。 -
-keysize 2048:指定密钥的大小。 -
-validity 10000:指定密钥的有效期,以天为单位(10000 天约为 27 年)。 -
-alias your-key-alias:为你的密钥指定一个别名(需要记住,后面备案查看公钥和md5指纹需要用到)。 - 命令:
keytool -genkey -v -keystore ~/your-release-key.jks -keyalg RSA -keysize 2048 -validity 10000 -alias your-key-alias
2.配置gradle构建文件
- 打开
android/app/build.gradle,进行如下配置: - 将
your-key-alias替换你的密钥别名 - 将
your-key-password替换密钥的密码 - 将
/path/to/your-release-key.jks替换为你的密钥库文件的实际路径。 - 将
your-keystore-password替换为密钥库的密码。android { ... signingConfigs { release { keyAlias 'your-key-alias' keyPassword 'your-key-password' storeFile file('/path/to/your-release-key.jks') storePassword 'your-keystore-password' } } buildTypes { release { signingConfig signingConfigs.release minifyEnabled false shrinkResources false // 注意:如果需要开启代码混淆,请设置 minifyEnabled 为 true,并配置 proguard-rules.pro // proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro' } } }
3.另一种方式:使用key.properties文件管理密钥和别名
⚠️⚠️⚠️这个和上面是一回事,只不过多了个key.properties管理上面的参数,不容易丢失忘记
- 创建
JKS文件,命名为my-release-key.jks,放到android/app/路径下 - 创建一个
key.properties文件,放到路径android/下,内容大概如下:#你的keystore密码 storePassword=123456 #你的key密码 keyPassword=123456 #你的key别名 keyAlias=keys #`JKS文件`相对于`build.gradle`的路径,同层路径,就填文件名`my-release-key.jks` storeFile=my-release-key.jks -
android/app/build.gradle相关的内容如下:plugins { id "com.android.application" id "kotlin-android" id "dev.flutter.flutter-gradle-plugin" id 'com.google.gms.google-services' id "com.google.firebase.crashlytics" } //加载key.properties文件 def keystoreProperties = new Properties() def keystorePropertiesFile = rootProject.file('key.properties') if (keystorePropertiesFile.exists()) { keystoreProperties.load(new FileInputStream(keystorePropertiesFile)) } android { //...省略其他配置 kotlinOptions { //...省略其他配置 } defaultConfig { //...省略其他配置 } signingConfigs { release { keyAlias keystoreProperties['keyAlias'] keyPassword keystoreProperties['keyPassword'] storeFile keystoreProperties['storeFile'] ? file(keystoreProperties['storeFile']) : null storePassword keystoreProperties['storePassword'] // if (project.hasProperty('keyProperties')) { // def keyProperties = new Properties() // file('key.properties').withInputStream { keyProperties.load(it) } // storeFile = file(keyProperties['storeFile']) // storePassword = keyProperties['storePassword'] // keyAlias = keyProperties['keyAlias'] // keyPassword = keyProperties['keyPassword'] // } } } buildTypes { release { signingConfig signingConfigs.release minifyEnabled true // 如果需要代码混淆,设置为 true shrinkResources true // 如果需要资源压缩,设置为 true proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro' } } } - 如果是
build.gradle.kts相关内容如下:plugins { id("com.android.application") id("kotlin-android") id("dev.flutter.flutter-gradle-plugin") } import java.util.Properties val keystoreProperties = Properties() val keystorePropertiesFile = rootProject.file("key.properties") if (keystorePropertiesFile.exists()) { keystoreProperties.load(keystorePropertiesFile.inputStream()) } android { compileOptions { //...省略其他配置 } kotlinOptions { //...省略其他配置 } defaultConfig { //...省略其他配置 } signingConfigs { create("release") { keyAlias = keystoreProperties["keyAlias"] as String? keyPassword = keystoreProperties["keyPassword"] as String? storeFile = keystoreProperties["storeFile"]?.let { file(it as String) } storePassword = keystoreProperties["storePassword"] as String? } } buildTypes { getByName("release") { signingConfig = signingConfigs.getByName("release") isMinifyEnabled = true isShrinkResources = true proguardFiles( getDefaultProguardFile("proguard-android-optimize.txt"), "proguard-rules.pro" ) } } }
4. 验证签名
- 输出
Verified说明 APK 已正确签名:apksigner verify build/app/outputs/flutter-apk/app-release.apk
5. 注意事项
- 密钥管理:保管你的密钥库文件和密码。如果丢失密钥,将无法更新应用。
- 安全性:不要将密钥库文件和密码直接硬编码到项目中。可以考虑使用环境变量或安全存储工具。
二.android备案相关命令
-
需求信息:
包名bundle ID公钥-
证书MD5指纹:(32长度的16进制数字)
-
查看
公钥:-
-alias: 指定的别名,比如keys -
your-release-key.jks: 文件your-release-key.jks的路径,比如xx项目/android/app/my-release-key.jks
cd xx项目/android/ keytool -exportcert -alias "keys" -keystore "app/my-release-key.jks" | openssl x509 -inform DER -subject_hash -
-
查看密钥库的内容,
(有几个证书,可以在这里看)keytool -list -v -keystore "your-release-key.jks"
由于 MD5 已经被认为不安全,因此现代工具和方法可能默认不显示 MD5 指纹。如果确实需要查看 MD5 指纹,你可以通过导出证书并使用 openssl 手动计算来实现。这种方法不仅适用于 .jks 文件,还适用于其他证书管理系统
- 使用
openssl提取MD5指纹:- 导出
.cer证书:keytool -exportcert -alias "your-key-alias" -keystore "your-release-key.jks" -file exported_cert.cer - 或者导出
.crt证书:keytool -exportcert -alias "your-key-alias" -keystore "your-release-key.jks" -file exported_cert.crt - 或者导出
.pem格式(openssl工具可能无法识别上面的证书格式):
-rfc:使用 PEM 格式导出证书(这是文本格式,可以直接查看和使用)。keytool -exportcert -alias "your-key-alias" -keystore "your-release-key.jks" -rfc -file exported_cert.pem - 读取证书,并计算
MD5指纹:openssl x509 -in exported_cert.crt -noout -fingerprint -md5
- 导出
3.iOS备案相关
- 需求信息:
包名bundle ID公钥-
sha1指纹:(32长度的16进制数字)
- 在关键文件
.cer,这上面都有。 - 问题:
- 本来老的macos系统很好找上面的资料。新系统把
钥匙串访问给隐藏了。
虽然finder->程序->实用工具->钥匙串访问,这条路径可以看到,但是我的不知道为什么,始终打不开! - 偏偏又没有登陆开发者的密码,下载不了
.cer文件
- 本来老的macos系统很好找上面的资料。新系统把
- 解决办法:
-
Xcode->Settings->Account->找到打包需要备案的app的开发者账号->Manage Certificates->找到发布证书iOS Distribution Certificates->右键导出Export Certificate - 导出时:
选择保存路径->随便输入密码123456->验证密码:123456->保存文件的名字:1111->得到路径下的文件:1111.p12 -
1111.p12转成.pem文件:cd 1111.p12的保存路径openssl pkcs12 -in 1111.p12 -out cert.pem -nodes- 输入之前的密码
123456回车 - 报错:
tucici@tucicideMacBook-Pro Desktop % openssl pkcs12 -in Untitled.p12 - out cert.pem -nodes -legacy Enter Import Password: tucici@tucicideMacBook-Pro Desktop % openssl pkcs12 -in Untitled.p12 - out cert.pem -nodes Enter Import Password: Error outputting keys and certificates C09DBA49F87F0000:error:0308010C:digital envelope routines:inner_evp_generic_fetch:unsupported:crypto/evp/evp_fetch.c:355:Glo bal default library context, Algorithm (RC2-40-CBC : 0), Properties () - 原因:这个错误表明 OpenSSL 3.0+ 版本默认禁用了 RC2-40-CBC 这种较弱的加密算法
- 更正命令:
openssl pkcs12 -in 1111.p12 -out cert.pem -nodes -legacy
- 输入之前的密码
- 检查
cert.pem是否转换正确:cat cert.pem -
cert.pem转换成.cer文件:openssl x509 -in cert.pem -out cert.cer -outform der - 同路径下,就可以看到
cert.cer文件了。
-
- 查看
公共密钥:openssl x509 -inform der -in cert.cer -pubkey -noout - 查看
SHA1 指纹:openssl x509 -inform der -in cert.cer -fingerprint -sha1 -noout - 查看
MD5指纹:openssl x509 -inform der -in cert.cer -fingerprint -md5 -noout
相关命令
-
1111.p12->cert.pem:openssl pkcs12 -in 1111.p12 -out cert.pem -nodes -legacy -
cert.pem->cert.cer:openssl x509 -in cert.pem -out cert.cer -outform der -
cert.pem->cert.der:openssl x509 -in cert.pem -outform der -out cert.der - 查看
公共密钥:openssl x509 -inform der -in cert.cer -pubkey -noout - 查看
SHA1 指纹:openssl x509 -inform der -in cert.cer -fingerprint -sha1 -noout - 查看
MD5指纹:openssl x509 -inform der -in cert.cer -fingerprint -md5 -noout