首先,“无限力量”在这里无关紧要。这将解决完全不同的问题,即您无法使用使用AES-256的密码套件(如果对等方坚持要求它们根本不能握手)。JVM的位大小也无关紧要;对DH的这种限制(不是很合理的限制)在SunJCE中的“无处不在”字节码中。
您可以将BouncyCastle用作加密提供程序,而无需更改进行SSL连接的代码(在您的情况下为Scribe),但是据我所知,使BC成为首选提供程序会导致其他问题。如果仍然要尝试,请将bcprov-
version.jar放在JRE / lib / exit中,然后编辑JRE / lib / security /
java.security。或将其放在您的类路径中的任何位置,并让您的初始化代码调用java.security.Security.insertProviderAt(新的org.bouncycastle.jce.provider.BouncyCastleProvider(),位置);
我建议从您的本地系统正常工作的原因开始。当我尝试使用带有openssl的ssl.reddit.com时,它同时支持ECDHE-RSA(带P-256)和dh
2048位的DHE-RSA。Suncle Java
7确实支持并更喜欢ECDHE,我希望OpenJDK也可以,但也许不支持,或者有时不支持。我知道RedHat直到最近才在ECC的openssl转速中采用ECC,如果他们也在openjdk中这样做也不会感到惊讶。如果编译并运行以下命令(使用ssl.reddit.com
443),它将使用JRE的所有默认SSL设置(我希望/希望Scribe也正在使用)来告诉您系统上协商了哪个套件:
//nopackage DThompson 2012.08.13bimport java.net.InetSocketAddress;import java.net.Socket;import javax.net.ssl.SSLSocket;import javax.net.ssl.SSLSocketFactory;public class JustBConnectSSL { 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? Integer.parseInt(args[3]): 0)); sock.connect (new InetSocketAddress (args[0], Integer.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->



