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也不是一个可行的选择。
我错过了什么?
答案 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-protocols 和https://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并处于领先地位。
另见