是否可以在 .jnlp 文件中打开 TLS 1.2 来从仅设置了 TLS 1.2 的 HTTPS 服务器下载 .jar?我尝试了很多方法:
<resources>
<j2se (...) />
<jar (...) />
<property name="deployment.security.TLSv1.2" value="true" />
<property name="jnlp.deployment.security.TLSv1.2" value="true" />
<property name="java.deployment.security.TLSv1.2" value="true" />
<property name="https.protocols" value="TLSv1.2" />
<property name="jnlp.https.protocols" value="TLSv1.2" />
<property name="javaws.https.protocols" value="TLSv1.2" />
</property>
</resources>
但它们都不起作用-在启动 jnlp(下载 .jar)期间我收到异常:
javax.net.ssl.SSLHandshakeException: Received fatal alert: handshake_failure
at sun.security.ssl.Alerts.getSSLException(Alerts.java:192)
at sun.security.ssl.Alerts.getSSLException(Alerts.java:154)
at sun.security.ssl.SSLSocketImpl.recvAlert(SSLSocketImpl.java:1959)
at sun.security.ssl.SSLSocketImpl.readRecord(SSLSocketImpl.java:1077)
at sun.security.ssl.SSLSocketImpl.performInitialHandshake(SSLSocketImpl.java:1312)
at sun.security.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java:1339)
at sun.security.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java:1323)
at sun.net.www.protocol.https.HttpsClient.afterConnect(HttpsClient.java:563)
at sun.net.www.protocol.https.AbstractDelegateHttpsURLConnection.connect(AbstractDelegateHttpsURLConnection.java
(...)
如果我在 Java 控制面板中设置“使用 TLS 1.2”,则一切正常 - 我可以下载 jar 并且我的应用程序可以成功启动。但我想在 jnlp 文件中启用 TLS 1.2,而不管 JCP 中的设置如何,因为我的许多客户仍在使用 Java 7,我想在他们不采取任何措施的情况下完成此操作。
更新:
当我通过命令启动 jnlp 时,这里是“控制台”选项卡的一个片段(结尾):
javaws -J-Djavax.net.debug=all FILE.jnlp:
Java Web Start 10.51.2.13
Using JRE version 1.7.0_51-b13 Java HotSpot(TM) 64-Bit Server VM
User home directory =
(...)
[Raw read]: length = 5
0000: 15 03 03 00 02 .....
[Raw read]: length = 2
0000: 02 28 .(
Thread-8, READ: TLSv1.2 Alert, length = 2
Thread-8, RECV TLSv1 ALERT: fatal, handshake_failure
Thread-8, called closeSocket()
[Raw read]: length = 5
Thread-8, handling exception: javax.net.ssl.SSLHandshakeException: Received fatal alert: handshake_failure
0000: 15 03 03 00 02 .....
[Raw read]: length = 2
0000: 02 28 .(
Thread-7, READ: TLSv1.2 Alert, length = 2
Thread-7, RECV TLSv1 ALERT: fatal, handshake_failure
Thread-7, called closeSocket()
Thread-7, handling exception: javax.net.ssl.SSLHandshakeException: Received fatal alert: handshake_failure
#### Java Web Start Error:
#### Unable to load resource: https://ADDRESS/FILE.jar
ADDRESS/FILE.jar 存在(正如我在主帖中所说) - 如果我打开“使用 TLS 1.2”,文件就可以下载。
答案1
不幸的是,我认为您只能使用 Java 控制面板解决方案。原因是客户端和服务器必须在 TLS 握手过程中建立相互兼容的密码套件。在这种情况下,您的本地 Java 运行时环境是“客户端”,其密码套件首选项由控制面板控制。JNLP 配置无法动态更改这一点,这是有充分理由的——想象一下相反的情况,其中客户端被迫接受安全性较低的密码。
例如,假设您的服务器支持 TLS 1.2 和 TLS 1.1(按优先顺序)。如果您的客户端仅支持 TLS 1.0 和 SSL v2,则没有双方都同意的密码套件,握手将失败。只有当您的客户端支持 TLS 1.1、TLS 1.2 或两者时,握手才会成功。请注意,顺序在客户端上并不重要,因为服务器希望使用客户端支持的最高安全级别。