P12 PFX NodeJS Запрос

Я пытаюсь сделать запрос с помощью файла p12 или pfx, но не могу заставить его работать. Если я использую PEM и KEY, код работает нормально. Но Azure Keyvault не поддерживает PEM и KEY. Есть ли альтернатива, которая работает с сертификатами KEY/PEM?

Вот как я сгенерировал файл p12/pfx, если в этом проблема.

openssl pkcs12 -export -out Certificate.pfx -inkey 1231181189.key -in 1231181189.pem -certfile CA.pem

Вот пример кода, если я закомментирую сертификат и ключ, система не работает,

Ошибка: прочитайте ECONNRESET

Но если я закомментирую pfx и passphrase и использую pem и key, соединение работает.

var request = require('request');
var fs = require('fs');
var path = require('path');
var certFile = __dirname + '/certs/1231181189.pem';
var keyFile = __dirname + '/certs/1231181189.key';

var options = {
  method: 'POST',
  url: 'https://mss.cpc.getswish.net/swish-cpcapi/api/v1/paymentrequests',
  headers: { 'Content-Type': 'application/json' },
  agentOptions: {
    cert: fs.readFileSync(certFile),
    key: fs.readFileSync(keyFile),
    pfx: fs.readFileSync(__dirname + '/certs/certificate.pfx'),
    passphrase: 'swish'
  },
  body: {
    payeePaymentReference: '0123456789',
    callbackUrl: 'https://example.com/api/swishcb/paymentrequests',
    payerAlias: '4671234768',
    payeeAlias: '1231181189',
    amount: '100',
    currency: 'SEK',
    message: 'Kingston USB Flash Drive 8 GB'
  },
  json: true
};

request(options, function (error, response, body) {
  if (error) throw new Error(error);

  console.log(response.headers);
  console.log(body);
});

Ответ 1

ECONNRESET означает дальний конец - в вашем случае конечную точку на swish.net - бесцеремонно отключен от клиента https в вашей программе nodejs. Трудно точно понять, почему это так. Вероятно, из-за сбоя в системе безопасности. Надежные серверы не объясняют сбои безопасности; ведь зачем помогать кибер-крипам? Возможно, просмотр журнала на этом сервере расскажет вам больше.

Тем временем возможно, что пакет request npm, который вы используете для переноса функции агента https узла, ничего не знает о файлах или паролях .pfx, и поэтому пытается подключиться без каких-либо клиентских сертификатов.

Пакет pemutils может позволить вам извлечь необходимую информацию из вашего файла .pfx и использовать ее. Нечто подобное может работать (не отлажено).

var request = require('request');
var pemutils = require('pemutils');
var fs = require('fs');
var path = require('path');
const pfxFile =  __dirname + '/certs/certificate.pfx';

pemutils.fromPfx({
    path: pemutils.fromPfx({
    path: '/path/to/my/cert.pfx',
    password: 'myPass'
}, function(err, tlsresults) {
    if(err) throw err;
    var options = {
      method: 'POST',
      url: 'https://mss.cpc.getswish.net/swish-cpcapi/api/v1/paymentrequests',
      headers: { 'Content-Type': 'application/json' },
      agentOptions: {
        cert: tlsresults.certificate,
        key:  tlsresults.key,
      },
      body: {
           ...
      },
      json: true
    };
    ...

Обратите внимание, что метод .fromPfx является асинхронным.