Android使用证书建立HTTPSConnection

时间:2016-04-17 17:21:22

标签: java android ssl android-studio https

我正在Android Studio下开发Android应用程序,我需要建立HTTPS连接。到目前为止,我已经取得了成功,但在目前的实施中,我相信所有主机,这很容易导致中间人攻击。所以我想知道有没有办法相信一个确切的证书而不是其他的?到目前为止,我的代码看起来像这样:

    /**
* Trust every server - dont check for any certificate
*/
private void trustAllHosts() {
    // Create a trust manager that does not validate certificate chains
    TrustManager[] trustAllCerts = new TrustManager[]{new X509TrustManager() {
    public java.security.cert.X509Certificate[] getAcceptedIssuers() {
        return new java.security.cert.X509Certificate[]{};
    }

    public void checkClientTrusted(X509Certificate[] chain,String authType) throws CertificateException {
    }

    public void checkServerTrusted(X509Certificate[] chain,String authType) throws CertificateException {
    }
    }};

    // Install the all-trusting trust manager
    try {
        SSLContext sc = SSLContext.getInstance("TLS");
        sc.init(null, trustAllCerts, new java.security.SecureRandom());
        HttpsURLConnection.setDefaultSSLSocketFactory(sc.getSocketFactory());
    } catch (Exception e) {
        e.printStackTrace();
    }
}

我正在使用这样的HttpsURLConnection

    private void postText(String URLAddress) {
    try {
        URL obj = new URL(URLAddress);
        HttpsURLConnection con = (HttpsURLConnection) obj.openConnection();

        con.setHostnameVerifier(DO_NOT_VERIFY);
        con.setRequestMethod("POST");
        con.setRequestProperty("User-Agent", "Mozilla/5.0");

        int responseCode = con.getResponseCode();

        if (responseCode == HttpURLConnection.HTTP_OK) { //success
            BufferedReader in = new BufferedReader(new InputStreamReader(
            con.getInputStream()));
            String inputLine;
            StringBuilder response = new StringBuilder();

            boolean First = true;
            while ((inputLine = in.readLine()) != null) {
                if(First)
                    First=false;
                else
                    response.append("\n");
                response.append(inputLine);
            }
            in.close();

            RequestResponse=response.toString();
        }
    } catch (Exception e) {
        e.printStackTrace();
    }
}

如果只能信任我想要的证书,我该怎么做?我需要哪些信息才能获得该证书以及我必须使用哪些信息才能实现这一目标?

由于

3 个答案:

答案 0 :(得分:0)

如果您想自己处理验证,那么简单的部分就是固定公钥。但是你必须考虑撤销,然后你的问题就开始了。

为什么不简单地使用设备信任的证书?

答案 1 :(得分:0)

  

如果只能信任我想要的证书,我该怎么办?

仅信任特定证书或公钥的过程称为证书锁定或公钥锁定。由于我不想重复已经存在的所有好信息,请转到特定的article at OWASP,其中还包括sample code for Android。 如果此链接关闭或移动 - 只需搜索android certificate pinning example

答案 2 :(得分:0)

执行此操作的正确方法是将证书的主题身份验证为授权的身份通过信任单个证书来连接,而不是滥用身份验证进程,其中包括在续订时给您带来问题。

在SSL级别,这是通过安装握手监听器来完成的。

在HTTPS级别,这是通过安装HostnameVerifier

来完成的