Tengo un script que envía ssh de forma remota a una Mac. El guión original, que funcionó en El Capitán, desbloquearía el llavero con esto:
security unlock-keychain -p mypassword
El comando anterior da un error en Sierra, así que lo actualicé a esto:
security unlock-keychain -p mypassword ~/Library/Keychains/login.keychain
El comando anterior parece funcionar, pero luego, cuando enumero los llaveros, el llavero de inicio de sesión aún no está allí y mi secuencia de comandos falla al intentar firmar mi código porque no puede acceder a los certificados.
(~)$ security list-keychains
"/Library/Keychains/System.keychain"
"/Library/Keychains/System.keychain"
Todo esto funciona perfectamente en una ventana de terminal en el host, pero necesito que funcione de forma remota en SSH.
Gracias por cualquier ayuda o sugerencia.
Actualización 10 de octubre de 2016: cambié la autenticación ssh de contraseña a clave rsa y comenzó a funcionar. Después de que pude acceder al llavero de inicio de sesión, comencé a recibir un error en el shell ssh: SecKey API devolvió: -25308 de codesign. Esto resultó ser un error de permisos. Cuando lo probé en el host en una terminal, apareció un cuadro de diálogo del llavero que me pedía que permitiera el acceso.
Su llavero de inicio de sesión no parece estar en la lista de búsqueda, es decir, cuando lo marcó, solo muestra el llavero del sistema dos veces. Sin llavero de inicio de sesión:
(~)$ security list-keychains
"/Library/Keychains/System.keychain"
"/Library/Keychains/System.keychain"
(~)$ security list-keychains -d user -s login.keychain
(~)$ security list-keychains
"/Users/USERNAME/Library/Keychains/login.keychain-db"
"/Library/Keychains/System.keychain"
Puede usar el comando de seguridad para buscar el código de error -25308. En este caso, dice "Interacción del usuario no permitida". Esto es típico si está intentando firmar su aplicación a través de SSH (oa través de Jenkins).
security error -25308
Error: 0xFFFF9D24 -25308 User interaction is not allowed.
Debe realizar un comando de seguridad para habilitar el codiseño de su aplicación a través de un shell no interactivo:
security set-key-partition-list -S apple: -k <Password> -D <Identity> -t private <your.keychain>
Aquí hay un script compatible con Jenkins/SSH "completo" para firmar su aplicación:
MY_KEYCHAIN="temp.keychain"
MY_KEYCHAIN_PASSWORD="secret"
CERT="certificate.p12"
CERT_PASSWORD="certificate secret"
security create-keychain -p "$MY_KEYCHAIN_PASSWORD" "$MY_KEYCHAIN" # Create temp keychain
security list-keychains -d user -s "$MY_KEYCHAIN" $(security list-keychains -d user | sed s/\"//g) # Append temp keychain to the user domain
security set-keychain-settings "$MY_KEYCHAIN" # Remove relock timeout
security unlock-keychain -p "$MY_KEYCHAIN_PASSWORD" "$MY_KEYCHAIN" # Unlock keychain
security import $CERT -k "$MY_KEYCHAIN" -P "$CERT_PASSWORD" -T "/usr/bin/codesign" # Add certificate to keychain
CERT_IDENTITY=$(security find-identity -v -p codesigning "$MY_KEYCHAIN" | head -1 | grep '"' | sed -e 's/[^"]*"//' -e 's/".*//') # Programmatically derive the identity
CERT_UUID=$(security find-identity -v -p codesigning "$MY_KEYCHAIN" | head -1 | grep '"' | awk '{print $2}') # Handy to have UUID (just in case)
security set-key-partition-list -S apple-tool:,apple: -s -k $MY_KEYCHAIN_PASSWORD -D "$CERT_IDENTITY" -t private $MY_KEYCHAIN # Enable codesigning from a non user interactive shell
### INSERT BUILD COMMANDS HERE ###
security delete-keychain "$MY_KEYCHAIN" # Delete temporary keychain
Gracias a Bochun Bai por pasar 3 semanas con el soporte de Apple para encontrar la solución al problema -25308 y publicarlo en https://sinofool.net/blog/archives/322
security set-key-partition-list
¡Hizo el truco!
jayatubi