为什么SSL握手会产生“无法生成DH密钥对”异常?


142

当我与某些IRC服务器(而非其他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

最终原因:

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

演示此问题的服务器示例是perfection.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();

是最后一个startHandshake引发异常。是的,'trustAllCerts'正在进行一些魔术。该代码会强制SSL系统不验证证书。(所以...这不是证书问题。)

显然,一种可能性是esper的服务器配置错误,但我进行搜索,但未找到其他任何引用来说明esper的SSL端口有问题的人,并且'openssl'连接到它(请参见下文)。所以我想知道这是否是Java默认SSL支持的限制或其他限制。有什么建议?

这是我在命令行中使用“ openssl”连接至Hole.esper.net 6697时发生的情况:

~ $ openssl s_client -connect aperture.esper.net:6697
CONNECTED(00000003)
depth=0 /C=GB/ST=England/L=London/O=EsperNet/OU=aperture.esper.net/CN=*.esper.net/emailAddress=support@esper.net
verify error:num=18:self signed certificate
verify return:1
depth=0 /C=GB/ST=England/L=London/O=EsperNet/OU=aperture.esper.net/CN=*.esper.net/emailAddress=support@esper.net
verify return:1
---
Certificate chain
 0 s:/C=GB/ST=England/L=London/O=EsperNet/OU=aperture.esper.net/CN=*.esper.net/emailAddress=support@esper.net
   i:/C=GB/ST=England/L=London/O=EsperNet/OU=aperture.esper.net/CN=*.esper.net/emailAddress=support@esper.net
---
Server certificate
-----BEGIN CERTIFICATE-----
[There was a certificate here, but I deleted it to save space]
-----END CERTIFICATE-----
subject=/C=GB/ST=England/L=London/O=EsperNet/OU=aperture.esper.net/CN=*.esper.net/emailAddress=support@esper.net
issuer=/C=GB/ST=England/L=London/O=EsperNet/OU=aperture.esper.net/CN=*.esper.net/emailAddress=support@esper.net
---
No client certificate CA names sent
---
SSL handshake has read 2178 bytes and written 468 bytes
---
New, TLSv1/SSLv3, Cipher is DHE-RSA-AES256-SHA
Server public key is 2048 bit
Secure Renegotiation IS supported
Compression: NONE
Expansion: NONE
SSL-Session:
    Protocol  : TLSv1
    Cipher    : DHE-RSA-AES256-SHA
    Session-ID: 51F1D40A1B044700365D3BD1C61ABC745FB0C347A334E1410946DCB5EFE37AFD
    Session-ID-ctx: 
    Master-Key: DF8194F6A60B073E049C87284856B5561476315145B55E35811028C4D97F77696F676DB019BB6E271E9965F289A99083
    Key-Arg   : None
    Start Time: 1311801833
    Timeout   : 300 (sec)
    Verify return code: 18 (self signed certificate)
---

如前所述,毕竟,它确实可以成功连接,这远远超过了我的Java应用程序所能说的。

如果相关,我正在使用OS X 10.6.8,Java版本1.6.0_26。


2
原因似乎是这样的:Prime size must be multiple of 64, and can only range from 512 to 1024 (inclusive)。不知道服务器在这里发送了什么大小,规范对此有何说明。
圣保罗Ebermann

@PaŭloEbermann:实际上,您可以openssl在问题中看到输出中使用的服务器大小:“密码是DHE-RSA-AES256-SHA,服务器公钥是2048位”。以及2048> 1024 :-)。
sleske '16

@sleske:不完全是。Server public key (size)过去和现在都是证书中的密钥。s_client2011年根本没有显示临时密钥;1.0.2在2015年及以后的表现会Server Temp Key更高。虽然一台好的服务器通常应使DHE大小与RSA-auth大小相同。
dave_thompson_085'2013/

Answers:


117

问题是素数大小。Java接受的最大可接受大小为1024位。这是一个已知问题(请参阅JDK-6521495)。

我链接到的错误报告提到了使用BouncyCastle的JCE实现的解决方法。希望这对您有用。

更新

据报道,该错误为JDK-7044060,最近已修复。

但是请注意,该限制仅提高到2048位。对于大于2048位的大小,有JDK-8072452-删除DH密钥的最大素数;该修复程序似乎适用于9。


14
+1。每个拥有Sun Developer Network帐户的人,请对此错误投票。
圣保罗Ebermann

