【问题标题】:Secure communication between android application and ASP.net apiandroid 应用程序和 ASP.net api 之间的安全通信
【发布时间】:2013-01-21 09:29:55
【问题描述】:

我的 Android 应用程序应该与一个用 C#.Net 编写的 ASP.net web api 进行通信。从手机发送的数据包含不应向公众公开的数据。所以我正在尝试使用https 协议。在我的服务器端,我要求所有请求都是HTTPS,如下所示:

RequireRegisteredImei

public class RequireRegisteredImeiAttribute : AuthorizationFilterAttribute
    {
        public override void OnAuthorization(HttpActionContext actionContext)
        {
            var request = actionContext.ControllerContext.Request;

            if (request.RequestUri.Scheme == Uri.UriSchemeHttps)
            {
               //OKAY
            }
            else 
            {
             actionContext.Response = new HttpResponseMessage(HttpStatusCode.Forbidden);
            }
        }
     }

在控制器中

[RequireRegisteredImei]
public string Post()
{
}

我通过从我的手机发送一个简单的http request 来调试这段代码,这段代码运行良好,它会拒绝我。

所以,我开始研究如何从我的安卓手机通过https 发送请求。我想出了这样的事情:

public static DefaultHttpClient getSecureHttpClient() {
        SchemeRegistry schemeRegistry = new SchemeRegistry();
        schemeRegistry.register(new Scheme("https", SSLSocketFactory.getSocketFactory(), 443));
        schemeRegistry.register(new Scheme("http", SSLSocketFactory.getSocketFactory(), 80));
        BasicHttpParams params = new BasicHttpParams();
        SingleClientConnManager mgr = new SingleClientConnManager(params, schemeRegistry);
        return new DefaultHttpClient(mgr, params);
    }

我就是这样使用这个方法的:

HttpClient httpClient = CustomHttpClient.getSecureHttpClient();

这只会导致IOException: No peer certificate

我已经阅读了几个关于此的主题:

Problems with https (No peer certificate) in android

Android SSL - No Peer Certificate

'No peer certificate' error in Android 2.3 but NOT in 4

但是必须有一种更简单的方法来通过HTTPS 从android 发布数据?

【问题讨论】:

  • 从 MVC 的角度来看,已经有一个 RequireHttpsAttribute 强制任何 HTTP 调用到 HTTPS
  • @James 所以你的意思是,如果我在这个 url http://whatever-webservice/api/Login 上发帖,它会自动强制连接为 HTTPS?
  • 是的。本质上,它的作用是强制安全地重新发送请求(因此会自动拒绝任何非安全请求)。不确定您是否明确希望您的 API 在发送非安全请求时返回 403。但是,这意味着您的客户端处理该响应的工作量会减少。

标签: c# android web-services https


【解决方案1】:

如果您有自定义证书或由 CA 颁发的证书,但并非所有 Android 版本都包含,您可以将证书包含在您的应用中并直接使用。

为此,您必须将您的服务器证书(当然没有密钥)导入 BKS 密钥库,然后可以将其用作自定义信任库。

Using a Custom Certificate Trust Store on Android 是一个很好的教程,它描述了如何做到这一点。

与您在 Stackoverflow 中发现的 EasyTrustManager 或 DummyTrustManager 等标准解决方案不同,此解决方案不会禁用 SSL 的身份验证,因此不会像其他解决方案那样不安全。

【讨论】:

  • 感谢您的回答。我已经看到有关此主题的所有示例都包括证书。我应该如何在服务器端匹配这个证书?直接安装,还是?
  • 如果它是自定义或不受信任的证书,最好的方法是将证书包含在您的应用中(以自定义信任存储的形式)。
【解决方案2】:

您还可以将HttpClient 配置为接受所有这样的证书:

    SSLSocketFactory sslSocketFactory=SSLSocketFactory.getSocketFactory();
    HostnameVerifier hostnameVerifier=org.apache.http.conn.ssl.SSLSocketFactory.ALLOW_ALL_HOSTNAME_VERIFIER;
    sslSocketFactory.setHostnameVerifier((X509HostnameVerifier) hostnameVerifier);

    SchemeRegistry schemeRegistry = new SchemeRegistry();
    schemeRegistry.register(
            new Scheme("http", PlainSocketFactory.getSocketFactory(), 80));
    schemeRegistry.register(
            new Scheme("https", sslSocketFactory, 443));

如果您认为这可能是您的解决方案。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-04-22
    • 2018-10-03
    • 1970-01-01
    • 2010-12-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-06-20
    相关资源
    最近更新 更多