我正在 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 验证服务器上可用的密码套件是什么.以下是示例输出。
在上图中,您可以看到服务器上可用的密码套件有哪些。 以下代码显示了您的 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.jar
和 US_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/