1
谢谢。鉴于存在要求更大尺寸的服务器,这似乎是一个非常严重的问题!:(我尝试过BouncyCastle;如果您将其设置为首选提供程序,则它会崩溃,并带有不同的异常(叹气),而且我看不到将其仅用于DH的明显方法。但是,我找到了另一种解决方案, '将其添加为新答案。(不是很好。)
sam

3
凉。这已在较新版本的Java中修复。但是我的问题是关于使用较旧的版本。.当我使用较旧的版本时,有时它可以工作,并且有时会产生上述异常。.为什么会有这种随机行为?如果它是Java中的错误,那么我猜它永远都不会起作用?
N..13年

2
2048修复程序已反向移植到IcedTea 2.5.3。较新的IcedTea版本将其增加到
4096。– FuzzyTew

1
问题是DH素数大小。Java接受的最大可接受大小为2048位。在我们等待Oracle扩展限制的同时,您可以使用具有扩展限制的Excelsior Jet进行编译。
user1332994

67

“ Java密码术扩展(JCE)无限强度管辖权策略文件”答案对我不起作用,但BouncyCastle的JCE提供者建议有效。

这是我在Mac OSC 10.7.5上使用Java 1.6.0_65-b14-462采取的步骤

1)下载以下罐子:

2)将这些罐子移到$ JAVA_HOME / lib / ext

3)如下编辑$ JAVA_HOME / lib / security / java.security:security.provider.1 = org.bouncycastle.jce.provider.BouncyCastleProvider

使用JRE重新启动应用程序并尝试一下


5
为我工作!虽然不太确定我在做什么。
DiveInto

11
security.provider.2 = org.bouncycastle.jce.provider.BouncyCastleProvider工作得更好,将其置于1.会导致默认软件出错。
TinusSky

1
这对我也适用,但是我已动态添加了提供程序。在这里参考我的 答案以获取详细信息。
v.ladynev

非常感谢,这对我有用,并且是成功构建Tomcat 7.0.78源代码所必需的。
phillipuniverse

@ mjj1409,在Java 1.5中,我们没有$ JAVA_HOME / lib / security路径
Mostafa,

15

这是我的解决方案(java 1.6),也很感兴趣为什么我必须这样做:

我从javax.security.debug = ssl注意到,有时使用的密码套件是TLS_DHE _...,有时是TLS_ECDHE_...。如果我添加BouncyCastle,则会发生后者。如果选择了TLS_ECDHE_,则大部分时间都可以使用,但并非总是如此,因此,即使添加BouncyCastle提供程序也是不可靠的(每两次左右都失败,并出现相同的错误)。我猜想在Sun SSL实现中的某处有时会选择DHE,有时会选择ECDHE

因此,此处发布的解决方案依赖于完全删除TLS_DHE_密码。注意:该解决方案不需要BouncyCastle。

因此,通过以下方式创建服务器认证文件:

echo |openssl s_client -connect example.org:443 2>&1 |sed -ne '/-BEGIN CERTIFICATE-/,/-END CERTIFICATE-/p'

保存此内容,以备稍后参考,这里是SSL http get的解决方案,但不包括TLS_DHE_密码套件。

package org.example.security;

import java.io.BufferedInputStream;
import java.io.BufferedReader;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.InetAddress;
import java.net.Socket;
import java.net.URL;
import java.net.UnknownHostException;
import java.security.KeyStore;
import java.security.cert.Certificate;
import java.security.cert.CertificateFactory;
import java.security.cert.X509Certificate;
import java.util.ArrayList;
import java.util.List;

import javax.net.ssl.HttpsURLConnection;
import javax.net.ssl.SSLContext;
import javax.net.ssl.SSLParameters;
import javax.net.ssl.SSLSocket;
import javax.net.ssl.SSLSocketFactory;
import javax.net.ssl.TrustManagerFactory;

import org.apache.log4j.Logger;

public class SSLExcludeCipherConnectionHelper {

    private Logger logger = Logger.getLogger(SSLExcludeCipherConnectionHelper.class);

    private String[] exludedCipherSuites = {"_DHE_","_DH_"};

    private String trustCert = null;

    private TrustManagerFactory tmf;

    public void setExludedCipherSuites(String[] exludedCipherSuites) {
        this.exludedCipherSuites = exludedCipherSuites;
    }

