我知道以前有人问过这个问题,但我找到的答案都没有帮助我。我正在尝试使用 Basic Http Auth 通过 SSL 连接到一个简单的登录服务。该服务托管在 https://localhost:8443/login .当我从浏览器(在 Windows、OSX 和 Android 上)访问该服务时,它工作正常,我输入了我的用户名和密码,并且我得到了正确的身份验证。但是,当我尝试通过我的 Xoom 上的代码执行此操作时,我收到一个 ClientProtocolException,提示“服务器无法使用有效的 HTTP 响应进行响应”。谁能给我一个正确方向的插入力?这是我的代码
String result = null;
HttpParams params = new BasicHttpParams();
HttpProtocolParams.setVersion(params, HttpVersion.HTTP_1_1);
HttpProtocolParams.setContentCharset(params, HTTP.DEFAULT_CONTENT_CHARSET);
HttpProtocolParams.setUseExpectContinue(params, true);
SchemeRegistry schReg = new SchemeRegistry();
schReg.register(new Scheme("http", PlainSocketFactory.getSocketFactory(), 80));
schReg.register(new Scheme("https", SSLSocketFactory.getSocketFactory(), 443));
ClientConnectionManager conMgr = new ThreadSafeClientConnManager(params, schReg);
DefaultHttpClient client = new DefaultHttpClient(conMgr, params);
HttpGet get = new HttpGet(preferences.getString(getString(R.string.Security_Login_URL),
"https://localhost:80/login"));
String credentials = Base64.encodeToString((username + ":" + password).getBytes(), Base64.URL_SAFE);
if(credentials!=null){
get.addHeader("Authorization","Basic "+credentials);
ResponseHandler responseHandler=new BasicResponseHandler();
try {
result = client.execute(get, responseHandler);
} catch (ClientProtocolException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
最佳答案
两个常见问题可能导致此问题:
您不应该自己进行 BASIC 身份验证。 Apache HttpClient 已经包含了执行 BASIC 身份验证的所有功能。看看Basic Authentication或 Preemptive BASIC authentication
您的 Android 设备是否信任来自服务器的证书?当您的浏览器信任该证书时,并不意味着您的设备也信任它。 Android 的受信任证书颁发机构列表非常有限。当您在 Android 内置浏览器上访问该网站时,您可以从您的设备上进行检查。如果没有出现警告消息,则一切正常。有关信任来自 Android 设备的其他证书的更多信息,您可以查看我的 blog article .
享受
关于android - 如何在 Android 上使用基于 SSL 的基本身份验证连接到 Http 服务器?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5485638/