Я тестирую Node.JS и TLS и создаю простой сервер и клиент.
Кажется, это нормально работает:
server.js:
const tls = require('tls');
const fs = require('fs');
const options = {
key: fs.readFileSync('./server-certs/server.key'),
cert: fs.readFileSync('./server-certs/server.crt'),
rejectUnauthorized: false,
requestCert: true
};
const server = tls.createServer(options, (socket) => {
console.info('server connected',
socket.authorized ? 'authorized' : 'unauthorized');
console.info(socket.getPeerCertificate(true).raw);
socket.write('welcome!\n');
socket.setEncoding('utf8');
socket.pipe(socket);
});
server.listen(8000, () => {
console.info('server bound');
});
client.js:
const tls = require('tls');
const fs = require('fs');
const options = {
key: fs.readFileSync('./client-certs/client.key'),
cert: fs.readFileSync('./client-certs/client.crt')
};
const socket = tls.connect(8000, options, () => {
console.info('client connected',
socket.authorized ? 'authorized' : 'unauthorized');
process.stdin.pipe(socket);
process.stdin.resume();
});
socket.setEncoding('utf8');
socket.on('data', (data) => {
console.info(data);
});
socket.on('end', () => {
console.info('server ends connection');
});
С server.js я распечатываю сертификат клиента:
console.info(socket.getPeerCertificate(true).raw);
Но при выполнении cat client.crt в Linux у меня есть следующая длинная строка:
-----BEGIN CERTIFICATE-----
MIICsDCCAZgCCQC8miOEYnXCXDANBgkqhkiG9w0BAQsFADAaMQswCQYDVQQGEwJV
...
MHBcIlA2R3ssgfhlcSJcaR59LKA=
-----END CERTIFICATE-----
Может ли server.js получить эту строку из клиентского сертификата?





console.info(socket.getPeerCertificate(true).raw);
Это возвращает сертификат в формате DER. То, что вы видите в client.crt, - это сертификат в формате PEM, который в основном представляет собой base64 двоичного формата DER с добавлением некоторых строк верхнего и нижнего колонтитула. Вы можете преобразовать PEM в DER с помощью openssl x509 -in client.crt -outform der. Или вы можете преобразовать сертификат в формате DER в PEM в nodejs, как это предлагается в NodeJS: проверить сертификат в формате DER.
var prefix = '-----BEGIN CERTIFICATE-----\n'; var postfix = '-----END CERTIFICATE-----'; var pemText = prefix + socket.getPeerCertificate(true).raw.toString('base64').match(/.{0,64}/g).join('\n') + postfix;вроде работает, спасибо.