Alpine如何不使用--allow-untrusted验证GitHub下载的apk包
Alpine安装Symfony CLI apk包报UNTRUSTED signature错误解决
问题现象
从Symfony CLI的GitHub发布页下载apk安装包到本地Alpine环境安装时,抛出签名不受信错误:
#10 0.245 ERROR: /tmp/symfony-cli_5.4.11_x86_64.apk: UNTRUSTED signature
原有安装脚本如下:
SYMFONY_CLI_VERSION="5.4.11" SYMFONY_ARCH="x86_64" wget -O /tmp/symfony-cli_${SYMFONY_CLI_VERSION}_${SYMFONY_ARCH}.apk "https://github.com/symfony-cli/symfony-cli/releases/download/v${SYMFONY_CLI_VERSION}/symfony-cli_${SYMFONY_CLI_VERSION}_${SYMFONY_ARCH}.apk" apk add --repositories-file=/dev/null --no-network --no-cache "/tmp/symfony-cli_${SYMFONY_CLI_VERSION}_${SYMFONY_ARCH}.apk"
此前尝试下载对应版本的.apk.pem文件,经base64解码后提取RSA公钥,存放到路径/etc/apk/keys/${SYMFONY_CLI_VERSION}_${SYMFONY_ARCH}@symfony-1C204ECEF7BED6AB.rsa.pub,但报错仍存在。已确认添加--allow-untrusted参数可跳过校验完成安装,需要在不使用该跳过参数的前提下,正确完成签名校验与安装。
根因
签名校验失败有两个核心原因:
- 手动拼接的公钥文件名中携带的密钥指纹与安装包实际签名密钥的指纹不匹配。Alpine的apk工具校验签名时,只会匹配
/etc/apk/keys/路径下文件名中指纹与安装包签名密钥指纹一致的公钥,指纹不匹配时即使公钥内容正确也会判定为不受信。 - 手动对公钥文件做base64解码、提取RSA公钥的操作属于多余步骤,官方发布的
.apk.pem文件本身就是apk工具可直接识别的公钥格式,额外转码操作可能导致公钥内容损坏。
解决步骤
- 下载apk安装包时,同步下载同版本对应的
.apk.pem公钥文件,无需对该公钥文件做任何转码、拆分操作。 - 从下载的公钥文件中提取真实的16位大写密钥指纹,命令如下:
KEY_FINGERPRINT=$(openssl rsa -pubin -in /tmp/symfony-cli_${SYMFONY_CLI_VERSION}_${SYMFONY_ARCH}.apk.pem -outform DER 2>/dev/null | sha1sum | cut -c1-16 | tr '[:lower:]' '[:upper:]')
- 将公钥文件移动到apk的签名校验路径,按apk要求的规则命名:
mv /tmp/symfony-cli_${SYMFONY_CLI_VERSION}_${SYMFONY_ARCH}.apk.pem "/etc/apk/keys/symfony-cli@${KEY_FINGERPRINT}.rsa.pub"
- 执行原有apk安装命令即可,无需添加
--allow-untrusted参数,工具会自动匹配公钥完成签名校验。
修正后的完整安装脚本参考:
SYMFONY_CLI_VERSION="5.4.11" SYMFONY_ARCH="x86_64" TEMP_PATH="/tmp" # 下载安装包与对应公钥 wget -O "${TEMP_PATH}/symfony-cli_${SYMFONY_CLI_VERSION}_${SYMFONY_ARCH}.apk" "https://github.com/symfony-cli/symfony-cli/releases/download/v${SYMFONY_CLI_VERSION}/symfony-cli_${SYMFONY_CLI_VERSION}_${SYMFONY_ARCH}.apk" wget -O "${TEMP_PATH}/symfony-cli_${SYMFONY_CLI_VERSION}_${SYMFONY_ARCH}.apk.pem" "https://github.com/symfony-cli/symfony-cli/releases/download/v${SYMFONY_CLI_VERSION}/symfony-cli_${SYMFONY_CLI_VERSION}_${SYMFONY_ARCH}.apk.pem" # 提取公钥真实指纹 KEY_FINGERPRINT=$(openssl rsa -pubin -in "${TEMP_PATH}/symfony-cli_${SYMFONY_CLI_VERSION}_${SYMFONY_ARCH}.apk.pem" -outform DER 2>/dev/null | sha1sum | cut -c1-16 | tr '[:lower:]' '[:upper:]') # 部署公钥到系统信任路径 mv "${TEMP_PATH}/symfony-cli_${SYMFONY_CLI_VERSION}_${SYMFONY_ARCH}.apk.pem" "/etc/apk/keys/symfony-cli@${KEY_FINGERPRINT}.rsa.pub" # 执行安装 apk add --repositories-file=/dev/null --no-network --no-cache "${TEMP_PATH}/symfony-cli_${SYMFONY_CLI_VERSION}_${SYMFONY_ARCH}.apk"
注意事项
- 不要手动臆测公钥文件名中的指纹值,必须从对应版本的公钥文件本身计算提取,不同版本的Symfony CLI可能使用不同签名密钥,指纹存在差异。
- 公钥只要存放在
/etc/apk/keys/路径下、文件名符合<标识>@<16位大写指纹>.rsa.pub的规则,apk工具就会自动信任该密钥签名的安装包,无需额外配置。
内容的提问来源于stack exchange,提问作者Kingindanord
相关产品推荐
相关产品推荐

