Dimungkinkan untuk mengambil Kode Penandatanganan Sertifikat (CSC) dari .app atau menandatangani .dmg sebagai ASN.1 (DER) dengan
codesign -d --extract-certificates prefix /path/to/file.dmg
Setelah itu Anda dapat melakukan hal-hal dengan menggunakan openssl
, security
dll.
Tujuan saya adalah melakukan hal yang sama untuk ditandatangani arsip xip , yang menggunakan Sertifikat Penandatanganan Paket Pemasang (IPSC). Anda dapat memverifikasi tanda tangan xip dengan
pkgbuild --check-signature /path/to/archive.xip
Tetapi sepertinya tidak ada pilihan untuk benar-benar mengekspor sertifikat dengan cara codesign dapat melakukannya dengan CSC.
Apakah ada cara untuk melakukannya dari baris perintah?
Tujuan akhirnya adalah untuk berurusan dengan arsip xip yang ditandatangani dengan IPSC yang ditandatangani sendiri / diterbitkan sendiri. Ini akan menjadi skrip yang pertama kali memeriksa tanda tangan pkgbuild
, dan kemudian, jika pengguna ingin, itu harus mengekspor sertifikat, dan kemudian menambahkannya ke gantungan kunci yang tepercaya. Saya tahu Anda selalu bisa saja mendeklarasikan file xip dengan sertifikat yang ditandatangani sendiri, dan ini akan menjadi opsi tambahan, tetapi ini selalu berdasarkan file, jadi harus ada kemampuan untuk mengekstrak sertifikat (root / leaf) dan impor ke gantungan kunci sebagai tepercaya (atau root tepercaya). Bagaimana saya akan melakukan yang terakhir saya belum tahu, tetapi hal pertama yang pertama.
Terima kasih untuk bantuannya. (Ini adalah posting pertama saya di AskDifferent.)
Jawaban:
Saya pikir ini bekerja dengan perintah berikut:
xar --dump-toc="${HOME}/Desktop/header.xml" -f /path/to/your/archive.xip
Ini akan menulis file xml yang disebut "header" ke desktop Anda, dan yang berisi sertifikat X509. Anda hanya perlu menguraikannya; mungkin
jq
akan melakukan pekerjaan terbaik.Edit: namun,
jq
bukan macOS asli, jadi harus dengan xmllint dll. Ini di bawah ini berfungsi. Ini akan menempatkan semua sertifikat di folder rumah Anda.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
sumber