¿Cómo convertir un archivo .pfx a un almacén de claves con una clave privada?

Necesito firmar la aplicación de Android ( .apk ).
Tengo el archivo .pfx . Lo convertí al archivo .cer través de Internet Explorer y luego convertí .cer a .keystore usando keytool. Luego intenté firmar .apk con jarsigner pero dice que .keystore no contiene una clave privada.

¿Qué estoy haciendo mal?

Usando JDK 1.6 o posterior

Se ha señalado por Justin en los comentarios a continuación que keytool solo es capaz de hacer esto usando el siguiente comando (aunque solo en JDK 1.6 y posteriores):

 keytool -importkeystore -srckeystore mypfxfile.pfx -srcstoretype pkcs12 -destkeystore clientcert.jks -deststoretype JKS 

Usando JDK 1.5 o inferior

OpenSSL puede hacerlo todo. Esta respuesta en JGuru es el mejor método que he encontrado hasta ahora.

En primer lugar, asegúrese de tener instalado OpenSSL . Muchos sistemas operativos ya lo tienen instalado como lo encontré con Mac OS X.

Los siguientes dos comandos convierten el archivo pfx a un formato que se puede abrir como un almacén de claves PKCS12 de Java:

 openssl pkcs12 -in mypfxfile.pfx -out mypemfile.pem openssl pkcs12 -export -in mypemfile.pem -out mykeystore.p12 -name "MyCert" 

TEN EN CUENTA que el nombre proporcionado en el segundo comando es el alias de tu clave en el nuevo almacén de claves.

Puede verificar los contenidos del almacén de claves utilizando la utilidad de keytool de Java con el siguiente comando:

 keytool -v -list -keystore mykeystore.p12 -storetype pkcs12 

Finalmente, si lo necesita, puede convertir esto a un almacén de claves JKS importando el almacén de claves creado anteriormente en un nuevo almacén de claves:

 keytool -importkeystore -srckeystore mykeystore.p12 -destkeystore clientcert.jks -srcstoretype pkcs12 -deststoretype JKS 

jarsigner puede usar tu archivo pfx como almacén de claves para firmar tu jar. Asegúrese de que su archivo pfx tenga la clave privada y la cadena de cert cuando lo exporte. No hay necesidad de convertir a otros formatos. El truco es obtener el alias de tu archivo pfx:

  keytool -list -storetype pkcs12 -keystore your_pfx_file -v | grep Alias 

Una vez que tenga su alias, la firma es fácil

 jarsigner.exe -storetype pkcs12 -keystore pfx_file jar_file "your alias" 

Los dos comandos anteriores le solicitarán la contraseña que especificó en la exportación de pfx. Si desea que su contraseña se cuelgue en texto sin cifrar, use el modificador -storepass antes del interruptor -keystore

Una vez firmado, admire su trabajo:

 jarsigner.exe -verify -verbose -certs yourjarfile 

Encontré esta página que le dice cómo importar un PFX a JKS (Java Key Store):

 keytool -importkeystore -srckeystore PFX_P12_FILE_NAME -srcstoretype pkcs12 -srcstorepass PFX_P12_FILE -srcalias SOURCE_ALIAS -destkeystore KEYSTORE_FILE -deststoretype jks -deststorepass PASSWORD -destalias ALIAS_NAME 

Su archivo PFX debe contener la clave privada dentro de él. Exporte la clave privada y el certificado directamente desde su archivo PFX (por ejemplo, usando OpenSSL) e impórtelos a su almacén de claves Java.

Editar

Más información:

  • Descargue OpenSSL para Windows aquí .
  • Exportar clave privada: openssl pkcs12 -in filename.pfx -nocerts -out key.pem
  • Certificado de exportación: openssl pkcs12 -in filename.pfx -clcerts -nokeys -out cert.pem
  • Importe clave privada y certificado en el almacén de claves de Java usando keytool .

Justin (arriba) es exacto. Sin embargo, tenga en cuenta que dependiendo de con quién obtenga el certificado (CA intermedia, CA raíz involucrada o no) o cómo se crea / exporta el pfx, a veces podrían faltar la cadena de certificados. Después de importar, tendrá un certificado de tipo PrivateKeyEntry, pero con una cadena de longitud de 1.

Para solucionar esto, hay varias opciones. La opción más fácil en mi mente es importar y exportar el archivo pfx en IE (eligiendo la opción de Incluir todos los certificados en la cadena). El proceso de importación y exportación de certificados en IE debería ser muy fácil y estar bien documentado en otro lugar.

Una vez exportado, importe el almacén de claves como señaló Justin arriba. Ahora, tendría un almacén de claves con certificado de tipo PrivateKeyEntry y con una longitud de cadena de certificados de más de 1.

Ciertos clientes del servicio web basado en .Net cometieron errores (no se puede establecer una relación de confianza), si no hace lo anterior.

Si trabaja con JDK 1.5 o inferior, la utilidad keytool no tendrá la opción -importkeystore (consulte la documentación de JDK 1.5 keytool ) y la solución de MikeD estará disponible solo transfiriendo .pfx en una máquina con un JDK más nuevo (1.6 o superior )

Otra opción en JDK 1.5 o inferior (si tiene el producto Oracle WebLogic), es seguir las instrucciones de este documento de Oracle: Uso de formatos de certificados PFX y PEM con almacenes de claves . Describe la conversión a formato .pem , cómo extraer información de certificados de este formato de texto e importarlo en formato .jks con la utilidad java utils.ImportPrivateKey (esta es una utilidad incluida con el producto WebLogic).