【发布时间】:2022-01-13 13:25:42
【问题描述】:
如果这是一个重复的问题,我真的很抱歉,但我在其他线程中尝试了很多答案,但没有一个对我有用。
我正在尝试使用 TLSv1.2 协议通过 SSLSocket 向远程服务器发送 ISO8583 消息,我使用密钥库配置了证书并尝试发送示例 ISO8583 消息:08002220010000800000900000011312115000000180105000003
0800:MTI
2220010000800000:二进制十六进制编码位图(仅存在字段 3、7、11、24、41)
900000:进程代码
0113121150:传输日期和时间
000001: 斯坦
801:功能码
05000003:终端 ID
然后我将消息转换为字节数组并使用套接字 OutputStream 发送,但服务器没有响应,并且在尝试读取 InputStream 时冻结。
出于这个问题的目的,我选择测试手动设置的示例消息,不使用任何打包方法。
我对 ISO8583 很陌生,所以我不知道自己做错了什么。
这是迄今为止我尝试过的代码,非常感谢愿意帮助我的人。
Thread thread = new Thread(() -> {
try {
X509TrustManager[] tmm;
KeyStore ks = KeyStore.getInstance("BKS");
InputStream is = getResources().openRawResource(R.raw.tunrootca2);
ks.load(is, KEY_PASSWORD.toCharArray());
tmm=tm(ks);
SSLContext ctx = SSLContext.getInstance("TLSv1.2");
ctx.init(null, tmm, null);
SSLSocketFactory SocketFactory = ctx.getSocketFactory();
SSLSocket socket = (SSLSocket) SocketFactory
.createSocket(REMOTE_ENDPOINT, REMOTE_ENDPOINT_PORT);
String sampleMessage = "080022200100008000009000000113120000000180105000003";
byte[] bytesMessage = sampleMessage.getBytes(StandardCharsets.UTF_16LE);
byte[] bytes = packData(bytesMessage);
OutputStream out = socket.getOutputStream();
out.write(bytes);
byte[] buffer = new byte[256];
InputStream in = socket.getInputStream();
int read;
while((read = in.read(buffer)) != -1) {
String output = new String(buffer, 0, read);
Log.v("SOCKET_OUTPUT", output);
}
} catch (Exception e) {
e.printStackTrace();
}
});
thread.start();
});
打包数据函数
static byte[] packData(byte[] data) {
int len = data.length;
byte buf[] = new byte[len + 2];
buf[0] = (byte) (len >> 8 & 255);
buf[1] = (byte) (len & 255);
System.arraycopy(data, 0, buf, 2, len);
return buf;
}
【问题讨论】: