如何从Java应用程序建立Https连接

6

我正在使用Java创建一个桌面应用程序,该应用程序使用API。为了保护与API的通信安全,他们的支持告诉我要使用HTTPS。请指导我如何从Java客户端设置https连接。

API有这个功能,可以选择一个安全连接:

private String getUrlAddress(XmlRequest request) {
    // determine if this is a secure connection
    String url = this.ssl ? "https://" : "http://";

    // determine service endpoint based on type of class/request passed in
    if( request.getClass() == MessageRequest.class) {
        url += ClockWorkSmsService.SMS_URL;
    }
    else {
        url += ClockWorkSmsService.CREDIT_URL;
    }

    return url;
}

这段代码让我知道"request"会成为我当前的URL或服务器,因此是我自己设置HTTPS连接。
Clockworksms API Wrapper:
import com.clockworksms.*;

public class DemoSms
{
   public static void main(String[] args)
   {
      try
      {
         ClockWorkSmsService clockWorkSmsService = new ClockWorkSmsService("apikey");
         SMS sms = new SMS("441234567890", "Hello World");         
         ClockworkSmsResult result = clockWorkSmsService.send(sms);

         if(result.isSuccess())
         {
            System.out.println("Sent with ID: " + result.getId());
         }
         else
         {
            System.out.println("Error: " + result.getErrorMessage());
         }
      }
      catch (ClockworkException e)
      {
         e.printStackTrace();
      }
   }
}

你可以从这里获取一些想法 [https://dev59.com/E1PTa4cB1Zd3GeqPjn2J],同时也可以查看[http://www.javaworld.com/article/2077600/learn-java/java-tip-96--use-https-in-your-java-client-code.html]。 - Vishal
你需要向一个安全的 HTTPS API 发送请求,对吗? - John Eipe
@John 是的,我希望两者之间有一个安全连接,并且有人告诉我使用https可以实现这一点。 - magicianiam
在这种情况下,您无需托管https服务器,您的Java客户端将发出https连接请求。 - John Eipe
@Vishal,谢谢你的回复,我会仔细研究一下 :) - magicianiam
@John 是的,我也是这么想的,但是我该如何设置它,以及如何建立客户端连接?谢谢 :) - magicianiam
2个回答

2
如果这是一个安全的REST API,请参考此处。 如果只需要访问HTTP资源,请查看Apache HTTPClient库及其教程。 有很多资源可供使用,请先尝试,然后再提出具体问题。

我阅读了链接,但实话说我并没有完全理解它。从我的理解来看,它是在建立一个HTTPS连接,那么它如何连接到我的API或者我如何将其连接到我的API呢?API会自动知道连接已经是安全的吗?谢谢。 - magicianiam
1
这个API是基于REST的吗? - John Eipe
1
我建议您选择一个REST客户端库并探索其功能。这个使用Grizzly作为客户端和服务器:https://dev59.com/qXI-5IYBdhLWcg3woJ5I - John Eipe
在我的情况下,我不需要设置任何服务器端的东西,对吗?只需要专注于客户端的 SSL? - magicianiam
那么我需要访问证书才能与他们的API建立HTTPS连接?我阅读了您给我的一些链接,它们确实让我对如何建立HTTPS连接有了一些见解,只是有些链接没有提到证书,并且没有涉及API,大多数只是访问安全链接。再次感谢您花时间帮助我。 - magicianiam
显示剩余4条评论

0

实际上,我们需要覆盖现有的默认行为并添加允许所有作为受信任服务器的内容。以下代码片段将对您有所帮助:

    /* START of the fix*/
    TrustManager[] trustAllCerts = new TrustManager[] { new X509TrustManager() {
        public java.security.cert.X509Certificate[] getAcceptedIssuers() { return null; }
        public void checkClientTrusted(X509Certificate[] certs, String authType) { }
        public void checkServerTrusted(X509Certificate[] certs, String authType) { }

    } };

    SSLContext sc = SSLContext.getInstance("SSL");
    sc.init(null, trustAllCerts, new java.security.SecureRandom());
    HttpsURLConnection.setDefaultSSLSocketFactory(sc.getSocketFactory());

    // Create all-trusting host name verifier
    HostnameVerifier allHostsValid = new HostnameVerifier() {
        public boolean verify(String hostname, SSLSession session) { return true; }
    };
    // Install the all-trusting host verifier
    HttpsURLConnection.setDefaultHostnameVerifier(allHostsValid);
    /* End of the fix*/

从安全角度来看,这不是一个修复,而是一个后门。但如果你被正式要求这样做...无论如何感谢您提供的代码片段。 - foo

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接