android/iOS备案签名

一. 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文件
  • 解决办法:
    • 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
    
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容