java - 客户端休息 SSL java : javax.net.ssl.SSLHandshakeException

标签 java rest ssl client

我正在 java 客户端中休息,其中服务器是一个给我 URL + key 的应用程序。例子: https://api.ost.pt/agencies/?key=vkey 这足以返回 json 中的响应。有一个用 php 制作的客户端,一切都很好,除了我正在转向 java,而且由于 SSL,我在使用 java 时遇到了一些困难。有人已经拥有使用 SSL 的 Java 客户端了吗?我不明白你要做什么样的认证......

Tnha 下面的代码:

String httpsURL = "https://api.ost.pt/agencies/?key=vkey";
URL myurl = new URL(httpsURL);
HttpsURLConnection con = (HttpsURLConnection)myurl.openConnection();
InputStream ins = con.getInputStream();
InputStreamReader isr = new InputStreamReader(ins);
BufferedReader in = new BufferedReader(isr);
String inputLine;
while ((inputLine = in.readLine()) != null)
{
  System.out.println(inputLine);
}

in.close();

结果:

Exception in thread "main" javax.net.ssl.SSLHandshakeException: Received fatal alert: handshake_failure

我做了一些简单的事情,但我认为它有效,因为在 php 中不再是任何自动的。他们可以帮助我用 Java 实现 REST 客户端吗?

谢谢收听

最佳答案

是因为java不支持服务器的密码套件。 您可以从 https://www.ssllabs.com 验证服务器上可用的密码套件是什么.以下是示例输出。

enter image description here

在上图中,您可以看到服务器上可用的密码套件有哪些。 以下代码显示了您的 JVM 可用的密码套件。

SSLServerSocketFactory factory = (SSLServerSocketFactory) SSLServerSocketFactory.getDefault();
String cSuites[] = factory.getSupportedCipherSuites();
for(String s : cSuites){
     System.out.println(s);
}

要解决您的问题,您可以做的是下载并安装 Java Cryptography Extension。对于jdk 1.8,可以下载JCE here . 要安装 JCE,只需将 local_policy.jarUS_export_policy.jar 放入 $YOUR_JDK_HOME/jre/lib/security$YOUR_JAVA_HOME/jre8/lib/security 目录。

现在在您的程序中,在建立连接之前,您可以为服务器上的一个或多个可用密码套件设置 https.cipherSuites 属性。您可以使用 https.cipherSuites 属性来指定启用哪些密码套件以与您的 HttpsURLConnection 一起使用。但是,设置此属性不是强制性的。

System.setProperty("https.cipherSuites", "TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384,TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384,TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA");

String httpsURL = "https://api.ost.pt/agencies/?key=vkey";
URL myurl = new URL(httpsURL);
HttpsURLConnection con = (HttpsURLConnection)myurl.openConnection();
InputStream ins = con.getInputStream();
InputStreamReader isr = new InputStreamReader(ins);
BufferedReader in = new BufferedReader(isr);
String inputLine;
while ((inputLine = in.readLine()) != null)
{
     System.out.println(inputLine);
}

in.close();

注意:除了那些以 TLS_DHE_XXX 开头的密码套件。由于 this known bug,它们不起作用。 .

之后您就可以与服务器建立连接了。但是,由于身份验证失败,它仍然返回错误代码 401。为此,您需要提供适当的身份验证详细信息。

关于java - 客户端休息 SSL java : javax.net.ssl.SSLHandshakeException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32023982/

相关文章:

java - 在 Linux 上无需指定数据库名称即可通过 JDBC 连接到 MonetDB

java - 通过专用网络访问服务器

java - React + Spring Boot上传文件和表单数据

android - 如何处理一个巨大的 JSON 数组?

ubuntu - 浏览器错误 ssl_error_rx_record_too_long (Firefox) 和 ERR_SSL_PROTOCOL_ERROR (Chrome)

ssl - 将证书转换为 X.509

java - SeekBar 设置 Max 和设置 Progress 的空指针异常

java - 如何在AWT中查找按钮源(计算器作业)

javascript - 使用 Microsoft Graph 和 OneDrive JS SDK 获取共享 OneDrive 文档

.htaccess - https 上的非 www 到 www