    public SSLExcludeCipherConnectionHelper(String trustCert) {
        super();
        this.trustCert = trustCert;
        //Security.addProvider(new BouncyCastleProvider());
        try {
            this.initTrustManager();
        } catch (Exception ex) {
            ex.printStackTrace();
        }
    }

    private void initTrustManager() throws Exception {
        CertificateFactory cf = CertificateFactory.getInstance("X.509");
        InputStream caInput = new BufferedInputStream(new FileInputStream(trustCert));
        Certificate ca = null;
        try {
            ca = cf.generateCertificate(caInput);
            logger.debug("ca=" + ((X509Certificate) ca).getSubjectDN());
        } finally {
            caInput.close();
        }

        // Create a KeyStore containing our trusted CAs
        KeyStore keyStore = KeyStore.getInstance("jks");
        keyStore.load(null, null);
        keyStore.setCertificateEntry("ca", ca);

        // Create a TrustManager that trusts the CAs in our KeyStore
        String tmfAlgorithm = TrustManagerFactory.getDefaultAlgorithm();
        tmf = TrustManagerFactory.getInstance(tmfAlgorithm);
        tmf.init(keyStore);
    }

    public String get(URL url) throws Exception {
        // Create an SSLContext that uses our TrustManager
        SSLContext context = SSLContext.getInstance("TLS");
        context.init(null, tmf.getTrustManagers(), null);
        SSLParameters params = context.getSupportedSSLParameters();
        List<String> enabledCiphers = new ArrayList<String>();
        for (String cipher : params.getCipherSuites()) {
            boolean exclude = false;
            if (exludedCipherSuites != null) {
                for (int i=0; i<exludedCipherSuites.length && !exclude; i++) {
                    exclude = cipher.indexOf(exludedCipherSuites[i]) >= 0;
                }
            }
            if (!exclude) {
                enabledCiphers.add(cipher);
            }
        }
        String[] cArray = new String[enabledCiphers.size()];
        enabledCiphers.toArray(cArray);

        // Tell the URLConnection to use a SocketFactory from our SSLContext
        HttpsURLConnection urlConnection =
            (HttpsURLConnection)url.openConnection();
        SSLSocketFactory sf = context.getSocketFactory();
        sf = new DOSSLSocketFactory(sf, cArray);
        urlConnection.setSSLSocketFactory(sf);
        BufferedReader in = new BufferedReader(new InputStreamReader(urlConnection.getInputStream()));
        String inputLine;
        StringBuffer buffer = new StringBuffer();
        while ((inputLine = in.readLine()) != null) 
            buffer.append(inputLine);
        in.close();

        return buffer.toString();
    }

    private class DOSSLSocketFactory extends javax.net.ssl.SSLSocketFactory {

        private SSLSocketFactory sf = null;
        private String[] enabledCiphers = null;

        private DOSSLSocketFactory(SSLSocketFactory sf, String[] enabledCiphers) {
            super();
            this.sf = sf;
            this.enabledCiphers = enabledCiphers;
        }

        private Socket getSocketWithEnabledCiphers(Socket socket) {
            if (enabledCiphers != null && socket != null && socket instanceof SSLSocket)
                ((SSLSocket)socket).setEnabledCipherSuites(enabledCiphers);

            return socket;
        }

        @Override
        public Socket createSocket(Socket s, String host, int port,
                boolean autoClose) throws IOException {
            return getSocketWithEnabledCiphers(sf.createSocket(s, host, port, autoClose));
        }

        @Override
        public String[] getDefaultCipherSuites() {
            return sf.getDefaultCipherSuites();
        }

        @Override
        public String[] getSupportedCipherSuites() {
            if (enabledCiphers == null)
                return sf.getSupportedCipherSuites();
            else
                return enabledCiphers;
        }

        @Override
        public Socket createSocket(String host, int port) throws IOException,
                UnknownHostException {
            return getSocketWithEnabledCiphers(sf.createSocket(host, port));
        }

        @Override
        public Socket createSocket(InetAddress address, int port)
                throws IOException {
            return getSocketWithEnabledCiphers(sf.createSocket(address, port));
        }

        @Override
        public Socket createSocket(String host, int port, InetAddress localAddress,
                int localPort) throws IOException, UnknownHostException {
            return getSocketWithEnabledCiphers(sf.createSocket(host, port, localAddress, localPort));
        }

