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

Java 为什么SSL握手会出现“无法生成DH密钥对”异常?,java,ssl,cryptography,diffie-hellman,Java,Ssl,Cryptography,Diffie Hellman,当我与一些IRC服务器建立SSL连接,但与其他服务器不建立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.ClientH

当我与一些IRC服务器建立SSL连接,但与其他服务器不建立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
是最后一个StartAndShake引发了异常。是的,“信任证书”有一些神奇的作用;该代码强制SSL系统不验证证书。所以不成问题

很明显,一种可能是esper的服务器配置错误,但我搜索了一下,没有找到任何其他关于esper的SSL端口有问题的人的参考资料,而“openssl”连接到它,见下文。所以我想知道这是否是Java默认SSL支持的一个限制,或者其他什么。有什么建议吗

下面是我从命令行使用“openssl”连接到aperture.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。

问题在于基本大小。Java接受的最大可接受大小为1024位。这是一个已知的问题,请参见

我链接到的bug报告提到了一个使用BouncyCastle的JCE实现的错误。希望这对你有用

更新

这被报告为错误,最近已修复


但是,请注意,限制仅提高到2048位。对于大于2048位的尺寸,有:;修复似乎是针对9的。

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

java.lang.ArrayIndexOutOfBoundsException: 64
    at com.sun.crypto.provider.TlsPrfGenerator.expand(DashoA13*..)
我发现的一个论坛帖子也讨论了这一点,但没有提到解决方案。

我找到了一个对我的案例有效的替代方案,尽管我对它一点也不满意。解决方案是将其设置为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()]));

讨厌。

尝试从下载Java加密扩展JCE Unlimited Strength辖区策略文件,并替换JRE中的文件

这对我很有效,我甚至不需要使用BouncyCastle——标准的Sun JCE能够连接到服务器


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

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

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

我从javax.security.debug=ssl中注意到,有时使用的密码套件是TLS\u DHE\u。。。有时,这是一个很好的例子。。。。如果我添加BouncyCastle,则会出现后一种情况。如果选择了TLS_ECDHE_uu,则它大部分时间都有效,但并不总是有效,因此添加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_uuu密码套件

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

    }
}

这是一篇相当古老的文章,但是如果您使用apachehttpd,您可以限制DH的大小。
请参见

Java加密扩展JCE Unlimited Strength Judiction Policy Files Response对我不起作用,但BouncyCastle的JCE提供程序建议起了作用

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

1下载这些JAR:

2将这些jar移动到$JAVA_HOME/lib/ext

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


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

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

1下载这些JAR:

bcprov-jdk15on-152.jar bcprov-ext-jdk15on-152.jar 2将JAR复制到WEB-INF/lib或类路径

3.动态添加提供程序:

导入org.bouncycastle.jce.provider.BouncyCastleProvider


Security.addProvidernew BouncyCastleProvider

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

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

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

您可以在jdk中完全禁用DHE,编辑j re/lib/security/java.security并确保DHE已禁用,例如


jdk.tls.disabledAlgorithms=SSLv3,DHE。

如果您仍然受到此问题的困扰,并且正在使用Apache httpd v>2.4.7,请尝试以下方法:

从url复制:

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

如果基于Java的客户端因异常而中止,例如Java.lang.RuntimeException:无法生成DH密钥对和Java.security.InvalidalgorithParameterException:基本大小必须是64的倍数,并且只能在512到1024之间(包括512到1024之间),并且httpd日志tlsv1警报内部错误SSL警报编号80处于日志级别信息或更高级别,您可以使用SSLCipherSuite(可能与SSLHonorCipherOrder一起)重新排列mod_ssl的密码列表,也可以使用具有1024位素数的自定义DH参数,该参数始终优先于任何内置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参数和END DH参数行)添加到使用SSLCertificateFile指令配置的第一个证书文件的末尾


