2011-07-15 13 views
16

En nuestros proyectos de iOS, que comprometen al repositorio de control de versiones, tanto el certificado de firma y los perfiles de datos utilizados para generar AdHoc e AppStore construye. De esta forma, cada vez que un desarrollador nuevo descarga una nueva copia nueva de la aplicación, tiene todo lo que necesita para crear una compilación AdHoc para probadores.Validar certificado y aprovisionamiento perfil

Estamos utilizando Jenkins para la Integración Continua, y me gustaría tener un script que hace algunas comprobaciones en los archivos comprometidos. En particular, me gustaría comprobar que los perfiles de aprovisionamiento comprometidos se generaron efectivamente 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.

Respuesta

30

responder a mi propia pregunta, espero que esto ayude a alguien más.

Resulta que el archivo mobileprovision es un mensaje PKCS7 firmado digitalmente. No está firmado con el certificado del desarrollador, sino con el de Apple.

Sin embargo, los datos que se firmó es un plist XML que contiene la clave pública del certificado que se utiliza para firmar sus binarios.

Así que, básicamente, los pasos son los siguientes:

  1. extraer los datos desde el archivo PKCS7.
  2. Extracto de la clave pública del archivo de p12.
  3. comparar los dos, y comprobar si son los mismos.

Me las arreglé para hacer esto fácilmente con Ruby, ya que proporciona agradables envoltorios para OpenSSL. Dejé script in Github, si alguien quiere usar.

Las partes pertinentes del Código son los 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 
2

Aquí es una entrada de blog encontré que explica la estructura del archivo .mobileprovision: .mobileprovision files structure and reading

Y eso es cómo los archivos RSE busca como: What is a CSR (Certificate Signing Request)?

No creo que ya es una solución de trabajo que se ajusta exactamente a sus necesidades. Probablemente esa no sea la respuesta que estabas buscando, pero espero que encuentres una conexión de alguna manera.

+0

Esto ayuda, pero no es exactamente lo que estoy buscando. Creo que el perfil de aprovisionamiento simplemente está firmado con el certificado. Si solo pudiéramos encontrar qué firma se aplica y verificar la identidad de la firma, sería genial. – pgb

+0

primer enlace ahora está muerto - aquí está la versión de archivo del mismo. https://web.archive.org/web/20130502092617/http://idevblog.info/mobileprovision-files-structure-and-reading – Stevko

Cuestiones relacionadas