        @Override
        public Socket createSocket(InetAddress address, int port,
                InetAddress localaddress, int localport) throws IOException {
            return getSocketWithEnabledCiphers(sf.createSocket(address, port, localaddress, localport));
        }

    }
}

最后是这里的用法(certFilePath,如果证书的路径是从openssl保存的):

try {
            URL url = new URL("https://www.example.org?q=somedata");            
            SSLExcludeCipherConnectionHelper sslExclHelper = new SSLExcludeCipherConnectionHelper(certFilePath);
            logger.debug(
                    sslExclHelper.get(url)
            );
        } catch (Exception ex) {
            ex.printStackTrace();
        }

9
刚刚测试了您的解决方案。它按预期工作。谢谢。其实,刚加入jdk.tls.disabledAlgorithms=DHE, ECDHEJDK_HOME/jre/lib/security/java.security也适用,避免所有代码。
Ludovic Guillaume 2015年

3
只是禁用DHE对我有用:jdk.tls.disabledAlgorithms=DHE。使用1.7.0_85-b15。
stephan f 2015年

1
在JDK_HOME / jre / lib / security / java.security中添加了jdk.tls.disabledAlgorithms = DHE,ECDHE并且运行良好!谢谢!使用1.7.0_79
Eric

1
不要禁用ECDHE。它与DHE不同,甚至不使用质数。
kubanczyk

1
有人可以告诉我如何获取“ certFilePath”。我已经坚持了一个星期。@Zsozso
user1172490

13

上面的答案是正确的,但是就解决方法而言,当我将BouncyCastle实现设置为首选提供程序时,我遇到了问题:

java.lang.ArrayIndexOutOfBoundsException: 64
    at com.sun.crypto.provider.TlsPrfGenerator.expand(DashoA13*..)

我发现的一个论坛线程中也对此进行了讨论,但没有提到解决方案。 http://www.javakb.com/Uwe/Forum.aspx/java-programmer/47512/TLS问题

尽管我对此并不满意,但我找到了一种适用于我的情况的替代解决方案。解决方案是进行设置,以使Diffie-Hellman算法完全不可用。然后,假设服务器支持替代算法,它将在正常协商期间进行选择。显然,这样做的弊端是,如果有人设法找到仅支持1024位或更低位的Diffie-Hellman的服务器,那么这实际上意味着它将无法在以前的工作环境下工作。

这是给定SSLSocket的代码(在连接之前):

List<String> limited = new LinkedList<String>();
for(String suite : ((SSLSocket)s).getEnabledCipherSuites())
{
    if(!suite.contains("_DHE_"))
    {
        limited.add(suite);
    }
}
((SSLSocket)s).setEnabledCipherSuites(limited.toArray(
    new String[limited.size()]));

讨厌。


1
可悲的是,这是唯一的方法:(这07年以来门票已经开奇怪的是,一切都没有在4年内已经完成它。
Vivin Paliath

我是Java证券的新手。请帮我在哪里写这段代码?
沙申克2015年

我尝试了该线程中的所有解决方案,这是唯一与我的ibm jvm(ibm-java-s390x-60)一起使用的解决方案。
Gianluca Greco

@Sam,((SSLSocket)s)中的变量是什么?
Mostafa

13

您可以在jdk中完全禁用DHE,编辑jre / lib / security / java.security并确保禁用了DHE,例如。喜欢

jdk.tls.disabledAlgorithms=SSLv3, DHE


4
仅在JDK 1.7和更高版本中可用。链接
hoangthienan

为我解决了问题JDK 1.8.0_144-b01
MrSmith42 '18

12

您可以动态安装提供程序:

1)下载以下罐子:

  • bcprov-jdk15on-152.jar
  • bcprov-ext-jdk15on-152.jar

2)将jar复制到WEB-INF/lib(或您的类路径)

3)动态添加提供者:

import org.bouncycastle.jce.provider.BouncyCastleProvider;

...

Security.addProvider(new BouncyCastleProvider());


该解决方案效果很好,并且非常适合我的情况,因为我只想在项目级别而不是在服务器/环境级别进行更改。谢谢
ishanbakshi

谢谢!这对我有用。在我的情况下是itext导入bcp 1.4,导致发送给Google的电子邮件失败。
Japheth Ongeri-inkalimeva '16

我正在获取javax.net.ssl.SSLHandshakeException:不受支持的curveId:带有Java版本1.6.0_27的29
另一个编码器