我在客户端使用Java1.6,它解决了我的问题。我没有降低密码套件等,而是向cert文件添加了一个自定义生成的DH参数。

Yandex Maps server、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时注册了一个提供商。

我们返回了相同的异常错误,在数小时上网后很容易修复

我们下载了在oracle.com上可以找到的最高版本的jdk,安装了它,并将jbossapplicationserver指向安装的新jdk目录


重新启动Jboss,重新处理,问题修复

通过升级到JDK 8解决了这个问题。

对于我来说,以下命令行修复了这个问题:

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


我使用的是JDK1.7.079

我在5.7+Gradle项目+Apache中遇到了这个错误。Gradle试图通过SSL从我们的一台服务器获取一些依赖项

解决方案:

生成DH参数: 使用OpenSSL:

openssl dhparam 1024
示例输出:

-----BEGIN DH PARAMETERS-----
MIGHfoGBALxpfMrDpImEuPlhopxYX4L2CFqQov+FomjKyHJrzj/EkTP0T3oAkjnS
oCGh6p07kwSLS8WCtYJn1GzItiZ05LoAzPs7T3ST2dWrEYFg/dldt+arifj6oWo+
vctDyDqIjlevUE+vyR9MF6B+Rfm4Zs8VGkxmsgXuz0gp/9lmftY7AgEC
-----END DH PARAMETERS-----
将输出附加到Apache的证书文件-SSLCertificateFile参数

重新启动apache

再次尝试构建项目


我在JDK1.6.45上使用了coldfusion 8,但在只提供红色十字而不是图像方面遇到了问题,而且cfhttp无法使用ssl连接到本地Web服务器

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

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

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

从,并将其安装在 C:\jdk6\u 45\jre\lib\ext或您的jdk所在的位置,在coldfusion 8的原始安装中,它将位于C:\JRun4\jre\lib\ext下,但我使用位于coldfusion目录之外的较新jdk 1.6.45。将bcprov-ext-jdk15on-156.jar放在\ext目录中非常重要,这花费了我大约两个小时和一些头发- 然后我用写字板而不是editor.exe编辑了文件C:\jdk6\u 45\jre\lib\security\java.security!并为新供应商填写一行。之后,名单看起来像

#
# 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!)
享受这种感觉。。。 当然
多么美好的夜晚,多么美好的一天。希望这将有助于部分或完全有人在那里。如果你有问题,请发邮件给我的信息。。。上面的域。

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

在使用packetcapture/javax.net.debug=只运行了一次之后,我就能够将一个DHE密码列入黑名单,而对我来说,ECDHE是协商的

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

当不容易更改客户端时,这是一个很好的快速修复方法。

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

我的计划是安装一个更高版本的JDK JDK 7,以便与JDK 6共存,但事实证明,仅仅安装带有rpm的较新JDK是不够的

JDK7安装只有在rpm-U升级选项下才能成功,如下所示

1.下载jdk7 2.RPM安装失败 3.RPM升级成功 4.确认新版本
您可能有不正确的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>



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

