ALP*_*uid 6 java ssl scribe oauth-2.0 openshift
我目前正在将Reddit OAuth2登录到我的网络应用程序中.握手和令牌交换在本地测试时工作正常但在服务器上运行时(托管在'OpenShift'DIY盒式磁带上)我收到以下错误:
java.security.InvalidAlgorithmParameterException: Prime size must be
multiple of 64, and can only range from 512 to 1024 (inclusive)
Run Code Online (Sandbox Code Playgroud)
结果如何
java.lang.RuntimeException: Could not generate DH keypair
Run Code Online (Sandbox Code Playgroud)
我一直在搜索大部分时间并找到了不同的解决方案,从更改Java版本到使用BouncyCastle.但是,我正在使用Scribe库,所以我不认为我可以实现BouncyCastle而不用分叉和改变划线的基础,这样做会破坏它的目的.
安装JCE Unlimited Strength也出现了,但我不能在OpenShift上做到这一点,因为没有root访问权限(可能能够让他们的团队中的一个人去做).
正在使用的java版本(取自java -version):
本地试验机:
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)
Run Code Online (Sandbox Code Playgroud)
OpenShift服务器:
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)
Run Code Online (Sandbox Code Playgroud)
我无法解决这个问题.希望我是愚蠢或误解的东西,所以任何可能的解决方案都会很棒!
-
编辑1
返回错误的请求代码(正如我所提到的,使用Scribe,因此可能没什么用处).令牌端点正在https://ssl.reddit.com/api/v1/access_token使用POST.正如我上面所说,这适用于我的测试机器.
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());
Run Code Online (Sandbox Code Playgroud)
首先,"无限的力量"在这里无关紧要.这将解决完全不同的问题,即你不能使用AES-256使用密码套件(并且如果对等端坚持它们根本不能握手).JVM的比特也无关紧要; 这个(不是很合理的)对DH的限制是在SunJCE中的"无处不在"字节码中.
您可以使用BouncyCastle作为加密提供程序,而无需更改执行SSL连接的代码(在您的案例中为Scribe),但是从我读过的内容中,BC首选提供程序会导致其他问题.如果你想尝试,或者将bcprov-version.jar放在JRE/lib/exit中并编辑JRE/lib/security/java.security; 或把它放在任何地方你的classpath和你的初始化代码调用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直到最近才在其openssl的rpms中使用了ECC,如果他们在openjdk中这样做的话也不会让我感到惊讶.如果你编译并运行以下(含ssl.reddit.com 443),它会告诉什么套件得到您的系统上协商,使用JRE的所有默认设置SSL(我希望/希望抄写员也使用):
//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? 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());
}
}
Run Code Online (Sandbox Code Playgroud)
如果测试得到_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 - > HttpsUrlConnection及其默认的SSLSocketFactory,您可以替换一个调整后的工厂,改变EnabledCiphers列表的问题#6851461(虽然对于拥有良好公共证书的主机,您不需要该解决方案的自定义信任管理器部分).
| 归档时间: |
|
| 查看次数: |
28151 次 |
| 最近记录: |