[ Android 编译 ] 如果不指定LOCAL_CERTIFICATE,默认使用哪个key进行签名

[ Android 编译 ] 如果不指定LOCAL_CERTIFICATE,默认使用哪个key进行签名?

尊重原创,转载请注明出处!
创作不易,如有帮助请点赞支持~

参考:
Android系统签名简介

开发系统应用时,通常情况下我们都会在 Android.mk 中通过 LOCAL_CERTIFICATE 声明应用签名所用的密钥。尤其是当指定 android:sharedUserId="android.uid.system" 时,必须通过 LOCAL_CERTIFICATE := platform 使用 platform key 对应用进行签名。

最近在开发调试的时候,发现 Launcher3 应用的 Android.mk 并没有声明 LOCAL_CERTIFICATE,那么它到底是使用哪个 key 进行签名的呢?

通过简单的测试可以得出结论,在未修改源码编译环境的情况下,系统源码中编译的应用,如果没有指定 LOCAL_CERTIFICATE

1、在 user 模式下就是用 build/target/product/security/releasekey.x509.pem 进行应用签名。

2、在 eng / userdebug 模式下用 build/target/product/security/testkey.x509.pem 进行应用签名。

默认情况下使用的证书路径是在这里定义的 build/core/config.mk

# The default key if not set as LOCAL_CERTIFICATE
ifdef PRODUCT_DEFAULT_DEV_CERTIFICATE
  DEFAULT_SYSTEM_DEV_CERTIFICATE := $(PRODUCT_DEFAULT_DEV_CERTIFICATE)
else
  DEFAULT_SYSTEM_DEV_CERTIFICATE := build/target/product/security/testkey
endif

也就是说,如果在源码中定义了 PRODUCT_DEFAULT_DEV_CERTIFICATE 的环境变量,就会使用它作为默认的证书路径。如果没指定 PRODUCT_DEFAULT_DEV_CERTIFICATE,则使用 build/target/product/security/testkey 作为默认的证书路径。

通过查找资料,发现在 system/sepolicy/private/keys.conf 中还定义了不同编译模式下使用的默认密钥:

[@PLATFORM]
ALL : $DEFAULT_SYSTEM_DEV_CERTIFICATE/platform.x509.pem

[@MEDIA]
ALL : $DEFAULT_SYSTEM_DEV_CERTIFICATE/media.x509.pem

[@NETWORK_STACK]
ALL : $MAINLINE_SEPOLICY_DEV_CERTIFICATES/networkstack.x509.pem

[@SHARED]
ALL : $DEFAULT_SYSTEM_DEV_CERTIFICATE/shared.x509.pem

# Example of ALL TARGET_BUILD_VARIANTS
[@RELEASE]
ENG       : $DEFAULT_SYSTEM_DEV_CERTIFICATE/testkey.x509.pem
USER      : $DEFAULT_SYSTEM_DEV_CERTIFICATE/releasekey.x509.pem
USERDEBUG : $DEFAULT_SYSTEM_DEV_CERTIFICATE/testkey.x509.pem

最后,这个 DEFAULT_SYSTEM_DEV_CERTIFICATE 到底是在哪里用到的呢?

答案是 build/make/core/package_internal.mk,它判断了当 LOCAL_CERTIFICATE 为空时,使用 $(DEFAULT_SYSTEM_DEV_CERTIFICATE) 进行签名。

ifeq ($(LOCAL_CERTIFICATE),)
    LOCAL_CERTIFICATE := $(DEFAULT_SYSTEM_DEV_CERTIFICATE)
endif

分析到这里,其实就可以验证上面的结论了:

1、在 user 模式下,系统源码中编译的应用,如果没有指定 LOCAL_CERTIFICATE,默认情况下就是用 build/target/product/security/releasekey/releasekey.x509.pem 进行应用签名。

2、在 eng / userdebug 模式下,系统源码中编译的应用,如果没有指定 LOCAL_CERTIFICATE,默认情况下就是用 build/target/product/security/releasekey/testkey.x509.pem 进行应用签名。

进一步扩展,可以得到以下结论:

1、如果自己公司的产品需要维护一套自己生成的密钥,可以在 makefile 中通过 PRODUCT_DEFAULT_DEV_CERTIFICATE 环境变量指定自己的证书路径。包括 platform / media / release 等签名都是使用该路径下的证书

2、如果想要在修改 eng / userdebug / user 编译模式下使用的默认密钥,可以修改 system/sepolicy/private/keys.conf,配置不同编译模式下使用的默认密钥

注:这里经过测试,发现只要指定了 PRODUCT_DEFAULT_DEV_CERTIFICATE,那么无论在 user 还是
userdebug 模式下,默认使用的都是 PRODUCT_DEFAULT_DEV_CERTIFICATE 只有在未指定
PRODUCT_DEFAULT_DEV_CERTIFICATE 的情况下,eng / userdebug 模式下才会使用
testkey 作为默认密钥

遗留问题:
上面指定的 DEFAULT_SYSTEM_DEV_CERTIFICATE 都是 build/target/product/security/testkeybuild/target/product/security/releasekey,也就是直接指定的密钥类型。

但是在 keys.conf 中通过 DEFAULT_SYSTEM_DEV_CERTIFICATExxxkey.x509.pem 进行拼接,此时 DEFAULT_SYSTEM_DEV_CERTIFICATE 应该指定的是密钥文件所在目录才对?

这个问题查了半天没搞懂,暂时不管了。有哪位朋友知道的可以指点一下,谢谢~

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
根据你提供的错误信息,看起来在你的Nginx配置文件中,第16行使用了"ssl_certificate"指令,但是Nginx无法识别该指令,导致出现了"unknown directive"错误。 这个问题通常是由于Nginx没有正确加载ngx_http_ssl_module模块导致的。要解决这个问题,你可以按照以下步骤进行操作: 1. 首先确认你的Nginx是否已经正确编译并启用了SSL模块。你可以通过运行以下命令检查: ``` nginx -V ``` 在输出的信息中查找`--with-http_ssl_module`,如果没有出现这个选项,表示Nginx没有启用SSL模块。你需要重新编译Nginx并包含SSL模块。 2. 如果你已经确认Nginx已经启用了SSL模块,那么可能是由于配置文件中缺少正确的nginx.conf文件或被其他配置文件覆盖导致的。请检查你的Nginx配置目录,确保nginx.conf文件存在于正确的位置。 3. 打开nginx.conf文件,确保在http块内包含了正确的指令。例如: ``` http { ... ssl_certificate /path/to/your_certificate.crt; ssl_certificate_key /path/to/your_private_key.key; ... } ``` 将`/path/to/your_certificate.crt`和`/path/to/your_private_key.key`替换为你实际的证书和私钥文件路径。 4. 保存并关闭配置文件。 5. 检查Nginx配置文件的语法是否正确: ``` nginx -t ``` 如果语法检查通过,则会显示 "configuration file ... test is successful" 的消息。 如果以上步骤仍然无法解决问题,请确保你的Nginx版本支持SSL配置,并且检查其他可能的语法错误或配置问题。 希望这次能够帮助到你!如果还有其他问题,请随时提问。
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值