Extraiga los certificados de firma del paquete del instalador del archivo xip

Es posible extraer certificados de firma de código (CSC) de un .app o un .dmg firmado como ASN.1 (DER) con

codesign -d --extract-certificates prefix /path/to/file.dmg

Después de eso, puedes hacer cosas con él usando openssl, securityetc.

Mi objetivo es hacer lo mismo con los archivos xip firmados , que utilizan certificados de firma de paquetes de instalación (IPSC). Puede verificar las firmas xip con

pkgbuild --check-signature /path/to/archive.xip

Pero no parece haber una opción para exportar los certificados de la forma en que el codiseño puede hacerlo con los CSC.

¿Hay alguna forma de hacerlo desde la línea de comandos?

El objetivo final es tratar con archivos xip que están firmados con IPSC autofirmados/autoemitidos. Será un script que primero verifica la firma con pkgbuild, y luego, si el usuario quiere, debe exportar los certificados y luego agregarlos al llavero como confiables. Sé que siempre podría quitar la cuarentena del archivo xip con el certificado autofirmado, y esta será una opción adicional, pero esto siempre es por archivo, por lo que también debe existir la capacidad de extraer los certificados (raíz /hoja) e impórtelos en el llavero como de confianza (o raíz de confianza). Cómo haré esto último, aún no lo sé, pero lo primero es lo primero.

Gracias por su ayuda. (Esta es mi primera publicación en AskDifferent).

Miré a mi alrededor un poco, y hay una aplicación llamada RB App Checker Lite que lee la información de la firma de un archivo xip y también muestra los certificados completos. Seguro que hay una manera de hacerlo, pero tal vez no desde la línea de comandos. (?)

Respuestas (1)

Creo que funciona con el siguiente comando:

xar --dump-toc="${HOME}/Desktop/header.xml" -f /path/to/your/archive.xip

Esto escribirá un archivo xml llamado "encabezado" en su escritorio, y ese contiene los certificados X509. Solo necesita analizarlo; tal vez jqhará el trabajo mejor.

Editar: sin embargo, jqno es macOS nativo, por lo que tiene que ser con xmllint, etc. Esto a continuación funciona. Pondrá todos los certificados en su carpeta de inicio.

FILEPATH="/path/to/your/archive.xip"
FILENAME=$(/usr/bin/basename "$FILEPATH")
/usr/bin/xar --dump-toc=- -f "$FILEPATH" \
    | /usr/bin/xmllint --xpath '//signature[@style="RSA"]' - \
    | /usr/bin/sed -n '/<X509Certificate>/,/<\/X509Certificate>/p' \
    | xargs \
        | /usr/bin/awk '{ \
                gsub("<X509Certificate>","-----BEGINCERTIFICATE-----"); \
                gsub("</X509Certificate>","-----ENDCERTIFICATE-----"); \
                print}' \
        | /usr/bin/awk '{gsub(" ","\n"); print}' \
        | /usr/bin/awk '{ \
                gsub("BEGINCERTIFICATE-----","BEGIN CERTIFICATE-----\n"); \
                gsub("-----ENDCERTIFICATE","\n-----END CERTIFICATE"); \ 
                print}' \
    | /usr/bin/csplit -k -s -n 1 -f "$FILENAME"-cert - '/END CERTIFICATE/+1' '{3}' 2>/dev/null
for CERT in *"-cert"* ; do
    if [[ $(/bin/cat "$CERT") == "" ]] ; then
        rm -rf "$CERT"
    else
        mv "$CERT" "$CERT.pem"
    fi
done