美文网首页
Android 使用自签名证书

Android 使用自签名证书

作者: SDY_0656 | 来源:发表于2017-10-23 20:03 被阅读0次

Android SSL可以使用CA证书也可以使用自签名证书,自签名证书是通过keystore生成的,本文介绍android端使用自签名证书过程。
1,拷贝自签名证书到assert目录下,方便读取。
2,修改网络请求工具类OkHttpClientManager,如下所示:

public void setCertificates(InputStream... certificates)
{
    try
    {
        CertificateFactory certificateFactory = CertificateFactory.getInstance("X.509");
        KeyStore keyStore = KeyStore.getInstance(KeyStore.getDefaultType());
        keyStore.load(null);
        int index = 0;
        for (InputStream certificate : certificates)
        {
            String certificateAlias = Integer.toString(index++);
            keyStore.setCertificateEntry(certificateAlias, certificateFactory.generateCertificate(certificate));

            try
            {
                if (certificate != null)
                    certificate.close();
            } catch (IOException e)
            {
            }
        }

        SSLContext sslContext = SSLContext.getInstance("TLS");

        TrustManagerFactory trustManagerFactory = 
            TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm()); 

        trustManagerFactory.init(keyStore);
        sslContext.init
            (   
                null, 
                trustManagerFactory.getTrustManagers(), 
                new SecureRandom()
            );
       mOkHttpClient.setSslSocketFactory(sslContext.getSocketFactory());


    } catch (Exception e)
    {
        e.printStackTrace();
    } 

}

3,在application中使用,

public class MyApplication extends Application
{
   @Override
    public void onCreate()
    {
        super.onCreate();

        try
        {
            OkHttpClientManager.getInstance()
                    .setCertificates(getAssets().open("srca.cer"));
        } catch (IOException e)
        {
            e.printStackTrace();
        }


}

以上是单向验证,只要客户端获取了包含服务端公钥的证书即可。

下面介绍双向验证,单向验证是服务端有"kjs文件",客户端有" cer文件",那么双向验证就是客户端也有一个"kjs文件",服务端也有一个"cer文件",实现步骤如下:
1,修改网络请求工具类:

public void setCertificates(InputStream... certificates)
{
    try
    {
        CertificateFactory certificateFactory = CertificateFactory.getInstance("X.509");
        KeyStore keyStore = KeyStore.getInstance(KeyStore.getDefaultType());
        keyStore.load(null);
        int index = 0;
        for (InputStream certificate : certificates)
        {
            String certificateAlias = Integer.toString(index++);
            keyStore.setCertificateEntry(certificateAlias, certificateFactory.generateCertificate(certificate));

            try
            {
                if (certificate != null)
                    certificate.close();
            } catch (IOException e)
            {
            }
        }

        SSLContext sslContext = SSLContext.getInstance("TLS");
        TrustManagerFactory trustManagerFactory = TrustManagerFactory.
                getInstance(TrustManagerFactory.getDefaultAlgorithm());
        trustManagerFactory.init(keyStore);

        //初始化keystore
        KeyStore clientKeyStore = KeyStore.getInstance(KeyStore.getDefaultType());
        clientKeyStore.load(mContext.getAssets().open("zhy_client.jks"), "123456".toCharArray());

        KeyManagerFactory keyManagerFactory = KeyManagerFactory.getInstance(KeyManagerFactory.getDefaultAlgorithm());
        keyManagerFactory.init(clientKeyStore, "123456".toCharArray());

        sslContext.init(keyManagerFactory.getKeyManagers(), trustManagerFactory.getTrustManagers(), new SecureRandom());
        mOkHttpClient.setSslSocketFactory(sslContext.getSocketFactory());


    } catch (Exception e)
    {
        e.printStackTrace();
    } 

}

2,将"jks文件"改为"bks文件",因为Java平台默认识别jks格式的证书文件,但是android平台只识别bks格式的证书文件。下载Download portecle-1.9.zip (3.4 MB)
解压后,里面包含bcprov.jar文件,使用jave -jar bcprov.jar即可打开GUI界面。
然后修改代码为:

//初始化keystore
KeyStore clientKeyStore = KeyStore.getInstance("BKS");
clientKeyStore.load(mContext.getAssets().open("zhy_client.bks"), "123456".toCharArray());

KeyManagerFactory keyManagerFactory = KeyManagerFactory.getInstance(KeyManagerFactory.getDefaultAlgorithm());
keyManagerFactory.init(clientKeyStore, "123456".toCharArray());

sslContext.init(keyManagerFactory.getKeyManagers(), trustManagerFactory.getTrustManagers(), new SecureRandom());

参考文章:
http://blog.csdn.net/lmj623565791/article/details/48129405

相关文章

  • Android 使用自签名证书

    Android SSL可以使用CA证书也可以使用自签名证书,自签名证书是通过keystore生成的,本文介绍and...

  • 踩坑记

    1、android自签名证书Glide加载不出图片 关于https中自签名证书的介绍以及OkHttp中解决自签名证...

  • openssl生成EC类型证书

    生成EC KEY 生成CSR 生成自签名证书 或者使用CA证书来签名

  • Android 签名文件转换

    关于 Android 签名的相关概念可参看 Android中签名、证书、公钥密钥的概念及使用 Android 中有...

  • Netty中自签名证书的颁发

    概要 自签名证书的用途一般我们需要注册CA证书给网站添加HTTPS,不过本地测试的时候,我们可以使用自签名证书。自...

  • Android HTTPS之自签名证书认证(二)

    使用okhttp框架 双向认证 在上一篇博客中《Android HTTPS之自签名证书认证(一)单向认证》,我们主...

  • CA证书制作实战

    需求:自建CA 颁发证书,使用自签名证书来构建安全网络,所谓自签名证书,就是自己扮演 CA 机构,自 己给自己的服...

  • nginx配置自签名https

    nginx配置https是需要CA颁发证书的,为了测试方便,我们可以使用自签名证书1.如何生成自签名证书1.1:我...

  • OkHttpClient使用https协议

    设置sslSocketFactory 1.自签名证书 证书放在res/raw下使用p12证书 使用pem证书 2....

  • Flutter 自签名证书

    前言 Flutter项目中服务器使用了自签名证书,如果直接使用https请求或者wss请求的话会报证书签名错误。 ...

网友评论

      本文标题:Android 使用自签名证书

      本文链接:https://www.haomeiwen.com/subject/tmzauxtx.html