我的 Android 应用程序应该与用 C#.Net
编写的 ASP.net Web API 进行通信。从手机发送的数据包含不应向公众公开的数据。所以我尝试使用 https
协议(protocol)。在我的服务器端,我要求所有请求都是 HTTPS
,如下所示:
需要注册Imei
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);
}
}
}
在 Controller 中:
[RequireRegisteredImei]
public string Post()
{
}
我通过从手机发送一个简单的http请求
来调试这段代码,这段代码运行得很好,它会拒绝我。
因此,我开始研究如何从 Android 手机通过 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:没有对等证书
我已经阅读了几个与此相关的主题:
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
但是必须有一种更简单的方法来从 Android 通过 HTTPS
发布数据吗?
最佳答案
如果您有自定义证书或由 CA 颁发的证书(未包含在所有 Android 版本中),您可以将该证书包含到您的应用中并直接使用它。
为此,您必须将服务器证书(当然没有 key )导入到 BKS key 存储中,然后可以将其用作自定义信任存储。
Using a Custom Certificate Trust Store on Android 是一个非常好的教程,描述了如何执行此操作。 。
与您在 Stackoverflow 中发现的 EasyTrustManager 或 DummyTrustManager 等标准解决方案不同,该解决方案不会禁用 SSL 身份验证,因此不像其他解决方案那样不安全。
关于c# - Android 应用程序和 ASP.net api 之间的安全通信,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14435712/