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

107

Necesito firmar la aplicación de Android ( .apk).
Tengo .pfxarchivo. Lo convertí a un .cerarchivo a través de Internet Explorer y luego lo convertí .cerpara .keystoreusar keytool. Luego intenté firmar .apkcon jarsigner pero dice que .keystore no contiene una clave privada.

Que estoy haciendo mal

Ola
fuente
Esto puede ser útil: ¿cómo puedo encontrar y ejecutar la herramienta de claves para Windows stackoverflow.com/questions/5488339/...
Peter Barbanyaga

Respuestas:

259

Usando JDK 1.6 o posterior

Justin ha señalado 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 OpenSSL instalado. Muchos sistemas operativos ya lo tienen instalado como encontré con Mac OS X.

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

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

TENGA EN CUENTA 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 utilizando la utilidad keytool de Java con el siguiente comando:

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

Finalmente, si lo necesita, puede convertir esto en 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
MikeD
fuente
28
no es necesario seguir los tres pasos, simplemente ejecute: keytool -importkeystore -srckeystore mykeystore.pxf -destkeystore clientcert.jks -srcstoretype pkcs12 -deststoretype JKS
JustinMorris
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.
David Brossard
2
Tenga en cuenta que di esa respuesta en una forma más simple con más detalles un año antes que Justin.
gjpc
@gjpc Anotado. Tu respuesta es muy completa y merece muchos votos
positivos
Esta es realmente una gran respuesta y me salvó después de días de investigación. Esta respuesta realmente merece muchos más votos a favor. Gracias Señor.
Mythul
22

jarsigner puede usar su archivo pfx como almacén de claves para firmar su jar. Asegúrese de que su archivo pfx tenga la clave privada y la cadena de certificados cuando lo exporte. No es necesario 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

Una vez que tenga su alias, firmar es fácil

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

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

Una vez firmado, admire su trabajo:

jarsigner.exe -verify -verbose -certs  yourjarfile
gjpc
fuente
1
+1 por no tener que convertir el archivo del almacén de claves (¡ya lo tengo en suficientes formatos!)
Trejkaz
22

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
kaptan
fuente
3
¡Esta debería ser la respuesta completa!
JustAGuy
Estaba buscando una respuesta como esta - con nombre de alias
user3437460
Tengo un problema, el pfx no tiene contraseña, así que -srcstorepasses mi problema. Este PFX es creado por un cliente LetsEncrypt para Windows
FiruzzZ
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, usando OpenSSL) e impórtelos a su almacén de claves Java.

Editar

Más información:

  • Descarga 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 la clave privada y el certificado en el almacén de claves de Java utilizando keytool.
Bernardo
fuente
¿Podría decirme cómo puedo importar key.pem y cert.pem usando keytool?
Sad Al Abdullah
1
Pequeña adición: debe agregar -nodes al final al exportar ky privado
morgan_il
2

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

Para solucionar este problema, existen 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 otros lugares.

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

Ciertos clientes de servicios web basados ​​en .Net fallan (no se puede establecer una relación de confianza), si no hace lo anterior.

TechIsFun
fuente
Esto no parece funcionar en IE11. No se incluye la cadena de certificados a pesar de que se lo digo. Aunque sé que esto ha funcionado en el pasado.
Brian Knoblauch
0

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

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

Mariano Paniga
fuente