2010-11-18 19 views
86

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

¿Qué estoy haciendo mal?

+0

Esto puede ser útil: cómo puedo encontrar y ejecutar la herramienta de claves para Windows http://stackoverflow.com/questions/5488339/how-can-i-find-and-run-the-keytool –

Respuesta

204

El uso de JDK 1.6 o posterior

Se ha señalado por Justin en los comentarios que herramienta de claves por sí sola es capaz de hacer esto con el siguiente comando (aunque sólo en el JDK 1.6 y posteriores):

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

El uso de JDK 1.5 o por debajo de

OpenSSL puede hacerlo todo. This answer on JGuru es el mejor método que he encontrado hasta ahora.

Primero asegúrese de tener OpenSSL instalado. Muchos sistemas operativos ya lo tienen instalado como me encontré con Mac OS X.

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

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

NOTA de que el nombre proporcionado en el segundo comando es el alias de su clave en el nuevo almacén de claves.

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

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

Por último si es necesario se puede convertir esto en un almacén de claves JKS importando el almacén de claves creado anterior en un nuevo almacén de claves:

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

no hay necesidad de los tres pasos, simplemente ejecute: keytool -importkeystore -srckeystore mykeystore.pxf -destkeystore clientcert.jks -srcstoretype pkcs12 -deststore tipo JKS – JustinMorris

+0

@Justin Gracias por señalar esto. – MikeD

+0

Creo que las versiones anteriores de keytool no te dejarían hacerlo. Recuerdo que hace 8 años tenía que ejecutar openssl pero ahora con keytool en Oracle JDK 6 y 7, funciona como un encanto, como dijo Justin. –

2

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, utilizando OpenSSL) e impórtelos a su almacén de claves Java.

Editar

Más información:

  • Descargar OpenSSL para Windows here.
  • exportar la clave privada: openssl pkcs12 -in filename.pfx -nocerts -out key.pem
  • certificado de exportación: la clave privada openssl pkcs12 -in filename.pfx -clcerts -nokeys -out cert.pem
  • importación y certificado en almacén de claves Java utilizando keytool.
+0

¿Podría proporcionarnos por favor? un poco más de información sobre esto? – Ola

+0

¿podría decirme cómo puedo importar key.pem y cert.pem usando keytool? –

+0

Pequeña adición: tiene que agregar -nodos al final cuando se exporta ky privado –

20

jarsigner puede utilizar el archivo PFX como el almacén de claves para firmar su frasco. 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 consiste en obtener el Alias ​​ de su archivo PFX:

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

vez que tenga sus alias, la firma es fácil

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

Los dos comandos anteriores le pedirá la contraseña que ha especificado en exportación de pfx. Si usted quiere tener su contraseña pasar el rato en texto sin cifrar utilizar el interruptor -storepass antes de que el interruptor de -keystore

Una vez firmado, admirar su trabajo:

jarsigner.exe -verify -verbose -certs yourjarfile 
+0

Simple, y funcionó bien para mí - gracias – CJM

+1

+1 por no tener que convertir el archivo de almacén de claves (ya lo tengo en suficientes formatos!) – Trejkaz

15

He encontrado la página que le dice this cómo importar un PFX a JKS (Java del almacén de claves):

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 
+1

¡Esta debería ser la respuesta completa! – JustAGuy

0

Si trabaja con JDK 1.5 o por debajo de la utilidad keytool no tendrá elopción (ver JDK 1.5 keytool documentation) y la solución de MikeD estará disponible solo transfiriendo el .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: Using PFX and PEM Certificate Formats with Keystores. Describe la conversión al formato .pem, cómo extraer información de certificados de este formato de texto e importarlo al formato .jks con la utilidad java utils.ImportPrivateKey (esta es una utilidad incluida con el producto WebLogic).

2

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 la importación, tendría 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ñalaba 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.

Determinados clientes del servicio web basado en .Net error (no se puede establecer una relación de confianza), si no haz lo de arriba

+0

Esto no parece funcionar en IE11. Está fallando en incluir la cadena de certificados a pesar de que se lo estoy diciendo. Sé que esto ha funcionado en el pasado sin embargo. –

Cuestiones relacionadas