6

如果您使用的是jdk1.7.0_04,请升级到jdk1.7.0_21。该问题已在该更新中修复。


2
我刚刚下载的Java SE开发工具包7u25,并根据小程序,我写来确定最大支持DH大小,它仍然是1024
user2666524

1
问题仍然与JDK 1.7.0_25存在
塞巴斯蒂安Vanmechelen

更新jre对我有用。已将6.22更新为7.59。问题解决了。
Elazaron

1
@Shashank-升级到JDK 1.8.0_73对我有用。
dgoverde '16

JDK 1.7.0_91引入的位长大于1024的DHKeyPair,但不公开提供。
另一个编码器

6

您的Maven依赖关系可能不正确。您必须在Maven依赖层次结构中找到这些库:

bcprov-jdk14, bcpkix-jdk14, bcmail-jdk14

如果您有这些依赖关系,那就是错误,并且应该这样做:

添加依赖项:

<dependency>
    <groupId>org.bouncycastle</groupId>
    <artifactId>bcmail-jdk15on</artifactId>
    <version>1.59</version>
</dependency>

从包含错误依赖关系的工件中排除这些依赖关系,在我的情况下是:

<dependency>
    <groupId>com.lowagie</groupId>
    <artifactId>itext</artifactId>
    <version>2.1.7</version>
    <exclusions>
        <exclusion>
            <groupId>org.bouncycastle</groupId>
            <artifactId>bctsp-jdk14</artifactId>                
        </exclusion>
        <exclusion>
            <groupId>bouncycastle</groupId>
            <artifactId>bcprov-jdk14</artifactId>               
        </exclusion>
        <exclusion>
            <groupId>bouncycastle</groupId>
            <artifactId>bcmail-jdk14</artifactId>               
        </exclusion>
    </exclusions>       
</dependency>

该问题已经收到许多答案,并且有一个经过验证的答案。此外,这个问题已在6年前提出。我不确定它是否仍然有用。
David Guyon

5

尝试从Java下载站点下载“ Java密码学扩展(JCE)无限强度管辖权策略文件”,然后替换JRE中的文件。

这对我有用,我什至不需要使用BouncyCastle-标准的Sun JCE能够连接到服务器。

PS。我在更改策略文件之前尝试使用BouncyCastle时遇到了相同的错误(ArrayIndexOutOfBoundsException:64),因此看来我们的情况非常相似。


你还有其他事吗?或只是将2个文件复制到文件夹中?
Joergi

已经有一段时间了,但是据我所记得,那是我要做的。除了随后重新启动任何正在运行的Java进程。
mjomble 2015年

5

如果您仍然被该问题所困扰,并且您正在使用Apache httpd v> 2.4.7,请尝试以下操作:http : //httpd.apache.org/docs/current/ssl/ssl_faq.html#javadh

从网址复制

从版本2.4.7开始,mod_ssl将使用DH参数,其中包括长度超过1024位的质数。但是,Java 7和更早版本将其对DH素数大小的支持限制为最大1024位。

如果基于Java的客户端因诸如java.lang.RuntimeException之类的异常而中止:无法生成DH密钥对和java.security.InvalidAlgorithmParameterException:素数必须是64的倍数,并且只能在512到1024(含)范围内,并且httpd记录tlsv1警报内部错误(SSL警报编号80)(在LogLevel信息或更高级别),您可以通过SSLCipherSuite重新安排mod_ssl的密码列表(可能与SSLHonorCipherOrder结合使用),或者可以将自定义DH参数与1024位素数结合使用,它将始终优先于任何内置DH参数。

要生成自定义的DH参数,请使用

openssl dhparam 1024

命令。或者,您可以使用RFC 2409第6.2节中的以下标准1024位DH参数:

-----BEGIN DH PARAMETERS-----
MIGHAoGBAP//////////yQ/aoiFowjTExmKLgNwc0SkCTgiKZ8x0Agu+pjsTmyJR
Sgh5jjQE3e+VGbPNOkMbMCsKbfJfFDdP4TVtbVHCReSFtXZiXn7G9ExC6aY37WsL
/1y29Aa37e44a/taiZ+lrp8kEXxLH+ZJKGZR7OZTgf//////////AgEC
-----END DH PARAMETERS-----