原因似乎是:基本大小必须是64的倍数,并且只能从512到1024(含512和1024)。不知道服务器发送的大小,以及规范对此的说明。@PaŭLoeberman:实际上,您可以在问题中看到openssl输出中使用的服务器大小:密码是DHE-RSA-AES256-SHA,服务器公钥是2048位。2048>1024:-。@sleske:不完全是。服务器公钥大小过去是,现在是,cert.s_客户端中的密钥在2011年根本没有显示临时密钥;1.0.2在2015年及以后的版本中,服务器温度键会更高一些。虽然一个好的服务器通常应该使DHE大小与RSA auth大小相同。+1。所有拥有Sun开发者网络帐户的人,请投票支持此错误。谢谢。考虑到存在请求更大大小的服务器,这似乎是一个相当严重的问题!:我试过弹跳卡斯特;如果您将它设置为首选提供商,它会崩溃,并发出不同的异常叹息,我看不到一种明显的方式来仅用于DH。然而,我找到了另一种解决方案,我将添加它作为新的答案。不太酷。这已在较新版本的Java中修复。但我的问题是关于使用旧版本。。当我使用旧版本时,有时它可以工作,有时它会给出上述例外情况。为什么会出现如此随机的行为?如果它是java中的一个bug,那么我想它永远不会工作?2048修复程序被后移植到了IcedTea 2.5.3。较新版本的IcedTea将其增加到4096。问题在于DH prime大小。Java接受的最大可接受大小为2048位。当我们等待Oracle扩展限制时,您可以使用扩展限制的Excelsior Jet进行编译。遗憾的是,这是唯一的方法:。那张票从07年就开了。奇怪的是,这四年来没有采取任何行动。我是java证券的新手。请帮助我在哪里写这段代码?我在这个线程中尝试了所有解决方案,这是唯一一个与我的ibm jvm ibm-java-s390x-60一起工作的解决方案。@Sam,SSLSockets中的变量是什么?我刚刚下载了java SE开发工具包7u25,根据,它仍然是1024。JDK1.7.025更新jre对我来说仍然存在问题。将6.22更新为7.59。问题已解决。@Shashank-升级到JDK 1.8.0_73对我有效。位长度大于1024的DHKeyPairs是从中引入的,但不可公开使用。您还做了其他工作吗?或者只是把这两个文件复制到文件夹里?已经有一段时间了,但据我记忆所及,这就是我所需要做的。除了在之后重新启动任何正在运行的Java进程之外,security.provider.2=org.bouncycastle.jce.provider.BouncyCastleProvider的工作效果更好,将其设置为1。导致默认软件出现错误。这对我也适用,但我已动态添加了一个提供程序。有关详细信息,请参阅此处。非常感谢,这对我很有用,并且是成功构建Tomcat 7.0.78源代码所必需的。@mjj1409,在Java 1.5中,我们没有$Java_HOME/lib/security path刚刚测试了您的解决方案。它按预期工作。谢谢实际上,只需在jdk_HOME/jre/lib/security/java.security中添加jdk.tls.disabledAlgorithms=DHE,ECDHE也可以工作并避免所有这些代码。使用1.7.0_85-b15.Added jdk.tls.disabledAlgorithms=DHE,在jdk_HOME/jre/lib/security/java.security中使用ECDHE,效果很好!非常感谢。使用1.7.0 O不要禁用ECDHE。它与DHE不同,甚至不使用素数。有人能告诉我如何获得“certFilePath”吗。这件事我已经坚持了一个星期了@zSozSot此解决方案运行良好,非常适合我的案例,因为我只想在项目级别而不是服务器/环境级别进行更改。谢谢,谢谢!这对我有用。在我的例子中,是itext导入bcp 1.4导致发送给google的电子邮件失败。我得到了javax.net.ssl.SSLHandshakeException:Unsupported curveId:29,java版本1.6.027,仅在JDK 1.7及更高版本中可用。为我解决了问题JDK1.8.0_144-b01I使用JDK1.7.0_xx面临同样的情况。默认情况下,问题将在使用JDK1.8后解决。但有时我们无法快速升级jdk。所以我的问题在添加系统配置后得到了解决:system.setpropertyhtps.protocols,TLSv1.2;System.setPropertydeployment.security.TLSv1.2,true;请注意,现在人们认为1024位DH在计算上是可行的,尽管破解这个问题的代价非常昂贵。这个问题已经得到了许多答案,并且有一个经过验证的答案。此外,这个问题早在6年前就被提出了。我不确定这是否仍然相关。
#
# 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
java SSLPoke www.onlineumfragen.com 443 (or of course your url!)
.../java/jre/lib/security/java.security:
    jdk.tls.disabledAlgorithms=SSL_DHE_RSA_WITH_AES_256_CBC_SHA
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"
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
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...
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)
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>