1 votos

¿Cómo crear una identidad que se pueda utilizar para firmar código a partir de un certificado personalizado?

Quiero codesign una de mis aplicaciones usando mi propio certificado (no creado con Keychain Access).

Primero, creo un archivo v3.ext:

keyUsage = digitalSignature

Luego, creo mi certificado con openssl:

$ openssl genrsa -des3 -out passkey.key 2048
$ openssl rsa  -in passkey.key -out mykey.key
$ openssl req -new -key mykey.key -out cert.csr
$ openssl x509 -req -sha256 -extfile v3.ext -days 3650 -in cert.csr -signkey mykey.key -out mycertificate.crt
$ openssl pkcs12 -export -in mycertificate.crt -inkey mykey.key -out certificate.p12 -name "Nombre de mi empresa"

Importé certificate.p12 en Keychain Access arrastrándolo al docker. Ahora, al intentar firmar mi aplicación, tengo este error:

$ security find-identity
Política: X.509 Básico
  Identidades coincidentes
 11) 5DC3086CAD3848A22FB6E614FB8836BDDBD18938 "Nombre de mi empresa" (CSSMERR_TP_NOT_TRUSTED)

$ codesign --deep -fs 5DC3086CAD3848A22FB6E614FB8836BDDBD18938 repro.app
: esta identidad no puede usarse para firmar código

Sin embargo, podemos ver que este certificado se puede usar para verificar (CSSM_KEYUSE_VERIFY):

$ certtool y
Número de serie      : 00 F6 E2 FC FC D1 67 A6 7A 
Nombre del emisor        :
   País         : FR
   Estado           : Some-State
   Org             : Nombre de mi empresa
Nombre del sujeto       :
   País         : FR
   Estado           : Some-State
   Org             : Nombre de mi empresa
Algoritmo de firma del certificado : OID : < 06 09 2A 86 48 86 F7 0D 01 01 0B >
   parámetros de alg      : 05 00 
No antes         : 15:09:59 May 13, 2019
No después          : 15:09:59 May 10, 2029
Algoritmo de clave pública  : OID : < 06 09 2A 86 48 86 F7 0D 01 01 01 >
   parámetros de alg      : 05 00 
Bytes de la clave pública      : Longitud 270 bytes : 30 82 01 0A 02 82 01 01 ...
Clave CSSM           :
   Algoritmo       : RSA
   Tamaño de la clave        : 2048 bits
   Uso de la clave         : CSSM_KEYUSE_VERIFY 
Firma          : 256 bytes : 4E F5 B9 35 9D 6A D5 2E ...
Estructura de extensión   : OID : < 06 03 55 1D 0F >
   Crítico        : FALSO
   uso           : Firma Digital

¿Qué debo hacer para permitir que esta identidad firme código?

1voto

Steve Evans Puntos 155

Su certificado carece de requisitos específicos de codesign. Estos van más allá de keyUsage = digitalSignature.

Certificado Conforme

Necesita crear un certificado que cumpla con los requisitos de firmado de código de macOS. Puede encontrar los requisitos en Declaración de Prácticas de Certificación de Autoridad de Certificación Developer ID:

4.12.2. Certificados de Firmado de Código

Un certificado de firmado de código emitido por el Developer ID Sub-CA debe cumplir con el formato de Certificado X.509 y debe contener, como mínimo, los siguientes elementos de datos:

  • Número de Serie
  • Nombre Distinguido del Sujeto
  • Nombre Distinguido del Emisor
  • Algoritmo utilizado (RSA)
  • Módulo (Tamaño en bits)
  • Periodo de validez
  • Extensión de Políticas del Certificado que incluye el CP
  • Cualificadores de Certificado que lista esta CPS (URL)
  • Cualificador de Aviso al Usuario
  • Extensión de Uso Extendido de Clave, crítica, con un propósito que contiene Firmado de Código (1.3.6.1.5.5.7.3.3)
  • Firmado de Código de Identificación del Desarrollador (1.2.840.113635.100.6.1.13)
  • Extensión de Acceso a Información de Autoridad de Certificación, no crítica, con un método para obtener información de autoridad de certificación a través del método de Protocolo de Estado de Certificado en Línea.

Para más detalles, vea la pregunta de Security StackExchange Cómo crear un certificado de firma de paquete de instalador de Apple.

Autoridad de Certificación Confiada

Con un certificado conforme, podrá codesign su binario. Para que la firma de código sea reconocida, deberá instalar y confiar en el certificado de la Autoridad de Certificación (CA) en su Mac. Esto debe hacerse de una manera que Gatekeeper confíe en ella.

Puede aprender más sobre este paso buscando instalar certificado root mac.

1 votos

He editado el archivo v3.ext: He añadido critical para la extensión keyUsage y extendedKeyUsage=critical,1.3.6.1.5.5.7.3.3 y funciona.

0voto

Jose Chavez Puntos 645

No puedes firmar un programa utilizando solo el certificado público. Necesitarás la clave privada para hacerlo. Según tu descripción, tienes la clave privada en el archivo mykey.key, pero codesign no sabría dónde buscar. Necesitarás tener la clave privada importada en tu Llavero.

En un nivel más general: no podrás distribuir programas que hayas firmado de esta manera a otros. Necesitarás un certificado de firma de códigos válido de Apple para poder hacerlo.

1 votos

Cometí un error cuando escribí por primera vez mi pregunta. Importé un archivo .p12 que incluye la clave privada y el certificado. Puedo ver la clave privada en la lista de Keychain Access.

0 votos

Sí, pero aún así no funcionará porque tu CA/intermedio autofirmado no es de confianza. Como mencioné en mi respuesta, necesitarás un certificado de firma de código válido de Apple.

1 votos

No quiero compartir mi aplicación en la Tienda de Apple, por ejemplo. Solo quiero crear una aplicación que pueda ser confiada por la computadora (en la configuración de Accesibilidad) y compartirla solo con algunos clientes. Ver: stackoverflow.com/questions/56008262/…

AppleAyuda.com

AppleAyuda es una comunidad de usuarios de los productos de Apple en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X