Ubuntu 14, Tomcat 7, Java 7
notre.crt, notre.key et Gd_bundle-g2-g1.crt fournis par godaddy. Le paquet contient 3 certificats (vu en consultant le fichier).
Notez que notre clé et notre crt ont été utilisés sur node.js sans problème.
nous avons donc créé un magasin de clés à partir du répertoire existant:
cd /etc/ssl
openssl pkcs12 -export -in our.crt -inkey our.key -out our.p12 -name Tomcat -CAfile Gd_bundle-g2-g1.crt -caname root -chain
Le fichier server.xml est le suivant:
<Server port="8005" shutdown="SHUTDOWN">
<Listener className="org.Apache.catalina.core.JasperListener" />
<Listener className="org.Apache.catalina.core.JreMemoryLeakPreventionListener" />
<Listener className="org.Apache.catalina.mbeans.GlobalResourcesLifecycleListener" />
<Listener className="org.Apache.catalina.core.ThreadLocalLeakPreventionListener" />
<GlobalNamingResources>
<Resource name="UserDatabase" auth="Container"
type="org.Apache.catalina.UserDatabase"
description="User database that can be updated and saved"
factory="org.Apache.catalina.users.MemoryUserDatabaseFactory"
pathname="conf/Tomcat-users.xml" />
</GlobalNamingResources>
<Service name="Catalina">
<Connector port="80" protocol="HTTP/1.1"
connectionTimeout="20000"
URIEncoding="UTF-8"
redirectPort="8443" />
<Connector port="8443" protocol="HTTP/1.1" SSLEnabled="true"
maxThreads="200" scheme="https" secure="true"
keystoreType="PKCS12"
keystoreFile="/etc/ssl/our.p12" keystorePass=""
clientAuth="false" sslProtocol="TLS" />
Nous configurons une redirection locale de 443 à 8443:
iptables -t nat -A PREROUTING -p tcp --dport 443 -j REDIRECT --to-port 8443
Puis essayez https://www.ourserver.com/ourapp
Chrome donne: ERR_SSL_VERSION_OR_CIPHER_MISMATCH
exemples de curl s'exécutant sur une machine locale:
curl -Iv https://www.ourserver.com:8443
* Rebuilt URL to: https://www.ourserver.com:8443/
* Hostname was NOT found in DNS cache
* Trying 1xxxxxxxx...
* Connected to www.ourserver.com (1xxxx) port 8443 (#0)
* successfully set certificate verify locations:
* CAfile: none
CApath: /etc/ssl/certs
* SSLv3, TLS handshake, Client hello (1):
* SSLv3, TLS alert, Server hello (2):
* error:14077410:SSL routines:SSL23_GET_SERVER_HELLO:sslv3 alert handshake failure
* Closing connection 0
curl: (35) error:14077410:SSL routines:SSL23_GET_SERVER_HELLO:sslv3 alert handshake failure
Des idées?
MISE À JOUR 1
J'ai essayé de configurer un nouveau Tomcat 7 sur un nouveau serveur, et j'ai installé une nouvelle copie des certificats, et j'ai obtenu la même erreur.
Essayez d’ajouter l’attribut ciphers
à votre balise de connecteur, comme
ciphers="TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256,TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA,
TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384,TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA,TLS_ECDHE_RSA_WITH_RC4_128_SHA,
TLS_RSA_WITH_AES_128_CBC_SHA256,TLS_RSA_WITH_AES_128_CBC_SHA,TLS_RSA_WITH_AES_256_CBC_SHA256,
TLS_RSA_WITH_AES_256_CBC_SHA,SSL_RSA_WITH_RC4_128_SHA"
Si cela ne vous aide pas, essayez de changer votre attribut de protocole de protocol="HTTP/1.1"
à protocol="org.Apache.coyote.http11.Http11Protocol"
Pour plus de référence voir
Récemment, j'ai eu la même erreur lorsque j'essayais de suivre guide Sécurisation de Bitbucket Server avec Tomcat avec SSL quand j'ai trouvé cette solution ici .
Vous devez convertir du pkcs12
au Java keystore
au format:
keytool -importkeystore \
-deststorepass changeit -destkeypass changeit \
-destkeystore /path/to/my/keystore.jks \
-srckeystore our.p12 -srcstoretype PKCS12
et dans Tomcat, il suffit de définir:
<Connector ...
keystoreFile="/path/to/my/keystore.jks" />
Essayez de basculer sslProtocol sur "TLSv1, TLSv1.1, TLSv1.2". Vous voudrez peut-être y ajouter SSLv2Hello pour les cas de test openssl/curl, car certaines bibliothèques plus anciennes voudront envoyer l'ancien avant de commencer la négociation.
Ubuntu 14, Tomcat 7, Java 7
Quelles versions exactes de Tomcat et de Java 7?
https://wiki.Apache.org/Tomcat/FAQ/Linux_Unix#Q5
Le fichier server.xml est le suivant:
Vous ne mentionnez pas l'implémentation du connecteur que vous utilisez, mais comme AprLifecycleListener
est supprimé de votre server.xml, cela signifie que vous utilisez l'implémentation "Http11Protocol" (ou "BIO"). Bien. Il devrait être visible depuis vos journaux de démarrage. (Si vous aviez utilisé l'implémentation "APR", votre configuration devrait être assez différente).
Une URL étrange. Le numéro de port doit suivre le nom du serveur, https://www.ourserver.com:8443/ourapp
.
Bien que le message "* URL reconstruite à: https://www.ourserver.com:8443/ " de curl semble indiquer qu'il sait comment gérer cela.
erreur: 14077410: routines SSL: SSL23_GET_SERVER_HELLO: échec de la négociation de l'alerte sslv3
Le protocole SSLv3 de Tomcat 7.0.57 et versions ultérieures est désactivé par défaut en raison d'une vulnérabilité SSL publiée (CVE-2014-3566 POODLE). Ce filtrage des protocoles SSL désactive tous les protocoles ayant "SSL" dans leur nom, y compris SSLv2Hello. Apparemment, curl essaie de se connecter ici avec SSLv2Hello ("SSL23" dans son message).
Vous avez besoin d'un client prenant en charge le protocole TLS (TLS 1.0, 1.1 ou 1.2).
https://wiki.Apache.org/Tomcat/Security/POODLE
https://wiki.Apache.org/Tomcat/Security/Ciphers
Essayez de passer sslProtocol à "TLSv1, TLSv1.1, TLSv1.2". Vous voudrez peut-être y ajouter SSLv2Hello pour les scénarios de test openssl/curl, car certaines bibliothèques plus anciennes voudront envoyer le bonjour avant la négociation en amont.
Bon, mais avec une correction: ce qui précède est une valeur pour l'attribut sslEnabledProtocols
(pas sslProtocol
).
Vous pouvez essayer de vous connecter avec OpenSSL,
openssl s_client -connect hostname:8443
openssl s_client -connect hostname:8443 -tls1
OpenSSL Doc: https://openssl.org/docs/apps/s_client.html
Référence de configuration de Tomcat 7: http://Tomcat.Apache.org/Tomcat-7.0-doc/config/http.html#SSL_Support_-_BIO_and_NIO