web-dev-qa-db-fra.com

Activer la journalisation des échecs d'établissement de liaison SSL (journaux des objectifs d'audit) uniquement sur Tomcat 8+ avec Java

Je dois me connecter si une négociation SSL échoue alors qu'un client REST tente de se connecter à mon application. L'application est construite à l'aide de Spring Boot et de Java 8 et déployée sur Tomcat 8. 

Dans le scénario d'échec de la négociation SSL, étant donné que la connexion TLS est interrompue, il est peut-être nécessaire de consigner l'enregistrement dans la couche Tomcat ou en Java, car Tomcat utilise la JVM sous-jacente pour la validation du certificat SSL dans mon cas.

<Connector port="8443" protocol="org.Apache.coyote.http11.Http11NioProtocol" SSLEnabled="true" scheme="https" secure="true" keystoreFile="keyStore-1.jks" keystorePass="password" keystoreType="jks" truststoreFile="TrustStore.jks" truststorePass="passwrd" truststoreType="jks" clientAuth="want" sslProtocol="TLSv1.2" />

Je suis conscient d'activer la journalisation de niveau de débogage. 

-Djavax.net.debug = ssl

Mais cela enregistre beaucoup d’informations et ralentira le processus. Et connectez-vous également au succès des valdiations SSL. Existe-t-il un moyen d'activer les cas d'échec seuls avec des journaux minimum au niveau Java ou Tomcat? 

Je ne cherche PAS cela du point de vue du débogage, car les journaux de débogage SSL sont très utiles pour cela. Cette exigence concerne davantage la journalisation et l’audit et l’activation des journaux de débogage n’est pas une option envisageable.Mécanisme qui enregistre uniquement les erreurs qui se produisent SSL et non toutes les données hexadécimales/cert.

8
Manu

Malheureusement, ce n'est probablement pas possible. Et il n’est pas lié à Tomcat. La journalisation de SSL ne fait pas partie de la journalisation standard dans votre application. Vous pouvez essayer de réduire la sortie avec l’option suivante:

-Djava.net.debug=handshake

Quelques autres:

  • record - Imprimez une trace de chaque enregistrement SSL (au niveau du protocole SSL).
  • handshake - Imprime chaque message de poignée de main dès sa réception
  • keygen - Imprime les données de génération de clé pour l'échange de clé secrète.
  • session - Affiche l'activité de la session SSL.
  • defaultctx - Imprime les informations d'initialisation SSL par défaut.
  • sslctx - Affiche des informations sur le contexte SSL.
  • sessioncache - Affiche des informations sur le cache de session SSL.
  • keymanager - Imprime des informations sur les appels du gestionnaire de clés.
  • trustmanager - Imprime des informations sur les appels au gestionnaire de confiance.
  • data - Pour le suivi de la négociation, imprimez un vidage hexadécimal de chaque message.
  • verbose - Pour tracer une poignée de main, affichez des informations détaillées.
  • texte en clair - Pour le suivi des enregistrements, imprimez un vidage hexadécimal de l'enregistrement.

Voir docs .

Si vous en avez réellement besoin et que les performances sont essentielles pour votre application, vous pouvez instrumenter SSLSocket (dans la documentation, vous pouvez en savoir plus sur le processus de prise de contact) avec ASM / Btrace / etc et vérifier la état de poignée de main à l'intérieur. Mais dans ce cas, vous n’auriez pas d’informations de débogage - seulement vrai/faux.

Voir aussi Documents Tomcat avec tous les paramètres disponibles. Vous pouvez y lire qu'il existe JSSEImplementation class, qui est utilisé dans Tomcat. Et c'est wrapper pour JSSE.

2
egorlitvinenko

J'ai eu le même problème à plusieurs reprises et je l'ai craqué comme moyen suivant. J'avais ma configuration de projet dans intelliJ.

  1. définissez le niveau de débogage de l'option VM: -Djavax.net.debug = all (Options de configuration de la machine virtuelle), enregistrez et appliquez.
  2. Exécutez le projet (App) en mode débogage et vérifiez les appels entre le serveur et le client. vous constaterez qu'il y aura un appel supplémentaire de CertificateRequest du serveur au client dans la console, comme indiqué ci-dessous, par exemple.

*** CertificateRequest Types de certificats: RSA, DSS, ECDSA Algorithmes de signature pris en charge: SHA512withRSA, inconnu (hachage: 0x6, signature: 0x2), SHA512avecECDSA, SHA384avecRSA, inconnu (hachage: 0x5, signature). : 0x2), SHA384withECDSA, SHA256withRSA, Inconnu (dièse: 0x4, signature: 0x2), SHA256withECDSA, SHA224withRSA, Inconnu (hachage: 0x3, signature: 0x2), SHA224avecECDSA, SHA224withRSA, SHA1withRSA, SHA1withDSA, SHA2withRSA, SHA2withRSA, SHA2withRSA, SHA2withRSA, SHA2withRSA, SHA2withRSA, SHA1withDSA

CN = Symantec Public Classe 3, O = Symantec Corporation, C = US

CN = Gestion Symantec de classe 3, OU = Réseau approuvé par Symantec, O = Symantec, C = US

[lire] hash MD5 et SHA1: len = 302 

  1. Si vous pouvez voir la demande de certificat avec "CN" comme ci-dessus, cela signifie que ces certificats sont manquants dans le fichier de clés cacert. 

Solution: ajoutez les certs manquants (pour notre exemple, deux certs CN = Symantec Public Class 3 et CN = Symantec Class 3 Manage).

nous devons comprendre les appels entre serveur et client à l'aide du protocole SSL. Veuillez consulter le lien suivant pour obtenir plus d'informations sur la communication entre serveur et client.

https://docs.Oracle.com/javase/6/docs/technotes/guides/security/jsse/JSSERefGuide.html#InstallProbs

Je donnerai une vidéo de démonstration youtube si quelqu'un a un problème.

J'espère que cette solution aidera quelqu'un.

Je vous remercie.

0
Dhaumik