将自定义参数(包括“ BEGIN DH PARAMETERS”和“ END DH PARAMETERS”行)添加到使用SSLCertificateFile指令配置的第一个证书文件的末尾。


我在客户端使用Java 1.6,它解决了我的问题。我没有降低密码套件之类的费用,而是向证书文件添加了一个自定义生成的DH参数。


请注意,现在相信1024位DH破解在计算上是可行的(尽管费用非常高)。
–plugwash

2

我对Yandex Maps服务器,JDK 1.6和Apache HttpClient 4.2.1遇到相同的问题。错误是

javax.net.ssl.SSLPeerUnverifiedException: peer not authenticated

通过启用调试来-Djavax.net.debug=all 在日志中显示一条消息

Could not generate DH keypair

我通过添加BouncyCastle库bcprov-jdk16-1.46.jar并在地图服务类中注册提供者来解决此问题

public class MapService {

    static {
        Security.addProvider(new BouncyCastleProvider());
    }

    public GeocodeResult geocode() {

    }

}

首次使用时会注册提供者MapService


2

我在运行JDK 6的CentOS服务器上遇到SSL错误。

我的计划是安装更高的JDK版本(JDK 7)与JDK 6共存,但事实证明,仅安装更新的JDK并rpm -i不够。

rpm -U如下图所示,只有通过升级选项才能成功安装JDK 7 。

1.下载JDK 7

wget -O /root/jdk-7u79-linux-x64.rpm --no-cookies --no-check-certificate --header "Cookie: gpw_e24=http%3A%2F%2Fwww.oracle.com%2F; o raclelicense=accept-securebackup-cookie" "http://download.oracle.com/otn-pub/java/jdk/7u79-b15/jdk-7u79-linux-x64.rpm"

2. RPM安装失败

rpm -ivh jdk-7u79-linux-x64.rpm
Preparing...                ########################################### [100%]
        file /etc/init.d/jexec from install of jdk-2000:1.7.0_79-fcs.x86_64 conflicts with file from package jdk-2000:1.6.0_43-fcs.x86_64

3. RPM升级成功

rpm -Uvh jdk-7u79-linux-x64.rpm
Preparing...                ########################################### [100%]
   1:jdk                    ########################################### [100%]
Unpacking JAR files...
        rt.jar...
        jsse.jar...
        charsets.jar...
        tools.jar...
        localedata.jar...
        jfxrt.jar...

4.确认新版本

java -version
java version "1.7.0_79"
Java(TM) SE Runtime Environment (build 1.7.0_79-b15)
Java HotSpot(TM) 64-Bit Server VM (build 24.79-b02, mixed mode)


1

我在JDK 1.6.45上使用了Coldfusion 8,但在给我一个红叉而不是图像的问题上也遇到了问题,并且cfhttp无法使用ssl连接到本地Web服务器。

我的用Coldfusion 8复制的测试脚本是

<CFHTTP URL="https://www.onlineumfragen.com" METHOD="get" ></CFHTTP>
<CFDUMP VAR="#CFHTTP#">

这给了我一个非常普通的错误,即“ I / O异常:对等方未通过身份验证”。然后,我尝试将服务器的证书(包括根证书和中间证书)添加到Java密钥库以及Coldfusion密钥库,但是没有任何帮助。然后我调试了问题

java SSLPoke www.onlineumfragen.com 443

并得到

javax.net.ssl.SSLException: java.lang.RuntimeException: Could not generate DH keypair

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:107)
    ... 10 more

然后,我想到了Web服务器(在我的情况下为Apache)具有非常现代的ssl密码,并且具有严格的限制(qualys得分a +),并且使用具有超过1024位的强diffie hellmann密钥。显然,coldfusion和java jdk 1.6.45无法管理此问题。odysee的下一步是考虑为Java安装替代安全提供程序,因此我决定使用Bouncy Castle。另请参见http://www.itcsolutions.eu/2011/08/22/how-to-use-bouncy-castle-cryptographic-api-in-netbeans-or-eclipse-for-java-jse-projects/

然后,我下载了

bcprov-ext-jdk15on-156.jar

