iphone - valor - Validar certificado y perfil de aprovisionamiento.
valor peaje tunel san cristobal (2)
Aquí hay una entrada de blog que encontré que explica la estructura del archivo .mobileprovision : estructura y lectura de archivos .mobileprovision
Y así es como se ven los archivos csr: ¿Qué es una CSR (solicitud de firma de certificado)?
No creo que ya exista una solución de trabajo que se ajuste exactamente a sus necesidades. Probablemente esa no sea la respuesta que buscabas, pero espero que encuentres una conexión de alguna manera.
En nuestros proyectos de iOS, nos comprometemos con el repositorio de control de versiones, tanto el certificado de firma como los perfiles de aprovisionamiento utilizados para generar compilaciones AdHoc y AppStore. De esta manera, cada vez que un nuevo desarrollador descarga una nueva copia de la aplicación, tiene todo lo que necesita para crear una compilación AdHoc para los evaluadores.
Estamos utilizando Jenkins para la integración continua, y me gustaría tener un script que haga algunas comprobaciones de seguridad en los archivos comprometidos. En particular, me gustaría comprobar que los perfiles de aprovisionamiento comprometidos se hayan generado con el certificado de firma comprometido en el repositorio.
¿Alguien sabe cómo hacer esto desde la línea de comandos? No puedo entender el formato de archivo .mobileprovision, aunque parece ser un archivo plist binario firmado.
Respondiendo a mi propia pregunta, espero que esto ayude a alguien más.
Resulta que, el archivo mobileprovision
es un mensaje firmado digitalmente PKCS7. No está firmado con el certificado del desarrollador, sino con el de Apple.
Sin embargo, los datos que están firmados son una lista XML que contiene la clave pública del certificado que utiliza para firmar sus binarios.
Así que básicamente, los pasos son los siguientes:
- Extraiga los datos del archivo PKCS7.
- Extraiga la clave pública del archivo p12.
- Compara los dos y verifica si son iguales.
Logré hacer esto fácilmente con Ruby, ya que proporciona envoltorios agradables a OpenSSL. Dejé un guión en Github , si alguien quiere usarlo.
Las partes relevantes del código son las siguientes:
profile = File.read(@profile_file)
certificate = File.read(@certificate_file)
p7 = OpenSSL::PKCS7.new(profile)
cert = OpenSSL::PKCS12.new(certificate, @certificate_password)
store = OpenSSL::X509::Store.new
p7.verify([], store)
plist = REXML::Document.new(p7.data)
plist.elements.each(''/plist/dict/key'') do |ele|
if ele.text == "DeveloperCertificates"
keys = ele.next_element
key = keys.get_elements(''//array/data'')[0].text
profile_cert = "-----BEGIN CERTIFICATE-----" + key.gsub(//t/, "") + "-----END CERTIFICATE-----/n"
@provisioning_cert = OpenSSL::X509::Certificate.new(profile_cert)
end
end
# Compare @provisioning_cert.to_s and cert.certificate.to_s