android - 如何在 Android 上使用基于 SSL 的基本身份验证连接到 Http 服务器?

标签 android ssl basic-authentication

我知道以前有人问过这个问题,但我找到的答案都没有帮助我。我正在尝试使用 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();
        }

最佳答案

两个常见问题可能导致此问题:

  1. 您不应该自己进行 BASIC 身份验证。 Apache HttpClient 已经包含了执行 BASIC 身份验证的所有功能。看看Basic AuthenticationPreemptive BASIC authentication

  2. 您的 Android 设备是否信任来自服务器的证书?当您的浏览器信任该证书时,并不意味着您的设备也信任它。 Android 的受信任证书颁发机构列表非常有限。当您在 Android 内置浏览器上访问该网站时,您可以从您的设备上进行检查。如果没有出现警告消息,则一切正常。有关信任来自 Android 设备的其他证书的更多信息,您可以查看我的 blog article .

享受

关于android - 如何在 Android 上使用基于 SSL 的基本身份验证连接到 Http 服务器?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5485638/

相关文章:

Android 资源——哪些分辨率应该进入 hdpi、ldpi、mdpi 和 xhdpi 目录

android - 使用谷歌地图 v2 发布 key 发布应用程序,如何制作 apk 文件?

android - 如何使用 "Share image using"共享 Intent 在 android 中共享图像?

python - 无法在 CentOS 6.10 上编译 Python(OpenSSL 错误)

ruby-on-rails - 当我在非 SSL 上运行应用程序时, session 过期停止工作

testing - 在 Firefox 中通过 URL 的 HTTP 基本身份验证不起作用?

spring - 不同端点的多个用户详细信息服务

android - support.v7.widgets 和 android.widgets 的区别 Toolbar, Fragment

ssl - Web 服务器是否需要验证浏览器客户端证书?

通过代理进行基本身份验证的 Python HTTPS 客户端