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
, security
etc.
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).
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 jq
hará el trabajo mejor.
Editar: sin embargo, jq
no 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
jayb