【问题标题】:Receive & Validate certificate from server HTTPS - android从服务器 HTTPS 接收和验证证书 - android
【发布时间】:2011-04-18 08:46:22
【问题描述】:

我正在通过 https 从我的 android 客户端调用 Web 服务。我必须验证从服务器端接收的证书。我怎么做 ?目前,这是我用来调用 Web 服务的代码。

private static String SendPost(String url, ArrayList<NameValuePair> pairs) {   // url = "https://....."   
    errorMessage = "";   
    String response = "";   

    DefaultHttpClient hc=new DefaultHttpClient();      
    ResponseHandler <String> res=new BasicResponseHandler();      
    HttpPost postMethod=new HttpPost(url);   

    try {   
postMethod.setEntity(new UrlEncodedFormEntity(pairs));   
        response = hc.execute(postMethod, res);   
    } catch (UnsupportedEncodingException e) {   
        e.printStackTrace();   
    } catch (ClientProtocolException e) {   
        e.printStackTrace();   
    } catch (IOException e) {   
        e.printStackTrace();   
    }        

    return response;   
}  

如何验证在执行 Post 期间从服务器收到的自签名证书?我必须通过公钥/私钥进行测试。客户端将有一个 CA 文件。我只需要客户端使用 CA 验证服务器证书,服务是公共的。这与公钥/私钥有关。在调用帖子之前如何从服务器接收证书?

它们是 stackoverflow 上提供的几个选项和代码 sn-ps。我发现有多个答案的几个链接是: Accepting a certificate for HTTPs on Android HTTPS GET (SSL) with Android and self-signed server certificate

但我不知道哪个对我好/适用!我不想禁用所有或接受任何。必须检查公钥/私钥/

非常感谢任何帮助。

【问题讨论】:

    标签: android web-services ssl certificate


    【解决方案1】:

    Bob Lee 写了一篇关于如何在 Android 中使用 SSL 证书的精彩博文。我认为它适用于您的情况:http://blog.crazybob.org/2010/02/android-trusting-ssl-certificates.html

    您只需创建一个包含您的自签名证书的KeyStore 并使用该帖子中描述的自定义HttpClient 实现。


    更新:

    主机名验证可以通过setting a custom X509HostnameVerifierSSLSocketFactory 上进行自定义。一些实现已经在 android 中可用:AllowAllHostnameVerifierBrowserCompatHostnameVerifierStrictHostnameVerifier

    /* ... */
    public class MyHostnameVerifier extends AbstractVerifier {
      boolean verify(String hostname, SSLSession session) {
        X509Certificate[] chain = session.getPeerCertificateChain();
        /* made some checks... */
        return checked;
      }
    }
    sslSocketFactory.setHostnameVerifier(new MyHostnameVerifier());
    

    【讨论】:

    • 如何从服务器接收证书并从中获取测试数据?
    • 您无需执行任何操作。证书在 SSL 握手期间由服务器发送,并由客户端应用程序根据 KeyStore 内容自动验证。在交换任何 HTTP 数据之前执行握手。如果您想执行更复杂或自定义的证书验证,这也是可能的(但在此评论中解释有点长)
    • @Jcs,我已经有了我必须使用的 certificate.cer 文件。我不明白充气城堡部分的那部分。另外我没有任何密码可以传递给trusted.load(); ???我在这些方面陷入困境。
    • SSLSocketFactory 构造函数需要一个 KeysStore,这就是为什么您不能直接传递 certificate.cer 文件并且您必须将其包装到 KeyStore 对象中的原因。 Android 不支持旧的 java 密钥库格式(又名 JKS),但它支持 BouncyCastle 设计的密钥库格式(又名 BKS)。通过将 BouncyCastle 库添加到类路径,keytool 能够创建 BKS 格式的密钥库。创建密钥库时密码是可选的;您可以忽略此选项并将 null 传递给 load() 方法。
    • 感谢 Jcs 的解释。我成功地创建了 bks 文件并从服务器接受了 vert 并访问了 Web 服务。但是有两个问题:1)默认域是“aa-e3.mysite.com”。我有一个域列表并列出任何域并连接到该域,它可能是“we-e3.mysite.com”或其他内容。只有当 prg 选择的域是默认域时才能访问 WS,对于其他所有我得到 SSLExcep "hostname in certi didn't match: != ”。如何处理?
    猜你喜欢
    • 2015-10-19
    • 2021-11-11
    • 1970-01-01
    • 2021-12-16
    • 2018-03-15
    • 1970-01-01
    • 2016-06-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多