小编sam*_*sam的帖子

为什么SSL握手会给出"无法生成DH密钥对"的异常?

当我与某些IRC服务器建立SSL连接(但不是其他服务器 - 可能是由于服务器的首选加密方法),我得到以下异常:

Caused by: java.lang.RuntimeException: Could not generate DH keypair
    at com.sun.net.ssl.internal.ssl.DHCrypt.<init>(DHCrypt.java:106)
    at com.sun.net.ssl.internal.ssl.ClientHandshaker.serverKeyExchange(ClientHandshaker.java:556)
    at com.sun.net.ssl.internal.ssl.ClientHandshaker.processMessage(ClientHandshaker.java:183)
    at com.sun.net.ssl.internal.ssl.Handshaker.processLoop(Handshaker.java:593)
    at com.sun.net.ssl.internal.ssl.Handshaker.process_record(Handshaker.java:529)
    at com.sun.net.ssl.internal.ssl.SSLSocketImpl.readRecord(SSLSocketImpl.java:893)
    at com.sun.net.ssl.internal.ssl.SSLSocketImpl.performInitialHandshake(SSLSocketImpl.java:1138)
    at com.sun.net.ssl.internal.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java:1165)
    ... 3 more
Run Code Online (Sandbox Code Playgroud)

最终原因:

Caused by: java.security.InvalidAlgorithmParameterException: Prime size must be multiple of 64, and can only range from 512 to 1024 (inclusive)
    at com.sun.crypto.provider.DHKeyPairGenerator.initialize(DashoA13*..)
    at java.security.KeyPairGenerator$Delegate.initialize(KeyPairGenerator.java:627)
    at com.sun.net.ssl.internal.ssl.DHCrypt.<init>(DHCrypt.java:100)
    ... 10 more
Run Code Online (Sandbox Code Playgroud)

演示此问题的服务器示例是aperture.esper.net:6697(这是一个IRC服务器).没有证明问题的服务器示例是kornbluth.freenode.net:6697.[毫不奇怪,每个网络上的所有服务器共享相同的行为.]

我的代码(如上所述,在连接到某些SSL服务器时有效)是:

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

这是抛出异常的最后一个startHandshake.是的,'trustAllCerts'有一些魔力; 该代码强制SSL系统不验证证书.(所以...不是证书问题.) …

java ssl cryptography diffie-hellman

139
推荐指数
11
解决办法
28万
查看次数

标签 统计

cryptography ×1

diffie-hellman ×1

java ×1

ssl ×1