2

我的 Android 应用程序应该与用C#.Net. 从手机发送的数据包含不应向公众公开的数据。所以我正在尝试使用该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

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

android中的https(无对等证书)问题

Android SSL - 无对等证书

Android 2.3 中的“无对等证书”错误,但 4 中没有

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

4

2 回答 2

1

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

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

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

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

于 2013-01-21T09:59:25.057 回答
1

您还可以将 配置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));

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

于 2013-01-21T10:49:11.180 回答