J'ai ceci dans la configuration d'activemq
<sslContext>
<sslContext keyStore="file:/home/alex/work/amq/broker.ks"
keyStorePassword="password" trustStore="file:${activemq.base}/conf/broker.ts"
trustStorePassword="password"/>
</sslContext>
J'ai une paire de cert x509 et un fichier de clé
Comment importer ces deux-là pour les utiliser dans les connecteurs ssl et ssl + stomp? Tous les exemples, je pourrais google toujours générer la clé eux-mêmes, mais j'ai déjà une clé.
J'ai essayé
keytool -import -keystore ./broker.ks -file mycert.crt
mais cela importe seulement le certificat et non le fichier de clé et entraîne
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.
J'ai essayé de concaténer le cert et la clé mais j'ai obtenu le même résultat
Comment importer la clé?
Croyez-le ou non, keytool ne fournit pas une fonctionnalité de base telle que l'importation d'une clé privée dans le magasin de clés. Vous pouvez essayer cette solution workaround en fusionnant le fichier PKSC12 avec la clé privée dans un magasin de clés.
Ou utilisez simplement KeyMan d'IBM plus convivial pour la gestion du magasin de clés au lieu de keytool.exe.
J'ai utilisé les deux étapes suivantes que j'ai trouvées dans les commentaires/posts liés dans les autres réponses:
Première étape: convertir le certificat et la clé x509 en un fichier pkcs12
openssl pkcs12 -export -in server.crt -inkey server.key \
-out server.p12 -name [some-alias] \
-CAfile ca.crt -caname root
Remarque: Assurez-vous de mettre un mot de passe sur le fichier p12 - sinon vous obtiendrez une exception de référence null lorsque vous essayez de l'importer. (Si quelqu'un d'autre avait ce mal de tête). ( Merci jocull! )
Remarque 2: Vous souhaiterez peut-être ajouter l'option -chain
pour conserver la chaîne de certificats complète. ( Merci Mafuba )
Étape 2: convertissez le fichier pkcs12 en un magasin de clés Java
keytool -importkeystore \
-deststorepass [changeit] -destkeypass [changeit] -destkeystore server.keystore \
-srckeystore server.p12 -srcstoretype PKCS12 -srcstorepass some-password \
-alias [some-alias]
Fini
Step Zero FACULTATIF, créer un certificat auto-signé
openssl genrsa -out server.key 2048
openssl req -new -out server.csr -key server.key
openssl x509 -req -days 365 -in server.csr -signkey server.key -out server.crt
À votre santé!
Keytool dans Java 6 a cette capacité: Importation de clés privées dans un magasin de clés Java à l'aide de keytool
Voici les détails de base de ce post.
Convertissez le certificat existant en PKCS12 à l’aide d’OpenSSL. Un mot de passe est requis lorsque demandé ou la 2e étape se plaindra.
openssl pkcs12 -export -in [my_certificate.crt] -inkey [my_key.key] -out [keystore.p12] -name [new_alias] -CAfile [my_ca_bundle.crt] -caname root
Convertissez le PKCS12 en un fichier de clés Java.
keytool -importkeystore -deststorepass [new_keystore_pass] -destkeypass [new_key_pass] -destkeystore [keystore.jks] -srckeystore [keystore.p12] -srcstoretype PKCS12 -srcstorepass [pass_used_in_p12_keystore] -alias [alias_used_in_p12_keystore]
Et un de plus:
#!/bin/bash
# We have:
#
# 1) $KEY : Secret key in PEM format ("-----BEGIN RSA PRIVATE KEY-----")
# 2) $LEAFCERT : Certificate for secret key obtained from some
# certification outfit, also in PEM format ("-----BEGIN CERTIFICATE-----")
# 3) $CHAINCERT : Intermediate certificate linking $LEAFCERT to a trusted
# Self-Signed Root CA Certificate
#
# We want to create a fresh Java "keystore" $TARGET_KEYSTORE with the
# password $TARGET_STOREPW, to be used by Tomcat for HTTPS Connector.
#
# The keystore must contain: $KEY, $LEAFCERT, $CHAINCERT
# The Self-Signed Root CA Certificate is obtained by Tomcat from the
# JDK's truststore in /etc/pki/Java/cacerts
# The non-APR HTTPS connector (APR uses OpenSSL-like configuration, much
# easier than this) in server.xml looks like this
# (See: https://Tomcat.Apache.org/Tomcat-6.0-doc/ssl-howto.html):
#
# <Connector port="8443" protocol="org.Apache.coyote.http11.Http11Protocol"
# SSLEnabled="true"
# maxThreads="150" scheme="https" secure="true"
# clientAuth="false" sslProtocol="TLS"
# keystoreFile="/etc/Tomcat6/etl-web.keystore.jks"
# keystorePass="changeit" />
#
# Let's roll:
TARGET_KEYSTORE=/etc/Tomcat6/foo-server.keystore.jks
TARGET_STOREPW=changeit
TLS=/etc/pki/tls
KEY=$TLS/private/httpd/foo-server.example.com.key
LEAFCERT=$TLS/certs/httpd/foo-server.example.com.pem
CHAINCERT=$TLS/certs/httpd/chain.cert.pem
# ----
# Create PKCS#12 file to import using keytool later
# ----
# From https://www.sslshopper.com/ssl-converter.html:
# The PKCS#12 or PFX format is a binary format for storing the server certificate,
# any intermediate certificates, and the private key in one encryptable file. PFX
# files usually have extensions such as .pfx and .p12. PFX files are typically used
# on Windows machines to import and export certificates and private keys.
TMPPW=$$ # Some random password
PKCS12FILE=`mktemp`
if [[ $? != 0 ]]; then
echo "Creation of temporary PKCS12 file failed -- exiting" >&2; exit 1
fi
TRANSITFILE=`mktemp`
if [[ $? != 0 ]]; then
echo "Creation of temporary transit file failed -- exiting" >&2; exit 1
fi
cat "$KEY" "$LEAFCERT" > "$TRANSITFILE"
openssl pkcs12 -export -passout "pass:$TMPPW" -in "$TRANSITFILE" -name etl-web > "$PKCS12FILE"
/bin/rm "$TRANSITFILE"
# Print out result for fun! Bug in doc (I think): "-pass " arg does not work, need "-passin"
openssl pkcs12 -passin "pass:$TMPPW" -passout "pass:$TMPPW" -in "$PKCS12FILE" -info
# ----
# Import contents of PKCS12FILE into a Java keystore. WTF, Sun, what were you thinking?
# ----
if [[ -f "$TARGET_KEYSTORE" ]]; then
/bin/rm "$TARGET_KEYSTORE"
fi
keytool -importkeystore \
-deststorepass "$TARGET_STOREPW" \
-destkeypass "$TARGET_STOREPW" \
-destkeystore "$TARGET_KEYSTORE" \
-srckeystore "$PKCS12FILE" \
-srcstoretype PKCS12 \
-srcstorepass "$TMPPW" \
-alias foo-the-server
/bin/rm "$PKCS12FILE"
# ----
# Import the chain certificate. This works empirically, it is not at all clear from the doc whether this is correct
# ----
echo "Importing chain"
TT=-trustcacerts
keytool -import $TT -storepass "$TARGET_STOREPW" -file "$CHAINCERT" -keystore "$TARGET_KEYSTORE" -alias chain
# ----
# Print contents
# ----
echo "Listing result"
keytool -list -storepass "$TARGET_STOREPW" -keystore "$TARGET_KEYSTORE"
Oui, il est triste de constater que keytool ne dispose pas de fonctionnalité pour importer une clé privée.
Pour mémoire, je suis finalement allé à la solution décrite ici
Dans mon cas, j'avais un fichier pem contenant deux certificats et une clé privée cryptée à utiliser dans l'authentification mutuelle SSL . Mon fichier pem ressemblait à ceci:
-----BEGIN CERTIFICATE-----
...
-----END CERTIFICATE-----
-----BEGIN RSA PRIVATE KEY-----
Proc-Type: 4,ENCRYPTED
DEK-Info: DES-EDE3-CBC,C8BF220FC76AA5F9
...
-----END RSA PRIVATE KEY-----
-----BEGIN CERTIFICATE-----
...
-----END CERTIFICATE-----
Voici ce que j'ai fait:
Divisez le fichier en trois fichiers distincts, de sorte que chacun ne contienne qu'une seule entrée, commençant par "--- BEGIN .." et finissant par "--- END ..". Supposons que nous avons maintenant trois fichiers: cert1.pem cert2.pem et pkey.pem
Convertissez pkey.pem au format DER en utilisant openssl et la syntaxe suivante:
openssl pkcs8 -topk8 -nocrypt -in pkey.pem -inform PEM -out pkey.der -outform DER
Notez que si la clé privée est cryptée, vous devez fournir un mot de passe (procurez-vous-le auprès du fournisseur du fichier pem d'origine) Pour convertir au format DER, Openssl vous demandera le mot de passe de la manière suivante: " entrez un mot de passe pour pkey.pem: " Si la conversion aboutit, vous obtiendrez un nouveau fichier appelé" pkey.der ".
Créez un nouveau magasin de clés Java et importez la clé privée et les certificats:
String keypass = "password"; // this is a new password, you need to come up with to protect your Java key store file
String defaultalias = "importkey";
KeyStore ks = KeyStore.getInstance("JKS", "Sun");
// this section does not make much sense to me,
// but I will leave it intact as this is how it was in the original example I found on internet:
ks.load( null, keypass.toCharArray());
ks.store( new FileOutputStream ( "mykeystore" ), keypass.toCharArray());
ks.load( new FileInputStream ( "mykeystore" ), keypass.toCharArray());
// end of section..
// read the key file from disk and create a PrivateKey
FileInputStream fis = new FileInputStream("pkey.der");
DataInputStream dis = new DataInputStream(fis);
byte[] bytes = new byte[dis.available()];
dis.readFully(bytes);
ByteArrayInputStream bais = new ByteArrayInputStream(bytes);
byte[] key = new byte[bais.available()];
KeyFactory kf = KeyFactory.getInstance("RSA");
bais.read(key, 0, bais.available());
bais.close();
PKCS8EncodedKeySpec keysp = new PKCS8EncodedKeySpec ( key );
PrivateKey ff = kf.generatePrivate (keysp);
// read the certificates from the files and load them into the key store:
Collection col_crt1 = CertificateFactory.getInstance("X509").generateCertificates(new FileInputStream("cert1.pem"));
Collection col_crt2 = CertificateFactory.getInstance("X509").generateCertificates(new FileInputStream("cert2.pem"));
Certificate crt1 = (Certificate) col_crt1.iterator().next();
Certificate crt2 = (Certificate) col_crt2.iterator().next();
Certificate[] chain = new Certificate[] { crt1, crt2 };
String alias1 = ((X509Certificate) crt1).getSubjectX500Principal().getName();
String alias2 = ((X509Certificate) crt2).getSubjectX500Principal().getName();
ks.setCertificateEntry(alias1, crt1);
ks.setCertificateEntry(alias2, crt2);
// store the private key
ks.setKeyEntry(defaultalias, ff, keypass.toCharArray(), chain );
// save the key store to a file
ks.store(new FileOutputStream ( "mykeystore" ),keypass.toCharArray());
(facultatif) Vérifiez le contenu de votre nouveau magasin de clés:
keytool -list -keystore mykeystore -storepass password
Type de magasin de clés: JKS Fournisseur de magasin de clés: Sun
Votre magasin de clés contient 3 entrées
cn = ..., ou = ..., o = .., 2 septembre 2014, trustedCertEntry, Certificate empreinte digitale (SHA1): 2C: B8: ...
importkey, 2 septembre 2014, PrivateKeyEntry, empreinte digitale du certificat (SHA1): 9C: B0: ...
cn = ..., o = ...., 2 septembre 2014, trustedCertEntry, empreinte digitale du certificat (SHA1): 83:63: ...
(facultatif) Testez vos certificats et votre clé privée de votre nouveau magasin de clés sur votre serveur SSL: .__ (vous pouvez activer le débogage en tant qu'option VM: -Djavax.net.debug = all)
char[] passw = "password".toCharArray();
KeyStore ks = KeyStore.getInstance("JKS", "Sun");
ks.load(new FileInputStream ( "mykeystore" ), passw );
KeyManagerFactory kmf = KeyManagerFactory.getInstance("SunX509");
kmf.init(ks, passw);
TrustManagerFactory tmf = TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm());
tmf.init(ks);
TrustManager[] tm = tmf.getTrustManagers();
SSLContext sclx = SSLContext.getInstance("TLS");
sclx.init( kmf.getKeyManagers(), tm, null);
SSLSocketFactory factory = sclx.getSocketFactory();
SSLSocket socket = (SSLSocket) factory.createSocket( "192.168.1.111", 443 );
socket.startHandshake();
//if no exceptions are thrown in the startHandshake method, then everything is fine..
Enfin, enregistrez vos certificats avec HttpsURLConnection si vous prévoyez de l’utiliser:
char[] passw = "password".toCharArray();
KeyStore ks = KeyStore.getInstance("JKS", "Sun");
ks.load(new FileInputStream ( "mykeystore" ), passw );
KeyManagerFactory kmf = KeyManagerFactory.getInstance("SunX509");
kmf.init(ks, passw);
TrustManagerFactory tmf = TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm());
tmf.init(ks);
TrustManager[] tm = tmf.getTrustManagers();
SSLContext sclx = SSLContext.getInstance("TLS");
sclx.init( kmf.getKeyManagers(), tm, null);
HostnameVerifier hv = new HostnameVerifier()
{
public boolean verify(String urlHostName, SSLSession session)
{
if (!urlHostName.equalsIgnoreCase(session.getPeerHost()))
{
System.out.println("Warning: URL Host '" + urlHostName + "' is different to SSLSession Host '" + session.getPeerHost() + "'.");
}
return true;
}
};
HttpsURLConnection.setDefaultSSLSocketFactory( sclx.getSocketFactory() );
HttpsURLConnection.setDefaultHostnameVerifier(hv);
D'abord converti en p12:
openssl pkcs12 -export -in [filename-certificate] -inkey [filename-key] -name [Host] -out [filename-new-PKCS-12.p12]
Créez de nouveaux JKS à partir de p12:
keytool -importkeystore -deststorepass [password] -destkeystore [filename-new-keystore.jks] -srckeystore [filename-new-PKCS-12.p12] -srcstoretype PKCS12
Sur la base des réponses ci-dessus, voici comment créer un nouveau magasin de clés pour votre serveur Web basé sur Java, à partir d'un cert Comodo et d'une clé privée créés indépendamment à l'aide de keytool (requiert JDK 1.6+).
Émettez cette commande et entrez l'invite "some server" au mot de passe. "Server.crt" est le certificat de votre serveur et "server.key" est la clé privée que vous avez utilisée pour l'émission de 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"
Ensuite, utilisez keytool pour convertir le magasin de clés p12 en un magasin de clés jks:
keytool -importkeystore -deststorepass somepass -destkeypass somepass -destkeystore keystore.jks -srckeystore server.p12 -srcstoretype PKCS12 -srcstorepass somepass
Importez ensuite les deux autres certificats racine/intermédiaires que vous avez reçus de Comodo:
Importer COMODORSAAddTrustCA.crt:
keytool -import -trustcacerts -alias cert1 -file COMODORSAAddTrustCA.crt -keystore keystore.jks
Importer COMODORSADomainValidationSecureServerCA.crt:
keytool -import -trustcacerts -alias cert2 -file COMODORSADomainValidationSecureServerCA.crt -keystore keystore.jks
Voici les étapes que j'ai suivies pour importer la clé dans un magasin de clés existant - instructions combinées à partir des réponses fournies ici et à d'autres endroits pour obtenir ces étapes qui ont fonctionné pour mon magasin de clés Java:
openssl pkcs12 -export -in yourserver.crt -inkey yourkey.key -out server.p12 -name somename -certfile yourca.crt -caname root
(Si nécessaire, mettez l'option -chain. Cela a échoué pour moi) . Ceci demandera le mot de passe - vous devez donner le mot de passe correct, sinon vous obtiendrez une erreur .__ (erreur de titre ou erreur de remplissage, etc.).
*.jks
:keytool -importkeystore -srckeystore server.p12 -srcstoretype PKCS12 - destkeystore yourexistingjavakeystore.jks -deststoreetype JKS -deststore passez le mot-clé javec passé
(Très important - ne laissez pas de côté les paramètres deststorepass et destkeypass.)
5. Il vous demandera le mot de passe src key store. Entrez Aragorn et appuyez sur Entrée . Le certificat et la clé sont maintenant importés dans votre magasin de clés Java existant.
Les réponses précédentes soulignent correctement que vous ne pouvez le faire qu'avec les outils JDK standard en convertissant d'abord le fichier JKS au format PKCS # 12. Si cela vous intéresse, je propose un utilitaire compact permettant d'importer des clés dérivées d'OpenSSL dans un magasin de clés au format JKS sans avoir à convertir le magasin de clés au format PKCS # 12 au préalable: http://commandlinefanatic.com/cgi-bin/ showarticle.cgi? article = art049
Vous utiliseriez l'utilitaire lié comme ceci:
$ openssl req -x509 -newkey rsa:2048 -keyout localhost.key -out localhost.csr -subj "/CN=localhost"
(signez le CSR, retournez localhost.cer)
$ openssl rsa -in localhost.key -out localhost.rsa
Enter pass phrase for localhost.key:
writing RSA key
$ Java -classpath . KeyImport -keyFile localhost.rsa -alias localhost -certificateFile localhost.cer -keystore localhost.jks -keystorePassword changeit -keystoreType JKS -keyPassword changeit
Si vous avez un fichier PEM (par exemple, server.pem
) contenant:
alors vous pouvez importer le certificat et la clé dans un magasin de clés JKS comme ceci:
1 ) Copiez la clé privée du fichier PEM dans un fichier ascii (par exemple, server.key
).
2 ) Copiez le certificat du fichier PEM dans un fichier ascii (par exemple, server.crt
).
3 ) Exportez le cert et la clé dans un fichier PKCS12:
$ openssl pkcs12 -export -in server.crt -inkey server.key \
-out server.p12 -name [some-alias] -CAfile server.pem -caname root
-CAfile
.winpty
au début de la commande pour pouvoir entrer le mot de passe d'exportation.4 ) Convertissez le fichier PKCS12 en un magasin de clés JKS:
$ keytool -importkeystore -deststorepass changeit -destkeypass changeit \
-destkeystore keystore.jks -srckeystore server.p12 -srcstoretype PKCS12 \
-srcstorepass changeit
srcstorepass
doit correspondre au mot de passe d'exportation de l'étape 3)Ce que j’essayais de faire, c’était d’utiliser une clé privée et un certificat déjà fournis pour signer un message destiné à s’assurer que le message provenait de moi (signature des clés privées lors du chiffrement des clés publiques).
Donc, si vous avez déjà un fichier .key et un fichier .crt?
Essaye ça:
Étape 1: Convertir la clé et le certificat en fichier .p12
openssl pkcs12 -export -in certificate.crt -inkey privateKey.key -name alias -out yourconvertedfile.p12
Étape 2: Importez la clé et créez un fichier .jsk avec une seule commande.
keytool -importkeystore -deststorepass changeit -destkeystore keystore.jks -srckeystore umeme.p12 -srcstoretype PKCS12
Étape 3: Dans votre Java:
char[] keyPassword = "changeit".toCharArray();
KeyStore keyStore = KeyStore.getInstance("JKS");
InputStream keyStoreData = new FileInputStream("keystore.jks");
keyStore.load(keyStoreData, keyPassword);
KeyStore.ProtectionParameter entryPassword = new KeyStore.PasswordProtection(keyPassword);
KeyStore.PrivateKeyEntry privateKeyEntry = (KeyStore.PrivateKeyEntry)keyStore.getEntry("alias", entryPassword);
System.out.println(privateKeyEntry.toString());
Si vous devez signer une chaîne à l'aide de cette clé, procédez comme suit:
Étape 1: convertissez le texte que vous souhaitez chiffrer
byte[] data = "test".getBytes("UTF8");
Étape 2: Obtenir la clé privée encodée en base64
keyStore.load(keyStoreData, keyPassword);
//get cert, pubkey and private key from the store by alias
Certificate cert = keyStore.getCertificate("localhost");
PublicKey publicKey = cert.getPublicKey();
KeyPair keyPair = new KeyPair(publicKey, (PrivateKey) key);
//sign with this alg
Signature sig = Signature.getInstance("SHA1WithRSA");
sig.initSign(keyPair.getPrivate());
sig.update(data);
byte[] signatureBytes = sig.sign();
System.out.println("Signature:" + Base64.getEncoder().encodeToString(signatureBytes));
sig.initVerify(keyPair.getPublic());
sig.update(data);
System.out.println(sig.verify(signatureBytes));
Références:
Programme final
public static void main(String[] args) throws Exception {
byte[] data = "test".getBytes("UTF8");
// load keystore
char[] keyPassword = "changeit".toCharArray();
KeyStore keyStore = KeyStore.getInstance("JKS");
//System.getProperty("user.dir") + "" < for a file in particular path
InputStream keyStoreData = new FileInputStream("keystore.jks");
keyStore.load(keyStoreData, keyPassword);
Key key = keyStore.getKey("localhost", keyPassword);
Certificate cert = keyStore.getCertificate("localhost");
PublicKey publicKey = cert.getPublicKey();
KeyPair keyPair = new KeyPair(publicKey, (PrivateKey) key);
Signature sig = Signature.getInstance("SHA1WithRSA");
sig.initSign(keyPair.getPrivate());
sig.update(data);
byte[] signatureBytes = sig.sign();
System.out.println("Signature:" + Base64.getEncoder().encodeToString(signatureBytes));
sig.initVerify(keyPair.getPublic());
sig.update(data);
System.out.println(sig.verify(signatureBytes));
}
En supposant que vous ayez créé vos certificats et vos clés privées avec Let's Encrypt dans /etc/letsencrypt/live/you.com
:
openssl pkcs12 -export -in fullchain.pem -inkey privkey.pem -out pkcs.p12 \
-name letsencrypt
Cela combine votre certificat SSL fullchain.pem
et votre clé privée privkey.pem
dans un seul fichier, pkcs.p12
.
Vous serez invité à entrer un mot de passe pour pkcs.p12
.
L'option export
indique qu'un fichier PKCS # 12 sera créé plutôt qu'analysé (à partir de le manuel ).
keytool -importkeystore -destkeystore keystore.jks -srckeystore pkcs.p12 \
-srcstoretype PKCS12 -alias letsencrypt
Si keystore.jks
n'existe pas, il sera créé avec le fichier pkcs.12
créé ci-dessus. Sinon, vous importerez pkcs.12
dans le magasin de clés existant.
Ces instructions sont dérivées de cet article de blog .
En savoir plus sur les différents types de fichiers dans /etc/letsencrypt/live/you.com/
.
dans le cas d'une courbe elliptique et répondez à la question importez un certificat x509 existant et une clé privée dans le magasin de clés Java , vous pouvez également consulter ce fil de discussion Comment lire la clé privée EC en Java qui est au format .pem
Créez simplement un magasin de clés PKCS12, Java peut l’utiliser directement maintenant. En fait, si vous répertoriez un magasin de clés de style Java, keytool vous avertit lui-même que PKCS12 est désormais le format préféré.
openssl pkcs12 -export -in server.crt -inkey server.key \
-out server.p12 -name [some-alias] \
-CAfile ca.crt -caname root -chain
Vous devez avoir reçu les trois fichiers (server.crt, server.key, ca.crt) de votre fournisseur de certificat. Je ne suis pas sûr de ce que "-caname root" signifie réellement, mais il semble devoir être spécifié de cette façon.
Dans le code Java, assurez-vous de spécifier le type de magasin de clés approprié.
KeyStore.getInstance("PKCS12")
Mon certificat SSL délivré par Comodo.com a bien fonctionné sous NanoHTTPD.