gpt4 book ai didi

android - 发送 GET HTTPS 请求但得到 403 forbidden 响应,为什么?

转载 作者:行者123 更新时间:2023-11-29 14:42:36 25 4
gpt4 key购买 nike

下面是握手完成后我发给WS的URL

    "https://ekp.truefriend.com/COVIWeb/gate/AutoAuthentication.aspx?UserID=DP0001&BackUrl=http%3a%2f%2fgw.truefriendtest.com%2fCOVIWeb%2fApproval%2fForms%2fForm.aspx%3fmobileyn%3dY%26piid%3d96482621-6cc4-401c-a6f9-5ba6cb7ce26f%26wiid%3d425a9bc9-8607-4898-9158-ed9170da1d89%26fmpf%3dWF_A_DRAFT_PAPER01%26fmrv%3d0%26fiid%3d749526BE-B208-4987-B751-2DD0FC03F0F6%26fmid%3d24f6765d-69d1-429f-b0da-b540a064f0e2%26scid%3ddc4378f1-7edd-4d69-8fe4-5867ed32c8b9"

它应该做的是将浏览器重定向到 url 中给定的 BackUrl 页面。尽管存在证书问题,它在 IE8 中显示正确的结果。在 PC 版的 Chrome 中,它显示了一些 HTML 代码。在 Android 中,我收到 403 Forbidden 错误。

HTTP/1.1 403 Forbidden ( The server denied the specified Uniform Resource Locator (URL). Contact the server administrator.  )

我用这个方法来流式传输数据

try{
URL url = new URL(urlString);
HttpsURLConnection.setDefaultHostnameVerifier(new FakeHostVerifier());

TrustManager[] trustAllCerts = new TrustManager[]{
new X509TrustManager() {
public java.security.cert.X509Certificate[] getAcceptedIssuers() {
Log.d("SSLDemo", "getAcceptedIssuers");
return null;
}
public void checkClientTrusted(
java.security.cert.X509Certificate[] certs, String authType) {
Log.d("SSLDemo", "Check Client Trusted");
}
public void checkServerTrusted(
java.security.cert.X509Certificate[] certs, String authType) {
Log.d("SSLDemo", "Check Server Trusted");
}
}
};


SSLContext sc = SSLContext.getInstance("TLS"); //"TLS"
sc.init(null, trustAllCerts, new java.security.SecureRandom());
HttpsURLConnection.setDefaultSSLSocketFactory(sc.getSocketFactory());
int port = 443;
SSLSocketFactory factory = HttpsURLConnection.getDefaultSSLSocketFactory();
socket = (SSLSocket)factory.createSocket(url.getHost(), port);
socket.startHandshake();


/**
* Connection Method
*/
String method = "GET";

String os = method + " "+urlString+" HTTP/1.0\r\n";
os += "Content-Length: 0";
os += "\r\n\r\n";

((SSLWeb)this.caller).updateRequest(urlString, method);

Log.i("TESTWEB", os);
BufferedWriter wout = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));
wout.write(os);
wout.flush();
wout.close();
rd = new BufferedReader(new InputStreamReader(socket.getInputStream()));

//********* Not using thread
StringBuffer buff = new StringBuffer();

char[] buffer = new char[1024];

while(rd.read(buffer) > -1) {

buff.append(buffer);
Log.i("TESTWEB", "read buffer :" + String.valueOf(buffer));

}
Log.i("TESTWEB", "read line :" + buff.toString());

//**********

}catch(Exception e){
Log.e("TESTWEB", "Connecting error", e);
e.printStackTrace();
}

我的代码有问题吗?我认为问题出在 URL 参数上,但它在浏览器中有效:(

过去三天我一直在寻找解决该问题的方法,但到目前为止运气不佳。

编辑:这是用于跳过证书验证过程的 FakeHostVerifier 类。这不对吗?

 public class FakeHostVerifier implements HostnameVerifier {
@Override
public boolean verify(String hostname, SSLSession session) {
return true;
}

}

最佳答案

正如我在对另一个答案的评论中所说,这与是否信任服务器证书无关。如果您收到 HTTP 响应,即使是 403,也意味着 HTTP 连接已建立,这也意味着底层 SSL/TLS 连接已建立。如果您的客户端不信任服务器证书,SSL/TLS 连接将在任何 HTTP 流量发生之前关闭。

我会尝试一些事情:

  • 删除 Content-Length header 。这是一个 GET 请求,因此它没有实体。暗示长度为 0 的实体可能会使服务器感到困惑。
  • 尝试设置一个 User-Agent header 来模拟来自浏览器的请求。
  • 更一般地说,查看工作正常的浏览器发送的 header 并尝试重现它们。 (也可以尝试 Accept header ,这可能是您使用 Chrome 时出现问题的原因。)

编辑:(其他潜在问题,更有可能是原因)

如果您的 urlstring 变量确实包含“https://ekp.truefriend.com/COVIWeb/gate/...”,这就是问题所在。

当您发送 HTTP GET 时,请求应该是这样的:

GET /COVIWeb/gate/... HTTP/1.1
Host: ekp.truefriend.com

不是:

GET https://ekp.truefriend.com/COVIWeb/gate/... HTTP/1.1

(这仅适用于通过代理的请求,无论如何不适用于 HTTPS 请求。)

如果您使用的是 HTTP 1.0,则不会使用 Host header ,但这并不重要(除非该主机服务于多个虚拟主机,它可以做到,甚至超过HTTPS)。如果可以,请考虑使用 HTTP/1.1,尽管您可能必须处理关闭连接(可能是内容长度或分块编码)。

关于android - 发送 GET HTTPS 请求但得到 403 forbidden 响应,为什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3725396/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com