您的位置:首页 > 移动开发 > Android开发

android SSLsocket建立连接,不需要非要使用.bks类型的证书秘钥文件

2017-11-06 16:27 633 查看
Sslsocket连接,主要是秘钥格式等的加载问题。

遇到的问题,服务器端是linux系统生成的秘钥文件除了需要的一串字符串外还有一个头部,要去掉那个头部才行。

例子:

-----BEGIN CERTIFICATE-----

MIIDwjCCAqqgAwIBAgIBATANBgkqhkiG9w0BAQsFADBFMQswCQYDVQQGEwJBVTET

MBEGA1UECAwKU29tZS1TdGF0ZTEhMB8GA1UECgwYSW50ZXJuZXQgV2lkZ2l0cyBQ

dHkgTHRkMB4XDTE3MTAyNTA4NDQ1MloXDTI3MTAyMzA4NDQ1MlowRTELMAkGA1UE

BhMCQVUxEzARBgNVBAgMClNvbWUtU3RhdGUxITAfBgNVBAoMGEludGVybmV0IFdp

ZGdpdHMgUHR5IEx0ZDCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAMS6

QqE6L0dl2ceRl/GIFBO0LQzicwQ/7xRzLQJ8ksjGlckrKzay7FAFVFJoziWEdnmJ

ZrUp/aH4rI/KpLqBloV8WC5bN5kHAtp7/n1q42kqkt1puxtsC9SUgTY38lPvS/ml

Tw3mLJ/SlEwvkd0PuTFl04GcGVTFjcEfPQi8xGkYBFr2BjFhJZpXXAgMTXHZYK9X

Ly3gpyI7+v9jotvFN8vDVQadp/Wu2Bb1NTNzbdkqJbzKdXyreXZ6pLOK+xd9/WoB

UcA0QjYlbfXuaso8/4cCAwEAAaOBvDCBuTAJBgNVHRMEAjAAMCwGCWCGSAGG+EIB

DQQfFh1PcGVuU1NMIEdlbmVyYXRlZCBDZXJ0aWZpY2F0ZTAdBgNVHQ4EFgQU2bR3

b5aqZ+6SixiKKS+9ax3CtqEwXwYDVR0jBFgwVqFJpEcwRTELMAkGA1UEBhMCQVUx

EzARBgNVBAgMClNvbWUtU3RhdGUxITAfBgNVBAoMGEludGVybmV0IFdpZGdpdHMg

UHR5IEx0ZIIJAJ/+/m3aZgC5MA0GCSqGSIb3DQEBCwUAA4IBAQA57z9N1PuHn6Xw

iRxTAdI0QlEuoGMrL4dZidbCSqV7Z6KM82iNwVKbgp210CkY5hPMzkk+41MQL8ar

uugxgrXF6+qun6XRexPOWXuM+3xYcU75b9vdz/pZBTlSyIY3FR6zRnJKRN0x3PKX

-----END CERTIFICATE-----

得是这样的才行,有其他东西的不行。

public void sslSocket() {

    if (sslSocket
!= null) {

        try {

            sslSocket.close();

        } catch (IOException e) {

            e.printStackTrace();

        }

        sslSocket =
null
;

    }

    try {

        // Loading CAs from an InputStream
        CertificateFactory cf;

        cf = CertificateFactory.getInstance("X.509");

        final X509Certificate server_ca;

        InputStream cert = mContext.getResources().openRawResource(R.raw.server);

        server_ca = (X509Certificate) cf.generateCertificate(cert);

        cert.close();

        // Creating a KeyStore containing our trusted CAs
        String keyStoreType = KeyStore.getDefaultType();

        KeyStore keyStore = KeyStore.getInstance(keyStoreType);

        keyStore.load(null,
null);

        keyStore.setCertificateEntry("ca-certificate", server_ca);

        InputStream pkcs12in = mContext.getResources().openRawResource(R.raw.client);

        KeyStore pKeyStore = KeyStore.getInstance("PKCS12");

        pKeyStore.load(pkcs12in, AppConstant.PASSWORD_FOR_PKCS12.toCharArray());

        // Creating a TrustManager that trusts the CAs in our KeyStore.
        String tmfAlgorithm = TrustManagerFactory.getDefaultAlgorithm();

        TrustManagerFactory tmf = TrustManagerFactory.getInstance(tmfAlgorithm);

        tmf.init(keyStore);

        KeyManagerFactory kmf = KeyManagerFactory.getInstance(KeyManagerFactory.getDefaultAlgorithm());

        kmf.init(pKeyStore, null);

        pkcs12in.close();

        // Creating an SSLSocketFactory that uses our TrustManager
        SSLContext sslContext = SSLContext.getInstance("TLS");

        sslContext.init(kmf.getKeyManagers(), tmf.getTrustManagers(), null);

        sslSocket = (SSLSocket) sslContext.getSocketFactory().createSocket(/*AppConstant.SERVER_IP, AppConstant.TCP_CONNECT_PORT*/);

        sslSocket.setSoTimeout(5000);

        sslSocket.addHandshakeCompletedListener(new
HandshakeCompletedListener() {

            @Override
            public void
handshakeCompleted(HandshakeCompletedEvent event) {

                Log.i(TAG,"ssl握手成功回调");

            }

        });

        if (ipAddress
!= null && !ipAddress.equals("")) {

            address =
new InetSocketAddress(ipAddress, AppConstant.TCP_CONNECT_PORT);

        } else {

            address =
new InetSocketAddress(AppConstant.SERVER_IP, AppConstant.TCP_CONNECT_PORT);

    
a636
    }

        sslSocket.connect(address, AppConstant.SERVER_CONNECT_TIMEOUT);

        Log.e(TAG,
"init sslSocket success 创建socket"
+ address.toString());

    } catch (Exception e) {

        if(ipAddress!=null){

            Log.i(TAG,"连接的ip不可用, ip="+ipAddress);

            dataListener.onConnectDeviceFail(ipAddress);

        }

        e.printStackTrace();

    }

}

步骤:

1.Loading CAs from an InputStream

2. Creating a KeyStore containing our trusted CAs

3. Creating a TrustManager that trusts the CAs in our KeyStore.

4. Creating an SSLSocketFactory that uses our TrustManager

这4步在代码中都有对应,之前网上有一遍文章说是非要bks的,看来那个人要被打脸了,我这个不用bks的

 

这里服务器端一个.cer证书文件

客户端一个.p12秘钥文件

都是由搞服务器的人提供
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