【问题标题】:Check ssl certificate used by Android socket connection检查 Android 套接字连接使用的 ssl 证书
【发布时间】:2014-01-06 03:27:17
【问题描述】:

我正在检查一个建立 ssl 连接的 Android 代码。函数 createSSLSocketFactory 有问题。它加载一个密钥库。我不知道ssl连接是用于信任服务器证书还是发送客户端证书。

请帮我检查并给我一些解释。

代码如下:

private DefaultHttpClient createHttpClient() {
        DefaultHttpClient ret = new DefaultHttpClient(){
            /* (non-Javadoc)
             * @see org.apache.http.impl.client.DefaultHttpClient#createClientConnectionManager()
             */
            @Override
            protected ClientConnectionManager createClientConnectionManager() {
                SchemeRegistry registry = new SchemeRegistry();
                try {
                    URI uri;
                    uri = new URI(getURI());
                    if (Http.SCHEME_HTTP.equals(uri.getScheme())) {
                        registry.register(new Scheme(Http.SCHEME_HTTP, PlainSocketFactory.getSocketFactory(), 80));
                    } else if (Http.SCHEME_HTTPS.equals(uri.getScheme())) {
                        registry.register(new Scheme(Http.SCHEME_HTTPS, createSSLSocketFactory(), 443));
                    }
                } catch (URISyntaxException e) {
                    LogUtils.e(e.getMessage(), e);
                }
                return new SingleClientConnManager(getParams(), registry);
            }
            private SSLSocketFactory createSSLSocketFactory() {

                final Resources resources = mContext.getResources();
                final InputStream in = resources.openRawResource(R.raw.ippaps);

                ApplicationManeger apm = ApplicationManeger.getInstance();
                final char[] passwdchars = apm.getProperty(
                        PropertiesConstants.SSL_PASSWORD).toCharArray();

                SSLSocketFactory socketFactory = null;
                try {
                    KeyStore keyStore = KeyStore.getInstance("BKS");
                    try {
                        keyStore.load(in, passwdchars);
                    } finally {
                        in.close();
                    }
                    socketFactory = new SSLSocketFactory(keyStore);
                    socketFactory.setHostnameVerifier(SSLSocketFactory.STRICT_HOSTNAME_VERIFIER);
                } catch (Exception e) {
                    LogUtils.d(e.getMessage(), e);
                }
                return socketFactory;
            }
        };

        return ret;
    }

谢谢!!!

【问题讨论】:

    标签: android ssl keystore sslsocketfactory


    【解决方案1】:

    即使android javadoc 不是很清楚,当SSLSocketFactory 使用单个KeyStore 类型参数创建时,此密钥库也用作信任库。这意味着密钥库将用于对服务器证书进行身份验证,但如果服务器需要客户端身份验证,则连接将失败。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-09-09
      • 1970-01-01
      • 1970-01-01
      • 2017-06-18
      • 2017-01-08
      • 2017-05-10
      • 2015-07-04
      • 2021-01-19
      相关资源
      最近更新 更多