Java 6 ECDHE密码套件支持

时间:2014-12-05 20:07:15

标签: java ssl

Java 6的Java Cryptography Architecture Standard Algorithm Name Documentation页面列出了ECDHE密码套件。因此,我希望它们在Java 6中得到支持。但是OOTB Java 6和JCE Unlimited Strength策略文件的添加都没有启用它们。

书籍Bulletproof SSL and TLS也表明Java 6支持ECDHE,但需要注意:

  

在服务器上启用ECDHE套件并确定其优先级。 Java 6和7   客户支持这些,并乐意使用它们。 (但要注意这一点   使用Java 6,您必须切换到使用v3握手   在客户端使用ECDHE套件。)

我假设通过v3握手他是指SSLv3?我没有尝试过,但即使这样可行,由于POODLE漏洞,SSLv3也不是一个可行的选择。

我错过了什么?

3 个答案:

答案 0 :(得分:8)

SSL / TLS实施" JSSE" Java 1.6及更高版本支持ECDHE套件如果有可用的(JCE)提供程序用于所需的ECC原语。 Java 1.6 OOTB不包含这样的ECC提供程序,但您可以添加一个。 Java 7和8 包括SunECC提供商。

这似乎是今天的一个热门话题。另见https://security.stackexchange.com/questions/74270/which-forward-secrecy-cipher-suites-are-supported-for-tls1-0-protocolshttps://superuser.com/questions/848698/testing-cipher-suite-using-openssl-for-tomcat-server-is-resulting-in-wrong-manne (令我们惊讶的是,这是从安全中迁移出来的。)

Ristic的书无疑意味着v3 格式 ClientHello。 SSL2和SSL3之间存在重大格式更改,而SSL2 ClientHello无法代表ECC的数据(特别是扩展)。所有版本的TLS(迄今为止)都使用与SSL3相同的格式,(重要的是)具有不同的内容。在早期,SSL客户端经常使用SSL2 格式 ClientHello但使用内容允许升级到SSL3甚至TLS1.0以便成功对抗两个/所有服务器,因为许多SSL2仍在使用中。

2006年左右的Java 1.6客户端是过渡性的 - 默认情况下,它使用SSL2 格式指定版本直到TLS1.0,但是如果服务器同意版本 SSL2而不是更高,客户端中止有一个例外说明生效" SSL2不安全"。这是由伪协议字符串SSLv2Hello控制的,因此在Java 1.6客户端上,您应.setEnabledProtocols删除/排除该字符串。

Java 7和8仍然实现SSLv2Hello但默认情况下不再启用它,因此默认情况下使用v3格式,或者只要将协议指定为(全部)SSL3或更高版本。 7和8也实现了TLS1.1和1.2,其中6没有,尽管默认情况下只有8个在客户端启用它们。如果要连接到仅使用SSL2的旧服务器,则应该只指定SSLv2Hello - 当然,您应该非常努力地不要这样做。

答案 1 :(得分:2)

dave_thompson_085提供的答案是正确的并帮助了我,但我想补充一些说明。正如他所说,可用的算法取决于JCE提供者。我在Centos 5.4上有Sun / Oracle Java 6第45版,它不支持ECDHE OOTB。

所以我需要添加一个额外的JCE提供者,而Bouncy Castle(bouncycastle.org)就是其中之一。按照此处的说明https://www.bouncycastle.org/specifications.html#install 这将支持扩展到例如TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA

另一种方法是使用与Hotspot JRE捆绑在一起的sun.security.pkcs11.SunPKCS11提供程序。你需要一个$ {java.home} /lib/security/nss.cfg 具有以下内容:

var tbody = $('.table-timesheet thead');
tbody.on('blur', ':text', function () {
    var tr = $(this).closest('tr'),
        notEmpty = $(':text', tr).filter(function () {
            return $.trim($(this).val()) != '';
        }).length;
    if (notEmpty) {
        $('.note-input').css('width', '88%').css('float', 'left');
        $('.timesheet-delete-button').css('display', 'block');
        //tr.clone(true).appendTo(tbody).find(':text').val('');
        insRow();
    }
});

function deleteRow(row) {
    var i = row.parentNode.parentNode.rowIndex;
    document.getElementById('table-body').deleteRow(i);
}


function insRow() {
    var table = document.getElementById('table-body');
    var newRow = table.rows[1].cloneNode(true);
    var len = table.rows.length;
    newRow.cells[0].innerHTML = len;

    var inp1 = newRow.cells[1].getElementsByTagName('input')[0];
    inp1.id += len;
    inp1.value = '';
    var inp2 = newRow.cells[2].getElementsByTagName('input')[0];
    inp2.id += len;
    inp2.value = '';
    table.appendChild(newRow);
}

这将使用libnss3,它可以通过本机OS库提供必要的算法。这已经在Ubuntu 12.04上得到验证,但也可以在其他发行版中使用。它不适用于Centos 5.4,因为RH / Centos 5 known具有有限的椭圆曲线支持。

答案 2 :(得分:0)

你需要打开-Djavax.net.debug = all,看看这里发生了什么,并提供示例代码和日志。

在1.6中,SunJSSE支持TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA:http://docs.oracle.com/javase/6/docs/technotes/guides/security/SunProviders.html#SunJSSEProvider

因此,您应该将SSLContext设置为启用的协议。有关详细信息,请查看http://docs.oracle.com/javase/6/docs/technotes/guides/security/jsse/JSSERefGuide.html#SSLContext。您还需要交换已启用的协议,以便启用1.2并处于领先地位。

另见