• v1.16.0 a37a0bcc0b

    v1.16.0: la app de macOS por fin se firma de verdad

    munka publicó esto 2026-09-19 11:41:13 -05:00 | 13 commits a main desde esta versión

    El build NUNCA firmó la app de macOS. Al no pasarle ninguna identidad, el
    bundler de Tauri se saltaba codesign entero y el .dmg salía con la firma
    ad hoc que deja el enlazador:

    Identifier=labstream_desktop-0a5819ba37119701
    flags=0x20002(adhoc,linker-signed)
    Info.plist=not bound
    Sealed Resources=none

    Tres cosas mal, y ninguna avisaba en ningún log:

    · El Entitlements.plist del repo era DECORACIÓN. Los entitlements se
    escriben al firmar; sin firma, el micrófono, la cámara y el JIT nunca
    pidieron nada porque nunca estuvieron pedidos.
    · Ni el Info.plist ni los recursos iban dentro de la firma: se podían
    cambiar sin romperla.
    · El identificador era el del enlazador y no co.labstream.os, que es por
    el que macOS recuerda los permisos que le concedes a una app.

    AHORA. APPLE_SIGNING_IDENTITY se calcula en un paso propio y no en el
    env: del build, porque un secret que no existe llega como cadena VACÍA y
    Tauri lee APPLE_CERTIFICATE="" como «hay certificado» y revienta al
    importarlo. Solo se exporta lo que tiene valor:

    · con Developer ID → firma real, y notarizado si están las tres claves;
    · sin él → identidad "-", firma AD HOC. No engaña a Gatekeeper, pero sella
    los recursos, ata el Info.plist y APLICA LOS ENTITLEMENTS. En cuanto
    Jonathan añada los secrets, la siguiente etiqueta sale firmada de verdad
    sin tocar un solo archivo.

    ENSAYADO sobre una copia de la app instalada, con el mismo comando que va a
    correr el CI. Antes y después:

    flags=0x20002(adhoc,linker-signed) → flags=0x10002(adhoc,runtime)
    Identifier=labstream_desktop-0a58… → Identifier=co.labstream.os
    Info.plist=not bound → Info.plist entries=17
    Sealed Resources=none → Sealed Resources version=2 rules=13
    (sin entitlements) → allow-jit, audio-input, camera

    Y EL ENSAYO ENCONTRÓ UNA TRAMPA que plutil -lint no ve: el
    Entitlements.plist llevaba --entitlements dentro de un comentario XML, y
    dos guiones seguidos ahí son XML inválido. plutil lo aceptaba; AMFI, que es
    quien lo lee de verdad dentro de codesign, contestaba «Failed to parse
    entitlements» y la firma fallaba. Queda avisado en el propio archivo.

    De paso se cae com.apple.security.network.client: es exclusiva del App
    Sandbox y esta app no lo usa, así que no hacía nada.

    LA RED QUE FALTABA: un paso nuevo comprueba la firma del .app y TUMBA la
    publicación si los entitlements no llegaron. Que esto estuviera roto no lo
    dijo nada durante meses; se descubrió a mano persiguiendo otra cosa.

    Co-Authored-By: Claude Opus 5 noreply@anthropic.com

    Descargas