Java HTTPS (SSL) 连接返回 400 状态,其中 CURL/ARC 适用于相同的 URL

标签 java ssl oauth salesforce httpclient

我正在尝试通过 OAuth 连接到 salesforce 生产帐户,并通过提供刷新 token 来交换访问 token 。

当我使用 Chrome Advanced Rest Client 或 CURL 调用电话时,我能够获得访问 token ;但是当我尝试使用 java HttpClient 或 URLConnection 进行相同的调用时,我得到了 400 状态。

    String url = "https://login.salesforce.com/services/oauth2/token";
    String requestBody = "grant_type=refresh_token&client_id=myClientId&client_secret=myClientSecret&refresh_token=myRefreshToken";

    URL obj = new URL(url);
    HttpsURLConnection con = (HttpsURLConnection) obj.openConnection();

    //add reuqest header
    con.setRequestMethod("POST");
    con.setRequestProperty("User-Agent", "myapp/1.0");
    con.setRequestProperty("Accept-Language", "en-US,en;q=0.5");

    // Send post request
    con.setDoOutput(true);
    DataOutputStream wr = new DataOutputStream(con.getOutputStream());
    wr.writeBytes(requestBody);
    wr.flush();
    wr.close();

    int responseCode = con.getResponseCode();
    System.out.println("\nSending 'POST' request to URL : " + url);
    System.out.println("Post parameters : " + requestBody);
    System.out.println("Response Code : " + responseCode);

    BufferedReader br = new BufferedReader(
            new InputStreamReader(con.getInputStream()));
    String inputLine;
    StringBuffer response = new StringBuffer();

    while ((inputLine = br.readLine()) != null) {
        response.append(inputLine);
    }
    br.close();

    //print result
    System.out.println(response.toString());

我使用 wireshark 检查了这两个请求。这两个请求看起来完全相同。由于 URL 是 https,我将请求发布到一个虚拟 URL 并使用 wireshark 进行了验证。

有人遇到过这种问题吗?顺便说一句,相同的代码适用于开发版,不适用于生产版。对于生产版,它适用于 CURL 和 Chrome ARC。

最佳答案

Salesforce 仅允许 TLS 1.1 或更高版本的 HTTPS 连接。由于我在 Java 7 上运行,默认为 TLS 1.0。结果,来自 Java 的请求失败。

通过添加以下属性,我们可以添加对 TLSv1.1 和 TLSv1.2 的支持

-Dhttps.protocols=TLSv1.1,TLSv1.2

关于Java HTTPS (SSL) 连接返回 400 状态,其中 CURL/ARC 适用于相同的 URL,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41197575/

相关文章:

java - netscape.javascript.JSException : SyntaxError: Unexpected keyword 'this' . 预计 ')' 结束参数列表

java - 两个数字的基本加法

java - android apk 中的错误 xml

ssl - MS-organization-access 在窗口 10 上要求提供凭据。它说确认证书以访问网站

azure - 如何使用流量管理器后面的多个应用服务与自定义域设置 SSL?

iphone - Tumblr OAuth 图片帖子给我 401/"Invalid OAuth credentials"

javascript - 保护我的私有(private) API

java - Guava: Iterables.frequency(Iterable<T>, Predicate<T>)

oauth - 发布自定义对象返回发生未知错误 OAuthException 代码 1

ruby-on-rails - 尽管 nginx 处理重定向,我是否应该启用 Rails force_ssl?