security / codesign en Sierra: Keychain ignora las configuraciones de control de acceso y las solicitudes de UI para obtener permiso

Comenzando con macOS Sierra, ya no puedo importar una identidad de signo de código en un llavero con / usr / bin / security sin la UI de usr / bin / codesign que solicita acceso cuando se utiliza esta identidad. Esto rompe las secuencias de comandos de empaquetado del servidor de comstackción. Parece que no hay solución. Esto afecta los llaveros creados a medida, pero también el login.keychain.

Pasos para reproducir: Ejecute los siguientes comandos en Terminal (requiere una identidad de firma para estar disponible para importar):

security create-keychain -p test buildagent.keychain security unlock-keychain -p test buildagent.keychain security list-keychains -d user -s buildagent.keychain security default-keychain -s buildagent.keychain security import identity.p12 -k buildagent.keychain -P password -T /usr/bin/codesign codesign -vfs '$IDENTITY' '${PRODUCT}' --keychain 'buildagent.keychain' 

Resultado: macOS muestra una solicitud de UI que solicita permiso para acceder a la clave privada previamente importada.

He intentado muchas soluciones, pero nada parece funcionar:

  • Usar la nueva extensión .keychain-db al especificar el nombre de la llave
  • Usar el login.keychain en lugar del personalizado
  • Importación de p12 con -A (‘Permitir que cualquier aplicación acceda a la clave importada’)
  • Importación de la Cert und Key por separado (se extrae de la p12 anterior con openssl pkcs12)

La importación de la identidad definitivamente funciona, puedo ver el certificado y la clave cuando se muestran los contenidos del llavero en la aplicación Keychain Access. La configuración de control de acceso para la clave privada también está configurada correctamente (con la regla de excepción de signo de código deseada).

¿Cómo puedo evitar el aviso de UI de Sierra?

El comando que necesita usar es el siguiente:

security set-key-partition-list -S apple-tool:,apple: -s -k keychainPass keychainName

Tenga en cuenta que esta herramienta de línea de comandos funciona como la forma de modificación de list-keychains. Si ejecuta set-key-partition-list con un único valor, sobrescribirá todos los ID de partición en los certificados. No validará los valores pasados.

Lo que hace este comando es que establece los PartitionID (elementos después de -S separados por comas) para las claves que pueden firmar (-s) para un llavero específico. El identificador de partición real que permite la designación de código es apple:

No sé qué apple-tool: está haciendo, ya que no está documentada, pero estaba allí después de importar la clave con security import así que lo guardo para evitar romper las personas que copian y pegan el comando.

Este cambio se introdujo con Mac OS Sierra y no está documentado (o al menos no pude encontrar la documentación). A partir del 16 de octubre, la página del manual de seguridad aún no muestra este comando.

Para obtener más información, puede consultar este informe de error: http://www.openradar.me/28524119

Para aquellos que tienen este problema con Travis u otro CI, debe agregar el codesign de codesign en la lista de identificación de la aplicación.

security set-key-partition-list -S apple-tool:,apple:,codesign: -s -k keychainPass keychainName

PD: estoy usando keychainName.keychain (agregando .keychain )

El comando de esta respuesta solo desbloqueó el llavero para mí, pero todavía tenía el indicador de UI preguntando si la aplicación actual podría usar la llave.

Previní el mensaje así:

Vaya al llavero en Acceso a Llaveros, haga doble clic en todas las teclas allí, y en la pestaña Control de acceso, marque ‘Permitir que todas las aplicaciones accedan a este elemento’.

enter image description here

Pude subir el nuevo archivo de llavero a mi servidor de comstackción de Jenkins, donde se desbloquea mediante el complemento Llaveros y Perfiles de Aprovisionamiento . La construcción ahora tiene éxito al firmar.

Por alguna razón, la security set-key-partition-list no funcionó para mí.

Lo resolví utilizando la opción -A cuando importé el certificado en el llavero:

 security import ${P12_FILE} -k ${KEYCHAIN_PATH} -P ${P12_PASSWORD} -A 

No es necesario usar la security set-key-partition-list después.

Esta opción permite que cualquier aplicación acceda a la clave importada sin previo aviso. Por lo tanto, evita que aparezca el aviso. Tenga en cuenta que no es seguro ya que la clave no está protegida, pero de acuerdo con su contexto de comstackción podría ser útil.

Además de eso, el llavero debe agregarse a la lista de búsqueda:

 security list-keychains -s ${KEYCHAIN_PATH} 

Entonces el llavero debería estar desbloqueado. De lo contrario, se mostrará un mensaje pidiendo la contraseña de llavero:

 security unlock-keychain -p ${KEYCHAIN_PASSWORD} ${KEYCHAIN_PATH} 

Eventualmente, el tiempo de espera de autolocking debe ser deshabilitado. Esto es en caso de que la comstackción sea bastante larga y el llavero se vuelva a bloquear por sí mismo:

 security set-keychain-settings ${KEYCHAIN_PATH} 

Después de probar muchas soluciones diferentes, lo que funcionó para mí fue simplemente cambiar la contraseña de mi llavero.

  • Buscador> Ir> Utilidades
  • Abra la herramienta de acceso de llavero.
  • No estoy seguro de si necesitaba hacer este paso: En la barra lateral izquierda de la herramienta de acceso de llavero, haga clic en Mis certificados. Mire la columna de Llaveros para confirmar en qué llavero está su certificado de desarrollador de Apple. En mi caso, estaba en el llavero de “inicio de sesión”.
  • Cambie la contraseña para el llavero del paso anterior. Es posible que desee intentar bloquearlo y luego desbloquearlo, si está bloqueado. Puede cambiar la contraseña haciendo clic en el llavero relevante (“inicio de sesión”, en mi caso) y luego seleccionando “Cambiar contraseña …” en el menú Editar de la utilidad Acceso a Llaveros.
  • La siguiente vez que ejecuté el paso de archivo en Xcode (en el menú Producto) finalmente me pidieron una contraseña de llavero y escribí la contraseña para mi llavero de “inicio de sesión”. Entonces funcionó. Cuando terminó, vi una pantalla de Archivos con mi aplicación listada en ella.

Además, si su aplicación fue construida más de 5 minutos, puede quedarse sin el temporizador de locking de llavero personalizado y recibir el error -1 = ffffffff. Por lo tanto, deshabilite el locking de llavero como solución tmp.

    Intereting Posts