Maison >Java >javaDidacticiel >Comment corriger l'exception « Impossible de générer la paire de clés DH » dans les connexions SSL Java ?

Comment corriger l'exception « Impossible de générer la paire de clés DH » dans les connexions SSL Java ?

Patricia Arquette
Patricia Arquetteoriginal
2024-12-06 10:00:27670parcourir

How to Fix the

Dépannage de l'exception « Impossible de générer la paire de clés DH »

Lors d'une tentative de connexion SSL avec certains serveurs IRC (en particulier diaphragme.esper.net : 6697), Java peut rencontrer l'exception « java.lang.RuntimeException : Impossible de générer la paire de clés DH », accompagnée d'une erreur ultérieure. "java.security.InvalidAlgorithmParameterException : la taille principale doit être un multiple de 64 et ne peut aller que de 512 à 1024 (inclus)".

Cause :

Cette exception découle de la taille principale maximale par défaut que Java accepte pour les paires de clés DH, qui est de 1024 bits. Cependant, le serveur qui initie la connexion SSL (dans ce cas, diaphragme.esper.net) tente peut-être de négocier une paire de clés DH avec une taille principale plus grande.

Solution de contournement :

1. Utilisez l'implémentation JCE de BouncyCastle :

Comme suggéré dans le rapport de bogue JDK-6521495, vous pouvez utiliser l'implémentation JCE de BouncyCastle pour remplacer l'implémentation Java par défaut. Cette implémentation alternative prend en charge des tailles de paires de clés DH plus grandes.

2. Mettre à niveau la version Java :

Ce problème a été résolu dans les versions Java récentes. La limite de taille principale maximale a été augmentée à 2 048 bits dans le JDK 7044060 et entièrement supprimée (autorisant des tailles supérieures à 2 048 bits) dans le JDK 8072452. La mise à niveau vers Java 9 ou version ultérieure résoudra le problème.

Exemple ( En utilisant BouncyCastle):

Security.addProvider(new BouncyCastleProvider());

SSLContext sslContext = SSLContext.getInstance("SSL", "BC");
sslContext.init(null, trustAllCerts, new SecureRandom());
s = (SSLSocket)sslContext.getSocketFactory().createSocket();
s.connect(new InetSocketAddress(host, port), timeout);
s.setSoTimeout(0);
((SSLSocket)s).startHandshake();

Remarques supplémentaires :

Alors que le serveur en question, ouverture.esper.net, semble être mal configuré du point de vue des normes , les solutions de contournement décrites ci-dessus permettront à votre application Java de se connecter avec succès et d'établir une session SSL.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn