我正在尝试使用相互证书身份验证从 TLS 安全服务发送和接收数据。我已成功连接到该服务,响应是我已获得授权。我将数据发送到服务器,然后连接一个“数据”事件...我知道我的数据已准确发送,因为我得到的响应数据是半准确的。
数据在每个 block 的开头和结尾(有时在中间)包含奇数字符。
HTTP/1.1 200 OK
X-Powered-By: Servlet/2.5
Set-Cookie: JSESSIONID=8f2a41305cbe859001f1d54e5e80; Path=/xds; Secure
Content-Type: application/soap+xml;charset=utf-8
Transfer-Encoding: chunked
Date: Thu, 13 Feb 2014 01:53:14 GMT
6c
<?xml version='1.0' encoding='UTF-8'?><S:Envelope x.........
2000
<ns4:AdhocQueryResponse xmlns:ns2="urn:oasis:names:.........
1485
8425c" objectType="urn:oasis:names:tc:ebxml-regrep:.........
0
这是我使用的代码:
var tls = require('tls');
var net = require('net');
var receiveData = function(sock) {
var response = '';
sock.on('error', function(err) {
console.log("Socket error: " + err);
});
sock.on('data', function(d){
response += d.toString();
});
sock.on('end', function() {
console.log("Done receiving data from via TLS: " + response.length);
console.log(response);
});
};
var sendData = function(sock) {
console.log("Sending request to HIE");
var req = 'POST ' + path + ' HTTP/1.1\r\n' +
'Host: localhost\r\n' +
'Content-Length: ' + data.length + '\r\n' +
'Content-Type: application/soap+xml; charset=utf-8\r\n' +
'SOAPAction: "http://www.w3.org/2003/05/soap-envelope"\r\n' +
'\r\n';
sock.write(req);
sock.write(data);
};
var options = {
port: port,
host: host,
key: fs.readFileSync(tls_key, encoding='ascii'),
cert: fs.readFileSync(tls_cert, encoding='ascii'),
ca: fs.readFileSync(tls_ca, encoding='ascii')
};
var sock = tls.connect(options, function() {
var authorized = sock.authorized;
if (authorized) {
console.log("Successfully connected via TLS");
sock.setKeepAlive(true);
receiveData(sock);
sendData(sock);
} else {
console.log("Unauthorized to connect via TLS: " + sock.authorizationError);
}
});
有谁知道为什么我会收到这些奇怪的字符?我已经尝试设置 socks 的 setEncoding('utf8'),这消除了我对 .toString() 数据的需要。但是,这并没有解决这些奇怪字符的问题。
我想也许它们是 block 中有多少数据的指标……但是,“6c”位于第一个 block 的中间。所以,我不认为是这样。更重要的是,第三个 block 有一个 0,即使在那个 block 中发送了很多数据。
请帮忙!
最佳答案
你几乎想通了!数据中数字的原因是响应使用分块传输编码,如“传输编码”响应 header 中所示:
Transfer-Encoding: chunked
每个 block 之前的数字( header 不是 block 本身,因此 6c 是“数据”的第一部分)是表示在该 block 中发送的字节数的十六进制值。响应以 0 字节 block 终止。有关详细信息,请参阅以下内容:
http://en.wikipedia.org/wiki/Chunked_transfer_encoding
https://www.rfc-editor.org/rfc/rfc2616#section-3.6.1
分块传输编码允许在不知道响应开始时将返回多少数据的情况下返回数据。如果知道要返回多少数据,则应相应地设置“Content-Length”响应 header 。
关于javascript - nodeJS TLS 在数据中包含奇数字符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21743763/