Java SSL DH paire de Clés de Génération - le Premier Erreur de Taille
Je suis actuellement à la mise en œuvre de Reddit OAuth2 connecter à mon application web. La poignée de main et un jeton d'échange du bon travail, lors des tests en local, mais lors de l'exécution sur le serveur (hébergé sur 'La' BRICOLAGE cartouche), je reçois le message d'erreur suivant:
java.security.InvalidAlgorithmParameterException: Prime size must be
multiple of 64, and can only range from 512 to 1024 (inclusive)
Qui est des résultats en
java.lang.RuntimeException: Could not generate DH keypair
J'ai été à la recherche de la plupart de la journée et ont trouvé des solutions différentes, allant de changer de version de Java à l'aide de BouncyCastle. Cependant, je suis en utilisant le Scribe de la bibliothèque, donc je ne pense pas que je peux mettre en œuvre BouncyCastle sans fork et la modification de la base de scribe, quel genre de défaites le but.
Installation JCE Force Illimitée venu, mais je ne peux pas le faire sur OpenShift comme il n'y a pas d'accès à la racine (ce qui pourrait être en mesure d'obtenir l'un de leur équipe pour le faire).
Les versions de java en cours d'utilisation sont (pris à partir de java -version
):
Local De La Machine D'Essai:
java version "1.7.0_51"
OpenJDK Runtime Environment (IcedTea 2.4.4) (7u51-2.4.4-1ubuntu1)
OpenJDK 64-Bit Server VM (build 24.45-b08, mixed mode)
OpenShift Serveur:
java version "1.7.0_51"
OpenJDK Runtime Environment (rhel-2.4.4.1.el6_5-i386 u51-b02)
OpenJDK Server VM (build 24.45-b08, mixed mode)
Je suis à une perte quant à ce que je peux faire pour résoudre ce problème. J'espère que je suis stupide ou suis malentendu quelque chose, de sorte que toute les solutions possibles serait génial!
--
EDIT 1
La demande de code qui renvoie l'erreur (à l'aide de Scribe, comme je l'ai mentionné, donc peut-être pas beaucoup d'utilisation). Le jeton d'extrémité est https://ssl.reddit.com/api/v1/access_token
l'aide de POST. Comme je l'ai dit ci-dessus, cela fonctionne sur ma machine de test.
OAuthRequest request = new OAuthRequest(getAccessTokenVerb(), getAccessTokenEndpoint());
request.addHeader("Authorization", "Basic"
+Base64.encode((config.getApiKey()+":"+config.getApiSecret()).getBytes()));
request.addBodyParameter("state", "none");
request.addBodyParameter(OAuthConstants.SCOPE, config.getScope());
request.addBodyParameter(OAuthConstants.CLIENT_ID, config.getApiKey());
request.addBodyParameter(OAuthConstants.REDIRECT_URI, config.getCallback());
request.addBodyParameter(OAuthConstants.CODE, verifier.getValue());
request.addBodyParameter("grant_type", "authorization_code");
Response response = request.send(); //Errors here from Request.createConnection in the Scribe code
return getAccessTokenExtractor().extract(response.getBody());
- Pouvez-vous poster le code que vous utilisez pour générer la paire de clés afin que nous puissions tester avec elle?
- Voir aussi stackoverflow.com/questions/6851461/...
Vous devez vous connecter pour publier un commentaire.
D'abord "l'Illimité de la Force" n'est pas pertinent ici. Cela peut résoudre le totalement différent de ce que vous ne pouvez pas utiliser les suites de chiffrement à l'aide de l'algorithme AES-256 (et si le peer insiste sur le peut pas de poignée de main à tous). Aussi bitsize de la JVM n'a pas d'importance; ce (pas vraiment justifié) restriction sur DH est dans le "run-partout" bytecode dans SunJCE.
Vous pouvez utiliser BouncyCastle comme un crypto fournisseur sans changer le code qui ne les connexions SSL (dans votre cas, le Scribe), mais de ce que j'ai lu de prise de BC le fournisseur privilégié des causes autres problèmes. Si vous voulez essayer, de toute façon, soit mettre bcprov-version.jar dans JRE/lib/sortie et de modifier JRE/lib/security/java.de sécurité; ou le mettre n'importe où dans votre classpath et vous avez votre code d'initialisation d'appel de java.de sécurité.De sécurité.insertProviderAt (nouveau org.bouncycastle.la jce.fournisseur de.BouncyCastleProvider(), position);
Je suggère de commencer à partir de laquelle votre système local NE fonctionne pas. Quand j'essaie ssl.reddit.com avec openssl, il prend en charge ecdhe n'-RSA (avec P-256) et DHE-RSA avec dh 2 048 bits. Suncle Java 7 prend en charge et préfèrent ecdhe n', et je m'attends à OpenJDK le fait aussi, mais peut-être pas, ou peut-être parfois pas; je sais RedHat, jusqu'à récemment, nobbled ECC dans son rpm de openssl, et cela ne m'étonnerait pas si ils l'ont fait dans openjdk aussi. Si vous compilez et exécutez la commande suivante (avec ssl.reddit.com 443), il dira que la suite devient négociés sur votre système, en utilisant tous les SSL par défaut les paramètres de votre environnement JRE (qui je m'attendre/espérer Scribe est également à l'aide):
Si le test est _DHE_RSA_something, la crypto prestataires dans votre JRE doit être différente de la Suncle, soit modifié par Ubuntu ou un certain degré de personnalisation ou d'un patch sur votre système. Si le test est _ECDHE_RSA_something mais La n'est pas le cas, ils peuvent avoir désactivé ECC/ecdhe n'quelque sorte. Si elles peuvent permettre que les meilleurs (ecdhe n'-P-256 est au moins aussi sûr et probablement plus efficace que le DH-2048). Sinon, jusqu'à ce que Oracle corrige ce (apparemment en 8) la seule façon que je pense peut être invoqué est de désactiver DHE suites (et retour à la plaine de RSA, qui ne peut pas être sûr à l'encontre de la NSA), c'est plus simple dans le code qui crée le SSLSocket, mais si Scribe (comme la plupart des java web clients) utilise l'URL -> HttpsUrlConnection avec sa valeur par défaut SSLSocketFactory vous pouvez le remplacer par un tordu usine que les changements de la EnabledCiphers liste le long de la lignes de la question n ° 6851461 (bien que pour un hôte avec un bon certificat public vous n'avez pas besoin de la coutume-trustmanager parties de la solution).
Je sais je suis très en retard pour répondre mais j'ai été aux prises avec le même problème et puis la résoudre. Ma solution est MAC-OS.
/Library/Java/JavaVirtualMachines//table des Matières/Home/jre/lib/ext
ajouter la ligne ci-dessous
de sécurité.fournisseur de.2=org.bouncycastle.la jce.fournisseur de.BouncyCastleProvider
et puis réorganiser tous les autres fournisseurs que vous pourriez avoir.
J'ai résolu le problème sur oracle java 8 en passant à bouncycastle fournisseur pour ssl/tls:
Ajouté bouncycastle à mon projet
Avant de me faire toute SSL trucs, j'ajoute le BouncyCastle fournisseur de 1er fournisseur de la liste:
C'est tout. Maintenant, mes connexions à des sites avec 4096 bits DH paramètres fonctionne comme prévu (je suis en utilisant le Client HTTP Apache). Cela devrait également travailler avec le jdk 7.
Ne sais pas si ça compte, mais la version de OpenJDK en cours d'exécution sur OpenShift est de 32 bits, vous pouvez la consulter en utilisant le Système.getProperty("sun.arch.les données.modèle") dans votre code.
J'ai écrit un rapide de classe juste à la sortie de la bit-ness et compilé sur la OpenShift gear et il a couru et a obtenu 32