J'essaie de configurer SSL sur ma jetée.
J'ai lu ceci: http://docs.codehaus.org/display/JETTY/How+to+configure+SSL et créé un magasin de clés.
Ensuite, j'ai sauté directement à la section 4. Mais où est ce fichier de configuration que je dois configurer Jetty?
J'ai essayé de rechercher le fichier jetty.xml, mais il n'y en a pas sur mon ordinateur ...
J'ai eu beaucoup de problèmes pour le faire fonctionner, mais j'ai finalement trouvé comment le faire arriver. J'utilise ubuntu 10.04 avec Java 7. Il peut être possible de le faire sous Windows mais toutes les lignes de commandes sont des commandes bash, peut-être possible de faire la même chose avec cigwin/mingw
J'ai utilisé Jetty 8.1.8. Téléchargez-le depuis codehaus et choisissez le fichier .tar.gz pour linux (.Zip pour windows).
Décompressez le fichier dans le répertoire de votre choix, ce sera votre dossier personnel {jetty} pour cet article/réponse.
Accédez au répertoire {jetty}/etc .
Exécutez toutes les lignes de commande suivantes dans l'ordre. Chaque fois qu'un mot de passe est demandé, saisissez toujours le même mot de passe. Les mots de passe sont utilisés pour protéger le fichier de clés, le magasin de clés et le certificat lui-même. Parfois, un mot de passe sera demandé pour déverrouiller le magasin de clés ou pour utiliser une clé générée. Une fois que vous aurez compris ce que tout est et comment utiliser correctement les mots de passe, vous pourrez changer ces mots de passe lorsque vous vous sentirez prêt (plus sûr pour une utilisation en production). Sinon, entrez les informations demandées lorsque demandé.
openssl genrsa -des3 -out jetty.key
openssl req -new -x509 -key jetty.key -out jetty.crt
keytool -keystore keystore -import -alias jetty -file jetty.crt -trustcacerts
openssl req -new -key jetty.key -out jetty.csr
openssl pkcs12 -inkey jetty.key -in jetty.crt -export -out jetty.pkcs12
keytool -importkeystore -srckeystore jetty.pkcs12 -srcstoretype PKCS12 -destkeystore keystore
Vous devez maintenant modifier {jetty} /etc/jetty-ssl.xml et configurer votre mot de passe pour qu'il corresponde à celui que vous avez utilisé lors de la génération du certificat. Si vous souhaitez masquer votre mot de passe, revenez à la ligne de commande. Allez dans votre répertoire personnel {jetty} et exécutez ce qui suit:
Java -cp lib/jetty-util-8.1.8.v20121106.jar org.Eclipse.jetty.util.security.Password "{PASSWORD}"
Modifiez {MOT DE PASSE} pour votre mot de passe réel puis passez le mot de passe masqué, y compris "OBF:" dans tous les champs de mot de passe trouvés dans jetty-ssl.xml . Notez qu'un mot de passe obscurci comme celui-ci est difficile à lire pour les humains mais facilement non obscurci par programme. Cela empêche simplement les développeurs de connaître le mot de passe lorsqu'ils modifient le fichier. Tous les fichiers de configuration doivent être sécurisés correctement et leurs accès doivent être aussi restrictifs que possible.
Modifiez {jetty} /start.ini et décommentez la ligne # etc/jetty-ssl.xml (il suffit de supprimer le # ).
Jetée de départ:
Java -jar start.jar
Maintenant, contactez votre serveur à: https://localhost:8443
Terminé!
Notez que cette réponse est un moyen rapide d'activer SSL avec jetty. Pour le sécuriser pour la production, vous devez en lire plus sur le sujet.
Réponse mise à jour après plus d'expérience avec les magasins de clés. Je vous assure que cette solution fonctionne parfaitement avec les certificats intermédiaires (29/07/2015).
Remarque: le format PEM signifie un fichier lisible, les certificats commencent par ---BEGIN CERTIFICATE---
et les clés privées commencent par -----BEGIN PRIVATE KEY-----
ligne.
Voici un guide simple étape par étape. Commencez avec un répertoire vide.
Passez à l'étape 2 si vous avez une clé privée (clé codée PEM)
Passez à l'étape 3 si vous avez une demande de signature de certificat (PEM encodé .csr)
Passez à l'étape 4 si vous avez votre certificat (.crt ou .pem encodé en PEM)
Préparez la clé privée (sans mot de passe).
openssl genrsa -des3 -passout pass:1 -out domain.pass.key 2048
openssl rsa -passin pass:1 -in domain.pass.key -out domain.key
rm domain.pass.key
Préparez la demande de signature de certificat (CSR). Nous allons générer cela en utilisant notre clé. Entrez les informations pertinentes lorsque vous y êtes invité. Notez l'utilisation de -sha256
, sans cela, les navigateurs modernes généreront un avertissement.
openssl req -key domain.key -sha256 -new -out domain.csr
Préparez le certificat. Choisissez-en un:
a) Signez-le vous-même
openssl x509 -req -days 3650 -in domain.csr -signkey domain.key -out domain.crt
b) L'envoyer à une autorité
Votre fournisseur SSL vous fournira votre certificat et leurs certificats intermédiaires au format PEM.
Ajoutez à la chaîne de confiance et empaquetez-la au format PKCS12. La première commande définit un mot de passe de fichier de clés pour plus de commodité (sinon vous devrez saisir le mot de passe une douzaine de fois). Définissez un mot de passe différent pour votre sécurité.
export PASS=LW33Lk714l9l8Iv
Choisissez-en un:
a) Certificat auto-signé (pas besoin de certificats intermédiaires)
openssl pkcs12 -export -in domain.crt -inkey domain.key -out domain.p12 -name domain -passout pass:$PASS
keytool -importkeystore -deststorepass $PASS -destkeypass $PASS -destkeystore domain.keystore -srckeystore domain.p12 -srcstoretype PKCS12 -srcstorepass $PASS -alias domain
b) Nécessité d'inclure des certificats intermédiaires
Téléchargez les certificats intermédiaires et concattez-les dans un seul fichier. L'ordre doit être sous root.
cat sub.class1.server.ca.pem ca.pem > ca_chain.pem
Utiliser un -caname
paramètre pour chaque certificat intermédiaire dans le fichier de chaîne, selon l'ordre dans lequel ils ont été placés dans le fichier de chaîne.
openssl pkcs12 -export -in domain.crt -inkey domain.key -out domain.p12 -name domain -passout pass:$PASS -CAfile ca_chain.pem -caname sub1 -caname root -chain
keytool -importkeystore -deststorepass $PASS -destkeypass $PASS -destkeystore domain.keystore -srckeystore domain.p12 -srcstoretype PKCS12 -srcstorepass $PASS -alias domain
Remarque importante: bien que keytool -list
ne listera qu'une seule entrée et non aucun certificat intermédiaire, cela fonctionnera parfaitement.
Configurez la jetée.
Bouge toi domain.keystore
fichier vers JETTY_HOME/etc /.
Choisissez-en un:
a) Vous utilisez de nouveaux start.ini
configuration de style (Jetty 8+):
jetty.keystore=etc/domain.keystore
jetty.truststore=etc/domain.keystore
jetty.keystore.password=LW33Lk714l9l8Iv
jetty.keymanager.password=LW33Lk714l9l8Iv
jetty.truststore.password=LW33Lk714l9l8Iv
b) Vous utilisez une configuration de style ancien avec des fichiers .xml (vous devez mettre à niveau vers un nouveau style!):
Éditer JETTY_HOME/etc/jetty-ssl.xml
fichier et changez la partie ci-dessous. Remplacez les pièces du mot de passe pour correspondre à votre mot de passe. Nous ne définissons pas KeyManagerPassword
car notre clé n'a pas de mot de passe.
<Configure id="Server" class="org.Eclipse.jetty.server.Server">
<New id="sslContextFactory" class="org.Eclipse.jetty.http.ssl.SslContextFactory">
<Set name="KeyStore"><Property name="jetty.home" default="." />/etc/keystore</Set>
<Set name="KeyStorePassword">LW33Lk714l9l8Iv</Set>
<Set name="TrustStore"><Property name="jetty.home" default="." />/etc/keystore</Set>
<Set name="TrustStorePassword">LW33Lk714l9l8Iv</Set>
</New>
<Call name="addConnector">...</Call>
</Configure>
Modifiez le fichier start.ini pour inclure le fichier jetty-ssl.xml.
(Re) démarrer la jetée.
Notez que ce fichier de clés peut également être utilisé avec d'autres conteneurs comme Tomcat. Bonne chance!
Je viens d'acheter un certificat de godaddy pour seulement 6 $/an. Beaucoup tant que ça dure. Voici les étapes que j'ai suivies pour le configurer sur Amazon EC2/Ubuntu/Jetty en fonction de ces sites et la réponse de Jean-Philippe Gravel.
http://docs.codehaus.org/display/JETTY/How+to+configure+SSL
http://community.xmatters.com/docs/DOC-1228#.UgWsI1MU7lc
keytool -keystore keystore -alias jettykey -genkey -keyalg RSA
Notez que "Prénom et nom" doit être votre nom de domaine complet (sans http: //). Lors de ma première tentative, j'avais consciencieusement mis mon prénom et mon nom de famille, mais godaddy a de bons avertissements et l'a rejeté.
Générez un fichier CSR pour Godaddy:
keytool -certreq -alias jetty -keystore keystore -file jetty.csr
Soumettez-le dans le formulaire Godaddy pour créer le certificat, y compris la "DEMANDE DE NOUVEAU CERTIFICAT" DEBUT/FIN.
(Godaddy vous oblige à vérifier son site. Il existe quelques méthodes pour cela et comme j'ai acheté le nom de domaine via un proxy, je l'ai trouvé plus facile et plus rapide à vérifier en hébergeant une page html générée par godaddy.)
Téléchargez le Zip contenant à la fois le certificat et le certificat intermédiaire de godaddy. Il existe une liste de types de serveurs parmi lesquels choisir. Je choisis "autre". Combinez ensuite le certificat avec le certificat intermédiaire.
cat mydomain.com.crt Gd_bundle.crt > certchain.txt
exporter ma clé privée
keytool -importkeystore -srckeystore keystore -destkeystore intermediate.p12 -deststoretype PKCS12
openssl pkcs12 -in intermediate.p12 -out jettykey.pem -nodes
combiner clé privée et certificat
openssl pkcs12 -export -inkey jettykey.pem -in certchain.txt -out jetty.pkcs12
import pkcs12 cert (l'alias devient 1)
keytool -importkeystore -srckeystore jetty.pkcs12 -srcstoretype PKCS12 -destkeystore keystore
(J'ai sauvegardé le magasin de clés, puis supprimé la clé d'origine. Je l'ai fait lors du dépannage et cela peut ou non être requis par Jetty.)
keytool -delete -keystore keystore -alias jettykey
Sudo cp keystore /usr/share/jetty/etc/
Sudo vi /usr/share/jetty/etc/jetty-ssl.xml
Modifiez votre.mot de passe.magasin, votre.mot de passe.clé et votre.mot de passe.trust en conséquence. Si vous voulez l'obscurcir, utilisez
Java -cp /usr/share/jetty/lib/jetty.jar:/usr/share/jetty/lib/jetty-util.jar org.mortbay.jetty.security.Password <your.password>
Indiquez à Jetty de charger le fichier jetty-ssl.xml.
Sudo echo "/etc/jetty/jetty-ssl.xml" >> /etc/jetty/jetty.conf
Sudo /sbin/iptables -t nat -I PREROUTING -p tcp --dport 443 -j REDIRECT --to-port 8443
(Modifiez également le groupe de sécurité Amazon EC2 pour autoriser 443)
Sudo service jetty start
Un fichier de configuration par défaut pour Jetty et se trouve à $JETTY_HOME/etc/jetty.xml
Si vous utilisez le plugin jetty de maven, vous devrez spécifier les détails du fichier de clés SSL dans votre fichier pom.xml. Voir cette question pour plus de détails
Si vous travaillez avec Jetty 9.3, vous devez modifier la configuration dans start.d/ssl.ini
:
jetty.sslContext.keyStorePath=mystore.jks
jetty.sslContext.keyStorePassword=X
jetty.sslContext.keyManagerPassword=X
jetty.sslContext.trustStorePath=mystore.jks
jetty.sslContext.trustStorePassword=X
Où:
mystore.jks
est votre magasin généré avec le keytool
X
est votre mot de passe en texte brut (je recommanderais d'ignorer l'obscurcissement car il ne vous donne qu'une fausse sécurité)Le magasin est exactement le même que celui que vous générez pour Tomcat. Même si vous avez utilisé une version différente de Java pour générer le fichier de clés, cela ne devrait pas poser de problème.
Lorsque vous essayez sur Windows avec Jetty en tant que plugin Maven, les étapes suivantes peuvent vous aider:
pom.xml
<plugin>
<groupId>org.mortbay.jetty</groupId>
<artifactId>jetty-maven-plugin</artifactId>
<version>8.1.11.v20130520</version>
<configuration>
<scanIntervalSeconds>10</scanIntervalSeconds>
<webApp>
<contextPath>/yourappcontext</contextPath>
</webApp>
<connectors>
<connector implementation="org.Eclipse.jetty.server.nio.SelectChannelConnector">
<port>9090</port>
<maxIdleTime>1</maxIdleTime>
</connector>
<connector implementation="org.Eclipse.jetty.server.ssl.SslSocketConnector">
<port>9443</port>
<keystore>src/test/resources/keystore</keystore>
<keyPassword>123456</keyPassword>
<password>123456</password>
</connector>
</connectors>
</configuration>
</plugin>
Générez la clé/le certificat à l'aide de l'outil JDK keytool
:
keytool -keystore keystore -alias jetty -genkey -keyalg RSA
Cette commande va générer un fichier keystore
que nous devons mettre dans le chemin suivant (ou ce que vous voulez jusqu'à ce qu'il soit configuré dans l'élément keystore
) _ src/test/resources/keystore
.