程序问答   发布时间:2022-06-02  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了Java SSL DH密钥对生成-原始大小错误大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。

如何解决Java SSL DH密钥对生成-原始大小错误?

开发过程中遇到Java SSL DH密钥对生成-原始大小错误的问题如何解决?下面主要结合日常开发的经验,给出你关于Java SSL DH密钥对生成-原始大小错误的解决方法建议,希望对你解决Java SSL DH密钥对生成-原始大小错误有所启发或帮助;

首先,“无限力量”在这里无关紧要。这将解决完全不同的问题,即您无法使用使用AES-256的密码套件(如果对等方坚持要求它们根本不能握手)。JVM的位大小也无关紧要;对DH的这种限制(不是很合理的限制)在SunJCE中的“无处不在”字节码中。@H_616_3@

您可以将BouncyCastle用作加密提供程序,而无需更改进行SSL连接的代码(在您的情况下为Scribe),但是据我所知,使BC成为首选提供程序会导致其他问题。如果仍然要尝试,请将bcprov- version.jar放在JRE / lib / exit中,然后编辑JRE / lib / security / java.security。或将其放在您的类路径中的任何位置,并让您的初始化代码调用java.security.Security.insertProvIDerAt(新的org.bouncycastle.jce.provIDer.bouncyCastleProvIDer(),位置);@H_616_3@

我建议从您的本地系统正常工作的原因开始。当我尝试使用带有openssl的ssl.reddit.com时,它同时支持ECDHE-RSA(带P-256)和dh 2048位的DHE-RSA。Suncle Java7确实支持并更喜欢ECDHE,我希望OpenJDK也可以,但也许不支持,或者有时不支持。我知道RedHat直到最近才在ECC的openssl转速中采用ECC,如果他们也在openjdk中这样做也不会感到惊讶。如果编译并运行以下命令(使用ssl.reddit.com 443),它将使用JRE的所有默认SSL设置(我希望/希望Scribe也正在使用)来告诉您系统上协商了哪个套件:@H_616_3@

//nopackage DThompson 2012.08.13b
import java.net.InetSocketAddress;
import java.net.socket;
import javax.net.ssl.SSLSocket;
import javax.net.ssl.SSLSocketFactory;

public class JustBConnectSSL {

    /* (optionally bind and) just make SSL connection, for tesTing reach and trust
     * uses default provIDers, truststore (normally JRE/lib/security/[Jsse]cacerts), 
     * and keystore (normally nonE), overrIDe with -Djavax.net.ssl.{trust,key}Store* 
     */
    public static voID main (String[] args) throws Exception {
        if( args.length < 2 ){ System.out.println ("Usage: tohost port [fromaddr [fromport]]"); return; }
        Socket sock = SSLSocketFactory.getDefault().createSocket();
        if( args.length > 2 )
            sock.bind (new InetSocketAddress (args[2], args.length>3? @R_944_8056@r.parseInt(args[3]): 0));
        sock.connect (new InetSocketAddress (args[0], @R_944_8056@r.parseInt(args[1])));
        System.out.println (sock.geTinetAddress().getHostname() + " = " + sock.geTinetAddress().getHostAddress());
        ((SSLSocket)sock).startHandshake();
        System.out.println ("connect okay " + ((SSLSocket)sock).getSession().getCipherSuite());
    }
}

如果测试得到_DHE_RSA_something,则您的JRE中的加密提供程序必须与Suncle的不同,可以通过Ubuntu进行更改,也可以通过系统上的某些自定义或补丁程序进行更改。如果测试得到_ECDHE_RSA_something,但OpenShift却没有,则他们可能已以某种方式禁用了ECC / ECDHE。如果他们能够做到最好(ECDHE-P-256至少与DH-2048一样安全,并且效率可能更高)。否则,直到Oracle修复此问题(显然是在8版中),我认为可以依靠的唯一方法是禁用DHE套件(并退回纯RSA,这可能无法抵御NSA);这在实际创建SSLSocket的代码中最简单,但是如果Scribe(像大多数Java Web客户端一样)使用URL->@H_616_3@

解决方法

我目前正在将Reddit OAuth2登录实现到我的Web应用程序中。在本地进行测试时,握手和令牌交换工作正常,但是在服务器上运行(托管在“
OpenShift” DIY卡式盒上)时,出现以下错误:@H_616_3@

java.security.InvalidAlgorithmParameterException: Prime size must be 
multiple of 64,and can only range from 512 to 1024 (inclusivE)

这是结果@H_616_3@

java.lang.RuntimeException: Could not generate DH keypair

我一天中大部分时间都在搜索,发现了从更改Java版本到使用BouncyCastle的各种解决方案。但是,我使用的是Scribe库,所以我认为如果不分叉和更改抄写员的基础,就无法实现BouncyCastle,这会破坏其目的。@H_616_3@

也出现了安装JCE Unlimited
Strength的问题,但是由于没有root访问权,因此我无法在OpenShift上进行安装(可能可以让他们的团队之一来执行此操作)。@H_616_3@

使用的Java版本是(取自java -version):@H_616_3@

本地测试机:@H_616_3@

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服务器:@H_616_3@

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)

我无所适从以解决这个问题。希望我是愚蠢的或误解了某件事,所以任何可能的解决方案都将是不错的选择!@H_616_3@

-@H_616_3@

编辑1@H_616_3@

返回错误的请求代码(如前所述,使用Scribe,因此可能用处不大)。令牌端点正在https://ssl.reddit.com/api/v1/access_token使用POST。就像我上面说的,这可以在我的测试机上工作。@H_616_3@

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());

大佬总结

以上是大佬教程为你收集整理的Java SSL DH密钥对生成-原始大小错误全部内容,希望文章能够帮你解决Java SSL DH密钥对生成-原始大小错误所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。