Tengo esto en una configuración de ActiveMQ:
<sslContext>
<sslContext keyStore="file:/home/alex/work/amq/broker.ks"
keyStorePassword="password" trustStore="file:${activemq.base}/conf/broker.ts"
trustStorePassword="password"/>
</sslContext>
Tengo un par de certificados X.509 y un archivo de clave.
¿Cómo importo esos dos para usarlos en conectores SSL y SSL + stomp? Todos los ejemplos que pude google siempre generan la clave ellos mismos, pero ya tengo una clave.
Yo he tratado
keytool -import -keystore ./broker.ks -file mycert.crt
pero esto solo importa el certificado y no el archivo de clave y da como resultado
2009-05-25 13:16:24,270 [localhost:61612] ERROR TransportConnector - Could not accept connection : No available certificate or key corresponds to the SSL cipher suites which are enabled.
Intenté concatenar el certificado y la clave, pero obtuve el mismo resultado.
¿Cómo importo la clave?
Respuestas:
Lo creas o no, keytool no proporciona una funcionalidad tan básica como importar una clave privada al almacén de claves. Puede probar esta solución alternativa fusionando el archivo PKSC12 con la clave privada en un almacén de claves.
O simplemente use KeyMan más fácil de usar de IBM para el manejo del almacén de claves en lugar de keytool.exe.
fuente
Utilicé los siguientes dos pasos que encontré en los comentarios / publicaciones vinculados en las otras respuestas:
Paso uno: Convierta el certificado x.509 y la clave en un archivo pkcs12
Nota: asegúrese de poner una contraseña en el archivo pkcs12; de lo contrario, obtendrá una excepción de puntero nulo cuando intente importarla. (En caso de que alguien más tuviera este dolor de cabeza). (¡ Gracias jocull! )
Nota 2: es posible que desee agregar la
-chain
opción para preservar la cadena de certificados completa. ( Gracias Mafuba )Paso dos: Convierta el archivo pkcs12 en un almacén de claves Java
Terminado
OPCIONAL Paso cero: Crear certificado autofirmado
¡Salud!
fuente
-CAfile ca.crt -caname root
no generó correctamente los certificados de CA. En cambio, solía-certfile concatenedCAFiles.pem
-chain
argumento con openssl para incluir la cadena de certificados completa en su archivo pfx / p12 si lo desea en su almacén de claves.pvk2pfx
(una herramienta VS estándar disponible en elcmd
indicador VS ).pfx
escupirá un --equivalente a a.p12
. El consejo de @ jocull sigue siendo relevante; ponle una contraseña. No esopenssl
necesario.p12
clave, la contraseña del.p12.
Tomcat original fallarájava.security.UnrecoverableKeyException: Cannot recover key
. En otras palabras: si necesita ejecutar-deststorepass changeit -srcstorepass some-password
con diferentes contraseñas, debe incluir-destkeypass changeit
(con la misma contraseña que-deststorepass
)Keytool en Java 6 tiene esta capacidad: Importar claves privadas en un almacén de claves Java usando keytool
Aquí están los detalles básicos de esa publicación.
Convierta el certificado existente a un PKCS12 usando OpenSSL. Se requiere una contraseña cuando se le solicita o el segundo paso se quejará.
Convierta el PKCS12 a un archivo Java Keystore.
fuente
Y uno mas:
fuente
Primero convierta a p12:
Crear nuevo JKS desde p12:
fuente
Sí, es un hecho triste que keytool no tiene funcionalidad para importar una clave privada.
Para el registro, al final fui con la solución descrita aquí
fuente
En mi caso, tenía un archivo pem que contenía dos certificados y una clave privada encriptada para usar en la autenticación SSL mutua. Entonces mi archivo pem se veía así:
Aquí esta lo que hice:
Divida el archivo en tres archivos separados, de modo que cada uno contenga solo una entrada, comenzando con "--- BEGIN .." y terminando con las líneas "--- END ..". Supongamos que ahora tenemos tres archivos: cert1.pem cert2.pem y pkey.pem
Convierta pkey.pem al formato DER usando openssl y la siguiente sintaxis:
openssl pkcs8 -topk8 -nocrypt -in pkey.pem -inform PEM -out pkey.der -outform DER
Tenga en cuenta que si la clave privada está encriptada, debe proporcionar una contraseña (obtenerla del proveedor del archivo pem original) para convertirla al formato DER, openssl le pedirá la contraseña de esta manera: "ingrese una frase de contraseña para pkey .pem: "Si la conversión es exitosa, obtendrá un nuevo archivo llamado" pkey.der "
Cree un nuevo almacén de claves Java e importe la clave privada y los certificados:
(opcional) Verifique el contenido de su nuevo almacén de claves:
keytool -list -keystore mykeystore -storepass password
(opcional) Pruebe sus certificados y clave privada de su nuevo almacén de claves en su servidor SSL: (Es posible que desee habilitar la depuración como una opción de VM: -Djavax.net.debug = all)
Finalmente, registre sus certificados con HttpsURLConnection si planea usarlo:
fuente
HttpsURLConnection
lugar de intentar escribir el suyo propio. (Otro problema con su ejemplo es que está utilizando el mismo almacén de claves que un almacén de claves y un almacén de confianza, lo cual no siempre es una buena idea ...)Usando los certificados Let's Encrypt
Suponiendo que haya creado sus certificados y claves privadas con Let's Encrypt en
/etc/letsencrypt/live/you.com
:1. Cree un archivo PKCS # 12
Esto combina su certificado SSL
fullchain.pem
y su clave privadaprivkey.pem
en un solo archivo,pkcs.p12
.Se le pedirá una contraseña para
pkcs.p12
.La
export
opción especifica que se creará un archivo PKCS # 12 en lugar de analizarse (del manual ).2. Crear el almacén de claves Java
Si
keystore.jks
no existe, se creará con elpkcs.12
archivo creado anteriormente. De lo contrario, importarápkcs.12
al almacén de claves existente.Estas instrucciones se derivan de esta publicación de blog .
Aquí hay más sobre los diferentes tipos de archivos en
/etc/letsencrypt/live/you.com/
.fuente
En base a las respuestas anteriores, aquí se explica cómo crear un nuevo almacén de claves para su servidor web basado en Java, a partir de un certificado Comodo creado de forma independiente y una clave privada utilizando keytool (requiere JDK 1.6+)
Emita este comando y en el indicador de contraseña ingrese somepass: 'server.crt' es el certificado de su servidor y 'server.key' es la clave privada que utilizó para emitir la CSR:
openssl pkcs12 -export -in server.crt -inkey server.key -out server.p12 -name www.yourdomain.com -CAfile AddTrustExternalCARoot.crt -caname "AddTrust External CA Root"
Luego use keytool para convertir el almacén de claves p12 en un almacén de claves jks:
keytool -importkeystore -deststorepass somepass -destkeypass somepass -destkeystore keystore.jks -srckeystore server.p12 -srcstoretype PKCS12 -srcstorepass somepass
Luego importe los otros dos certificados raíz / intermedios que recibió de Comodo:
Importar COMODORSAAddTrustCA.crt:
keytool -import -trustcacerts -alias cert1 -file COMODORSAAddTrustCA.crt -keystore keystore.jks
Importar COMODORSADomainValidationSecureServerCA.crt:
keytool -import -trustcacerts -alias cert2 -file COMODORSADomainValidationSecureServerCA.crt -keystore keystore.jks
fuente
Puede seguir estos pasos para importar la clave a un almacén de claves existente. Las instrucciones se combinan de las respuestas en este hilo y otros sitios. Estas instrucciones funcionaron para mí (el almacén de claves de Java):
openssl pkcs12 -export -in yourserver.crt -inkey yourkey.key -out server.p12 -name somename -certfile yourca.crt -caname root
(Si es necesario, coloque la opción -chain. Poner eso falló para mí). Esto le pedirá la contraseña: debe proporcionar la contraseña correcta; de lo contrario, recibirá un error (error de encabezado o error de relleno, etc.).
*.jks
archivo, ejecute:keytool -importkeystore -srckeystore server.p12 -srcstoretype PKCS12 -destkeystore yourexistingjavakeystore.jks -deststoretype JKS -deststorepass existingjavastorepassword -destkeypass existingjavastorepassword
(Muy importante, no omita los parámetros deststorepass y destkeypass).
fuente
Las respuestas anteriores señalan correctamente que solo puede hacer esto con las herramientas JDK estándar al convertir primero el archivo JKS al formato PKCS # 12. Si está interesado, preparé una utilidad compacta para importar claves derivadas de OpenSSL en un almacén de claves con formato JKS sin tener que convertir primero el almacén de claves a PKCS # 12: http://commandlinefanatic.com/cgi-bin/showarticle. cgi? article = art049
Usaría la utilidad vinculada de esta manera:
(firme el CSR, regrese localhost.cer)
fuente
Si tiene un archivo PEM (por ejemplo
server.pem
) que contiene:entonces puede importar el certificado y la clave en un almacén de claves JKS como este:
1 ) Copie la clave privada del archivo PEM en un archivo ASCII (por ejemplo
server.key
)2 ) Copie el certificado del archivo PEM en un archivo ascii (por ejemplo
server.crt
)3 ) Exporte el certificado y la clave a un archivo PKCS12:
-CAfile
opción .winpty
al inicio del comando para que se pueda ingresar la contraseña de exportación.4 ) Convierta el archivo PKCS12 en un almacén de claves JKS:
srcstorepass
contraseña debe coincidir con la contraseña de exportación del paso 3)fuente
Lo que estaba tratando de lograr era usar la clave privada y el certificado ya proporcionados para firmar el mensaje que iba a algún lugar que necesitaba asegurarme de que el mensaje provenía de mí (las claves privadas firman mientras se cifran las claves públicas).
Entonces, si ya tiene un archivo .key y un archivo .crt?
Prueba esto:
Paso 1: Convierta la clave y el certificado a un archivo .p12
Paso 2: importe la clave y cree un archivo .jsk con un solo comando
Paso 3: en tu java:
Si necesita firmar alguna cadena con esta clave, haga lo siguiente:
Paso 1: convierta el texto que desea cifrar
Paso 2: Obtenga la clave privada codificada en base64
Referencias
Programa final
fuente
Simplemente haga un almacén de claves PKCS12, Java puede usarlo directamente ahora. De hecho, si enumera un almacén de claves de estilo Java, la herramienta clave en sí misma le alerta sobre el hecho de que PKCS12 es ahora el formato preferido.
Debería haber recibido los tres archivos (server.crt, server.key, ca.crt) de su proveedor de certificados. No estoy seguro de lo que realmente significa "raíz de nombre", pero parece que debe especificarse de esa manera.
En el código Java, asegúrese de especificar el tipo de almacén de claves correcto.
Obtuve mi certificado SSL emitido comodo.com que funciona bien en NanoHTTPD de esta manera.
fuente
en el caso de la curva elíptica y responder la pregunta importar un certificado x509 existente y una clave privada en el almacén de claves de Java , es posible que desee consultar también este hilo Cómo leer la clave privada EC en Java que está en formato de archivo .pem
fuente