我们是非专家尝试 – 到目前为止未能成功 – 更新我们的Web服务器(JBoss-5.1.0.GA)设置以符合Diffie-Hellman标准。 在https://weakdh.org/sysadmin.html上运行testing后,我们被告知需要“生成新的2048位Diffie-Hellman参数”。 过去,我们使用Java keytool生成密钥,但是我们一直无法find关于使用Java keytool生成新的2048位Diffie-Hellman参数的任何信息。 有谁知道如何做到这一点,或可以指出我们在正确的方向吗? 谢谢!
你不能用keytool做到这一点。 首先, keytool根本不支持DH。 其次, keytool不会自己为任何algorithm生成参数,只有私钥/密钥对。 第三,当keytool生成一个密钥对时,它也会生成一个自签名证书( 有时后来被一个“真正的”CA颁发的证书replace),并且不可能为DH生成一个自签名证书,因为DH没有签名。 你可以编写一个非常简单的(约10行)Java程序来生成DH参数。 但它可能不会对你有任何好处,因为:
Java无论如何都不接受DHE参数。 JbossWS(Jbossnetworking服务器,后来的Wildfly)是Tomcat的一个分支,通常使用SSL / TLS(JSSE)的Java实现。 通过Java 7,JSSE使用自己的768位DHE参数,这是不可接受的弱。 (除了JSSE服从DH-512的RFC要求的EXPORT套件之外,这个套件已经完全破坏了,但EXPORT套件在devise上完全被破坏了,并且在Java 7中默认禁用了。)Java 8 JSSE允许您控制DHE参数的大小 ,但不是实际的值。
在Java 8中使用Java 8. JSSE,但不是早期版本,将DHE默认为1024位,即使weakdh.org不支持,大多数权威认为足够强大,并允许指定更多,请参阅https://docs.oracle.com /javase/8/docs/technotes/guides/security/jsse/JSSERefGuide.html#customizing_dh_keys和后台https://stackoverflow.com/questions/30352105/how-to-set-custom-dh-group-in-java – 发动机防止对撞攻击 。 请注意,如果您在Java 8之前有任何Java 客户端 ,那么如果服务器使用超过1024位的DHE,它们将会失败 。 我不知道有其他客户有这个问题,但在做这个改变之前testing你的。
启用ECDHE。 JSSE在Java 7和更高版本中实现了ECDHE,它不像DHE那样受到预先计算(通常情况下)使用P-256,这足够强大。 (尽pipe有些人不信任任何 NIST ECC曲线,因为NIST一般受到NSA的影响,尽pipe没有我知道的开源在ECC曲线上有特别的问题。)Java 6实际上有ECDHE的JSSE部分但是只有当JVM有一个用于ECC原语的encryption“提供者”时,它才被启用,而Java 6没有。 来自http://www.bouncycastle.org/的 bcprov – * – jdk15on是一系列Javaencryption原语(包括ECC)的JCE提供程序,因此如果将jar添加到JRE/lib/ext并添加org.bouncycastle.jce.provider.BouncyCastleProvider到JRE/lib/security/java.security的列表(或者在代码的某个地方做一个合适的Security.add/insertProvider() )Java 6可以执行ECDHE。 当然,你是否应该继续使用Java 6还是一个问题。
几年前,在浏览器和其他客户端支持ECDHE是可以的,但是今天AFAIK所有最新的浏览器都支持它,并且更喜欢 DHE–也就是说,浏览器hello在DHE套件之前列出了ECDHE套件如果服务器同时执行它应该selectECDHE。 非浏览器客户端可能不是; testing是肯定的。
禁用DHE。 您可以configuration“连接器”属性中的密码列表以排除DHE密码; 同时排除无用的staticDH和staticECDH,以及(单个)DES和(全部)“EXPORT”(如果存在)(Java 6)。 这意味着不做ECHDE的浏览器和客户端将被卡住在简单的RSA中,并且没有前向保密性,但是至less它们具有“当前”的保密性。 我不记得确实,但我认为5.1 Connectorconfiguration仍然是一些像$server/deploy/jbossweb/server.xml 。
尝试本机。 正如我所说的,JbossWS从Tomcat开始,可以select使用“native”又名“APR”(实际上是OpenSSL而不是JSSE)来实现HTTPS(SSL / TLS)。 在使用JbossWS这个选项方面,我获得了不同的成功,并且不记得5.1。 如果你的JbossWS有一个可行的TC本地选项,并且它可以处理configurationDH参数,那么使用openssl生成DH参数和JbossWS本地指令来configuration它们。
我一直在经历同样的问题,但来自Glassfish。
首先,我build议(如果可以的话)在JBoss服务器前放置某种反向代理,因为它将删除密码/证书安全性与您正在运行的Java版本之间的链接。
要获得比768位更大的Ephemeral DH密钥长度,您需要在Java 8上运行jdk.tls.ephemeralDHKeySize是新的默认值,并且您可以使用jdk.tls.ephemeralDHKeySize (详细信息: 自定义DH密钥 )来达到2048。 从我所能find的,没有在Java中分别重新生成关键参数的概念。
实际上,您可以使用最新的Java 8版本指定自定义DHE参数。 这是应用程序的独立性(只要它使用JSSE TLS实现)。
您首先需要指定要使用的DHE密钥的大小( -Djdk.tls.ephemeralDHKeySize=1024或-Djdk.tls.ephemeralDHKeySize=2048 )。 在服务器上,这将使用DHE的预定义发生器/主要组合。 对于Java 8,只能使用1024或2048, JDK 9将支持更大的尺寸 。
如果要提供不同的组合,可以使用jdk.tls.server.defaultDHEParameters安全属性(自8u51起)在jre / lib / security / jdk.tls.server.defaultDHEParameters指定它们。 它需要一个参数列表(每个使用的密钥大小一个),它必须包含素数和发生器(通常为2或5)hex。
如果你使用openssl dhparam -out dhparam2048.pem 2048生成一个新对,你可以使用openssl dhparam -noout -text -check -in dhparam2048.pem以文本模式读取和打印该文件。 您必须将文本复制并粘贴到Java安全属性中(使用tr -d ':'删除:在opensslhex表示之间)
这是一个样本(仅限1024 bis):
>openssl dhparam -in p -check -text -noout | tr -d ':' PKCS#3 DH Parameters: (1024 bit) prime: 00f7a63b59edcc43a43df12077f0e9 14129c20a73cef95f919896e608ebc 8722776c948765bbbf61542e118329 6c6ea74ecbded3a93aff77a062aba4 fcf04fc01030e65077f5a802605058 65b836368dd5ea389d77691fac0f2c f7a161c51c8e97ddecb3cf7f872b0c cfaf54373d5203edcabc575e871bb1 107ec2f30c78ebf403 generator: 2 (0x2) DH parameters appear to be ok.
这导致了
jdk.tls.server.defaultDHEParameters= \ { \ 00f7a63b59edcc43a43df12077f0e9 \ 14129c20a73cef95f919896e608ebc \ 8722776c948765bbbf61542e118329 \ 6c6ea74ecbded3a93aff77a062aba4 \ fcf04fc01030e65077f5a802605058 \ 65b836368dd5ea389d77691fac0f2c \ f7a161c51c8e97ddecb3cf7f872b0c \ cfaf54373d5203edcabc575e871bb1 \ 107ec2f30c78ebf403, 2 }
您应该重新启动服务器,并确认它实际上使用了这个素数(而不是默认的),因为这个过程并不是直接的,所以很多可能会出错。 Default 在源代码中定义,对于2048位,主要来自TLS FFDHE草案。
例如,在运行openssl s_client时,连接到Java 8 JSSE Server时,可以看到1024位素数( ffffff ffffffffffc90f … 5381ffffffffffffffff ):
>openssl s_client -msg -cipher DHE-RSA-AES128-SHA256 -connect localhost:1234 ... <<< TLS 1.2 Handshake [length 018f], ServerKeyExchange 0c 00 01 8b 00 80 ff ff ff ff ff ff ff ff c9 0f da a2 21 68 c2 34 c4 c6 62 8b 80 dc 1c d1 29 02 4e 08 8a 67 cc 74 02 0b be a6 3b 13 9b 22 51 4a 08 79 8e 34 04 dd ef 95 19 b3 cd 3a 43 1b 30 2b 0a 6d f2 5f 14 37 4f e1 35 6d 6d 51 c2 45 e4 85 b5 76 62 5e 7e c6 f4 4c 42 e9 a6 37 ed 6b 0b ff 5c b6 f4 06 b7 ed ee 38 6b fb 5a 89 9f a5 ae 9f 24 11 7c 4b 1f e6 49 28 66 51 ec e6 53 81 ff ff ff ff ff ff ff ff 00 01 02 ...
而不是这个,你必须在安装时看到你的自定义参数。
Java 7(768位)的默认参数将是“e9e642 … 7a3daf” ,具有在ParameterCache中定义的长生成器“30470ad..529252”。