16

我目前正在开发一个 .AAR android 库,我想用我自己的密钥对发布的工件进行签名,这样我就可以确定我是否发布了具有相同名称和功能的假 aar。

注意事项 1:

我希望能够以编程方式检查我的库的真实性,即使一个伪造的库只是伪造我的 aar 文件功能的一部分。

通知 2:

不会将此 aar 发布到 maven、sonatype 或任何其他公共存储库中。因此,我将为典型的发布流程签署它,例如签署 apk 文件。

4

5 回答 5

25

您可以使用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.

带有一些关于证书过期和签名时间戳的警告。您可以通过创建更严格的证书来消除这些警告。参考keytooljarsigner文档。

有两种方法可以确定您的库是否已被篡改:不匹配的摘要或不匹配的证书。如果有人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.
于 2017-04-04T00:06:22.187 回答
1

因为variant.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)
        }
    }
}
于 2018-10-21T08:24:56.103 回答
0

您可以通过执行生成它:

./gradlew assembleRelease

或者从 gradle 菜单,在 Android Studio 的右侧,选择 YourLibraryProject->Tasks->Build->AssembleRelease。

但当然,您需要在库项目中添加签名密钥。请阅读签署您的应用程序

于 2017-03-30T16:50:22.353 回答
0

我没有尝试过,但这个“应该”工作:

在你的 gradle 配置文件中为你要创建的 aar 创建一个这样的块:

signedAar {
    signedConfig{
        storeFile file("path/to/keystore")
        storePassword "Password"
        keyAlias "Alias"
        keyPassword "AliasPassword"
    }
}

然后将其添加到同一配置文件的 buildTypes -> 发布块中:

signingConfig  signedAar.signedConfig

让我们知道这是否有效

于 2017-04-03T10:34:33.213 回答
-1

你为什么不sha-256散列你的aar文件?即使有人搞砸了,aar更改的哈希值也会让您了解。这个对我有用 ;)

于 2017-04-03T22:41:21.950 回答