http://www.bouncycastle.org/latest_releases.html并将其安装在C:\ jdk6_45 \ jre \ lib \ ext或您的jdk所在的位置,在Coldfusion 8的原始安装中,它将位于C:\ JRun4 \ jre \ lib \ ext,但是我使用位于Coldfusion目录外部的较新的jdk(1.6.45)。将bcprov-ext-jdk15on-156.jar放在\ ext目录中非常重要(这花了我大约两个小时的时间;-),然后我编辑了文件C:\ jdk6_45 \ jre \ lib \ security \ java.security(使用写字板而不使用editor.exe!),并为新提供程序输入一行。之后列表看起来像

#
# List of providers and their preference orders (see above):
#
security.provider.1=org.bouncycastle.jce.provider.BouncyCastleProvider
security.provider.2=sun.security.provider.Sun
security.provider.3=sun.security.rsa.SunRsaSign
security.provider.4=com.sun.net.ssl.internal.ssl.Provider
security.provider.5=com.sun.crypto.provider.SunJCE
security.provider.6=sun.security.jgss.SunProvider
security.provider.7=com.sun.security.sasl.Provider
security.provider.8=org.jcp.xml.dsig.internal.dom.XMLDSigRI
security.provider.9=sun.security.smartcardio.SunPCSC
security.provider.10=sun.security.mscapi.SunMSCAPI

(请参阅位置1中的新位置)

然后完全重新启动Coldfusion服务。你可以

java SSLPoke www.onlineumfragen.com 443 (or of course your url!)

并享受这种感觉...当然

什么夜晚,什么日子。希望这会(部分或全部)对那里的人有所帮助。如果您有任何疑问,请发邮件至info ...(以上域)。


0

如果服务器支持不包含DH的密码,则可以强制客户端选择该密码并避免DH错误。如:

String pickedCipher[] ={"TLS_RSA_WITH_AES_256_CBC_SHA"};
sslsocket.setEnabledCipherSuites(pickedCipher);

请记住,从长远来看,指定精确密码很容易被破坏。


0

我们返回了相同的异常错误,要解决这个问题很容易,因为在上网数小时之后。

我们下载了可以在oracle.com上找到的jdk的最高版本,进行了安装,并将Jboss应用程序服务器指向已安装的新jdk的目录。

重新启动Jboss,重新处理,解决问题!!!


0

我在Bamboo 5.7 + Gradle项目+ Apache下遇到此错误。Gradle尝试通过SSL从我们的一台服务器中获取某些依赖项。

解:

  1. 生成DH参数:

使用OpenSSL:

openssl dhparam 1024

示例输出:

-----BEGIN DH PARAMETERS-----
MIGHfoGBALxpfMrDpImEuPlhopxYX4L2CFqQov+FomjKyHJrzj/EkTP0T3oAkjnS
oCGh6p07kwSLS8WCtYJn1GzItiZ05LoAzPs7T3ST2dWrEYFg/dldt+arifj6oWo+
vctDyDqIjlevUE+vyR9MF6B+Rfm4Zs8VGkxmsgXuz0gp/9lmftY7AgEC
-----END DH PARAMETERS-----
  1. 将输出追加到证书文件(对于Apache- SSLCertificateFile参数)

  2. 重新启动Apache

  3. 重新启动Bamboo

  4. 尝试再次构建项目


0

我曾经在使用IBM JDK的Java SVN客户端访问svn.apache.org时遇到类似的错误。当前,svn.apache.org为用户提供客户端密码首选项。

在使用数据包捕获功能一次运行/ javax.net.debug = ALL之后,我仅将一个DHE密码列入了黑名单,一切对我来说都是有效的(改为协商ECDHE)。

.../java/jre/lib/security/java.security:
    jdk.tls.disabledAlgorithms=SSL_DHE_RSA_WITH_AES_256_CBC_SHA

一个不容易更改客户端的快速解决方案。


0

最近,我遇到了同样的问题,并将jdk版本从1.6.0_45升级到jdk1.7.0_191后,该问题得以解决。


-1

对我而言,以下命令行解决了该问题:

java -jar -Dhttps.protocols=TLSv1.2 -Ddeployment.security.TLSv1.2=true -Djavax.net.debug=ssl:handshake XXXXX.jar

我正在使用JDK 1.7.0_79


1
我在使用JDK 1.7.0_xx时遇到了同样的情况。默认情况下,使用jdk 1.8后将解决此问题。但是有时我们无法快速升级jdk。所以添加系统配置后,我的问题解决了:System.setProperty(“ https.protocols”,“ TLSv1.2”); System.setProperty(“ deployment.security.TLSv1.2”,“ true”);
拉姆高
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.