我目前正在开发一个 .AAR 安卓库,希望使用自己的密钥签署发布的工件,以便确定是否有人发布了具有相同名称和功能的伪造 AAR 库。
注意事项 1:
我想要能够通过程序检查我的库的真实性,即使是一个伪造的库,也只是伪造了我的 AAR 文件的一部分功能。
注意事项 2:
我不会将这个 AAR 库发布到 Maven、Sonatype 或任何其他公共仓库。因此,我将为典型的发布流程对其进行签名,就像签名 APK 文件一样。
我目前正在开发一个 .AAR 安卓库,希望使用自己的密钥签署发布的工件,以便确定是否有人发布了具有相同名称和功能的伪造 AAR 库。
注意事项 1:
我想要能够通过程序检查我的库的真实性,即使是一个伪造的库,也只是伪造了我的 AAR 文件的一部分功能。
注意事项 2:
我不会将这个 AAR 库发布到 Maven、Sonatype 或任何其他公共仓库。因此,我将为典型的发布流程对其进行签名,就像签名 APK 文件一样。
你可以使用 jarsigner
对你的 aar
库进行签名,同时可以使用 keytool
生成签名密钥。这两个工具都位于随 Android Studio 附带的嵌入式 JDK 中。按照以下步骤对你的库进行签名。
生成一个密钥库及其密钥对。你需要提供证书字段:
keytool -genkeypair -alias aarsign -keypass mypassword -keystore aarsign.keystore -storepass mypassword -v
将生成的证书导出为PEM文件:
keytool -exportcert -rfc -alias aarsign -file aarsign-public.pem -keystore aarsign.keystore -storepass mypassword -v
创建一个包含证书的密钥库:
keytool -importcert -alias aarsign -file aarsign-public.pem -keystore aarsign-public.keystore -storepass mypassword -v
签署库:
jarsigner -keystore aarsign.keystore -storepass mypassword -keypass mypassword -signedjar lib-signed.aar -verbose lib.aar aarsign
任何希望证明库的真实性的人需要以可靠的方式获取您的证书(或包含其证书的密钥库),并输入以下命令:
jarsigner -keystore aarsign-public.keystore -storepass mypassword -verify -verbose -certs lib-signed.aar aarsign
它将会显示这条消息
jar verified.
关于证书到期和签名时间戳的一些警告。您可以通过创建更严格的证书来消除这些警告。请参考 keytool
和 jarsigner
文档。
有两种方式可以确定您的库是否被篡改:不匹配的摘要或不匹配的证书。如果有人从不同的源代码或具有不同的资源生成 aar
,则摘要将不匹配,jarsigner
将发出警告,例如:
jarsigner: java.lang.SecurityException: invalid SHA-256 signature file digest for <file>
如果有人提供了一张与您自己不同的证书,jarsigner
将会发出警告:
Warning:
This jar contains entries whose certificate chain is not validated.
This jar contains signed entries which are not signed by the specified alias(es).
This jar contains signed entries that are not signed by alias in this keystore.
aar
库的数字签名并不像使用安卓的apksigner.jar
签名apk
一样在安卓工具集内完成。因此,我可以使用gpg或openssl等工具对aar
进行签名。 - daparicvariant.signingConfig
对我不起作用,所以我使用了apply plugin: 'com.android.library'
...
android {
...
signingConfigs {
release {
storeFile file("${rootProject.projectDir}/keystore.jks")
storePassword "XXXX"
keyAlias "alias"
keyPassword "XXXX"
}
}
...
}
tasks.whenTaskAdded { task ->
if (task.name == 'assembleRelease') {
def aarPath = "${project.buildDir}/outputs/aar/XXX-release.aar"
task.doLast {
ant.signjar(
alias: android.signingConfigs.release.keyAlias,
jar: aarPath,
keystore: android.signingConfigs.release.storeFile,
storepass: android.signingConfigs.release.storePassword,
keypass: android.signingConfigs.release.keyPassword,
preservelastmodified: 'true')
ant.verifyjar(
alias: android.signingConfigs.release.keyAlias,
jar: aarPath,
keystore: android.signingConfigs.release.storeFile,
storepass: android.signingConfigs.release.storePassword,
keypass: android.signingConfigs.release.keyPassword)
}
}
}
verifyJar
任务的输出消息?否则,对我来说,任务似乎永远不会失败,因此实际上无法检查.AAR是否已成功签名。 - superjos你可以通过执行以下操作生成:
./gradlew assembleRelease
或者从Gradle菜单开始,在Android Studio右侧选择YourLibraryProject->Tasks->Build->AssembleRelease。
但是当然你需要在库项目中添加签名密钥。请阅读签署您的应用程序。
signedAar {
signedConfig{
storeFile file("path/to/keystore")
storePassword "Password"
keyAlias "Alias"
keyPassword "AliasPassword"
}
}
然后将此添加到同一配置文件的buildTypes -> release块中:
signingConfig signedAar.signedConfig
请告诉我们这是否有效