【问题标题】:How to implement RESTful services over SSL?如何通过 SSL 实现 RESTful 服务?
【发布时间】:2013-10-09 20:45:58
【问题描述】:

当我在 Eclipse 中运行我的 RESTful 客户端时,出现以下错误:

java.net.ConnectException: Connection refused: connect
    at java.net.PlainSocketImpl.socketConnect(Native Method)
    at java.net.PlainSocketImpl.doConnect(Unknown Source)
    at java.net.PlainSocketImpl.connectToAddress(Unknown Source)
    at java.net.PlainSocketImpl.connect(Unknown Source)
    at java.net.SocksSocketImpl.connect(Unknown Source)
    at java.net.Socket.connect(Unknown Source)
    at com.sun.net.ssl.internal.ssl.SSLSocketImpl.connect(Unknown Source)
    at com.sun.net.ssl.internal.ssl.BaseSSLSocketImpl.connect(Unknown Source)
    at sun.net.NetworkClient.doConnect(Unknown Source)
    at sun.net.www.http.HttpClient.openServer(Unknown Source)
    at sun.net.www.http.HttpClient.openServer(Unknown Source)
    at sun.net.www.protocol.https.HttpsClient.<init>(Unknown Source)
    at sun.net.www.protocol.https.HttpsClient.New(Unknown Source)
    at sun.net.www.protocol.https.AbstractDelegateHttpsURLConnection.getNewHttpClient(Unknown Source)
    at sun.net.www.protocol.http.HttpURLConnection.plainConnect(Unknown Source)
    at sun.net.www.protocol.https.AbstractDelegateHttpsURLConnection.connect(Unknown Source)
    at sun.net.www.protocol.http.HttpURLConnection.getOutputStream(Unknown Source)
    at sun.net.www.protocol.https.HttpsURLConnectionImpl.getOutputStream(Unknown Source)
    at com.elkay.client.RestClient.main(RestClient.java:23)

在浏览器中调用时,不会阻止 URL。如何通过客户端使用?

TIA!

编辑:(客户端代码)

public class RestClient {

    public static void main(String[] args) {

          try {

            URL url = new URL("https://www.xyz.com");


            HttpURLConnection conn = (HttpURLConnection) url.openConnection();
            conn.setDoOutput(true);
            DataOutputStream printout = new DataOutputStream(conn.getOutputStream());  
            String authString=URLEncoder.encode("username=anushree&password=anushree","UTF-8");  
            printout.writeBytes (authString);  
            printout.flush ();   
            printout.close ();  

            conn.setRequestMethod("GET");
            conn.setRequestProperty("Accept", "application/json");

            if (conn.getResponseCode() != 200) {
                throw new RuntimeException("Failed : HTTP error code : "
                        + conn.getResponseCode());
            }

            BufferedReader br = new BufferedReader(new InputStreamReader(
                (conn.getInputStream())));

            String output;
            System.out.println("Output from Server .... \n");
            while ((output = br.readLine()) != null) {
                System.out.println(output);
            }

            conn.disconnect();

          } catch (MalformedURLException e) {

            e.printStackTrace();

          } catch (IOException e) {

            e.printStackTrace();

          }

        }


}

【问题讨论】:

  • 已编辑。请检查。我没有使用球衣或 CFX。就是这个简单的客户端。
  • 你为什么使用 HttpUrlConnection。您应该使用 HttpsUrlConnection。证书是否也添加到您的信任存储中?
  • 已尝试使用 HttpsUrlConnection。另外,您能否简要介绍一下如何创建受信任的存储,即 .jks 文件?因为我可以直接在浏览器中调用 URL,所以它不会因为使用 HTTPS 而被阻止。注意:xyz.com 不是确切的 URL,但同样如此。
  • 已将代码放入下一个答案。您可以从 IE 的 .cer 的 Mozilla 浏览器生成 .crt
  • 另外你在这两行中尝试什么?String authString=URLEncoder.encode("username=anushree&password=anushree","UTF-8"); printout.writeBytes(authString);

标签: ssl ssl-certificate restful-authentication restful-architecture


【解决方案1】:

也试试这样。 //在头部设置基本认证

 String userPassword = "password"; 
 String encoding = new sun.misc.BASE64Encoder().encode(userPassword.getBytes()); 
 conn.setRequestProperty("Authorization", "Basic " + encoding); 
 String parameters = "username=" + URLEncoder.encode("user1", "UTF-8") + "&password=" + URLEncoder.encode("user1password", "UTF-8"); 
 printout.writeBytes (parameters);  

【讨论】:

    猜你喜欢
    • 2016-11-09
    • 1970-01-01
    • 1970-01-01
    • 2014-05-25
    • 2012-07-16
    • 1970-01-01
    • 1970-01-01
    • 2011-06-04
    • 1970-01-01
    相关资源
    最近更新 更多