android中关于读取pem文件建立SSL连接的问题

zhanglibin123488 发布于 2015/11/10 10:52
阅读 2K+
收藏 0

最近在做的项目用到SSL协议,需要读取pem 文件建立SSL连接,用的是 socket连接方式。连的是银联的一个端口。但是一直没响应,我不知道是不是我代码哪里写错了(SSl这块我原本也不懂,在网上找了点相关的资料,凑的)。现在贴出来,希望懂的大神帮我看下,本人QQ:623640377:

@Override
public byte[] exchangeDataWithServer(byte[] arg0) {
String ip = getServerIp(Constant.ExchangeServiceUrl).getHostAddress();//
 SSLContext sslContext = null;
 SSLSocket socket = null;
       try {
           // 设定Security的Provider提供程序
           Security.addProvider(new org.bouncycastle.jce.provider.BouncyCastleProvider());
           
           // 建立空BKS,android只能用BKS(BouncyCastle密库),一般java应用参数传JKS(java自带密库) 
           KeyStore ksKeys = KeyStore.getInstance("BKS");
           ksKeys.load(null, null);


           // 读入客户端证书
           PEMReader cacertfile = new PEMReader(new InputStreamReader(getResources().openRawResource(R.raw.umscert)));//这里是我的pem文件
           X509Certificate cacert = (X509Certificate) cacertfile.readObject();
           cacertfile.close();


           // 导入根证书作为trustedEntry
           KeyStore.TrustedCertificateEntry trustedEntry = new KeyStore.TrustedCertificateEntry(cacert);
           ksKeys.setEntry("ca_root", trustedEntry, null);
           
           TrustManagerFactory tmf = TrustManagerFactory.getInstance("X509");//密钥管理器,一般java应用传SunX509
           tmf.init(ksKeys);


           // 构建SSLContext,此处传入参数为TLS,也可以为SSL 
           sslContext = SSLContext.getInstance("SSL");
           sslContext.init(null, tmf.getTrustManagers(), null);
           
           SSLSocketFactory factory = sslContext.getSocketFactory();
           socket = (SSLSocket) factory.createSocket(ip, 9510);
           
           OutputStream output = socket.getOutputStream();  
           InputStream input = socket.getInputStream();  
         
           output.write(arg0);  
          // System.out.println("sent: alert");  
           output.flush();  
           
           int count = 0;
           Date now=new Date();
           while (count == 0) {
count = input.available();
Date here=new Date();
if((here.getTime()-now.getTime())/1000>30){//30秒未接收到数据,则视为超时
throw new Exception();
}
}
           
           byte[] buf = new byte[count];  
           input.read(buf);
           output.close();
           input.close();
           return buf;
       } catch (Exception e) {
           e.printStackTrace();
           return "000000".getBytes();
       }finally{
        try {
socket.close();
} catch (IOException e) {
e.printStackTrace();
}
       }
}
});

加载中
返回顶部
顶部