UNABLE_TO_VERIFY_LEAF_SIGNATURE из запроса с функциями Firebase node.js с сертификатом (pfx) - PullRequest
0 голосов
/ 13 марта 2020

Я пытаюсь сделать запрос от моей функции Firebase к пользовательскому серверу, для которого требуется сертификат (.pfx). Основываясь на этом ответе:

Загрузить сертификат клиента TLS в облачные функции Firebase

Мой код выглядит следующим образом:

const functions = require('firebase-functions');
const request = require('request');

var fs = require('fs');

// The Firebase Admin SDK to access the Firebase Realtime Database.
const admin = require('firebase-admin');
admin.initializeApp();

exports.postBankId = functions.https.onRequest(async (req, res) => {
  console.log('PostBankId');
  const ipAddress = req.query.ipAddress;
  const requestBody = '{ "endUserIp": "' + ipAddress +'" }';
  console.log('requestBody:', requestBody); 
  const options = {
      url: 'https://appapi2.test.bankid.com/rp/v5/auth',
      json: true,
      pfx: fs.readFileSync('bankidtest.pfx'),
      passphrase: 'myPassPhraseHere',
      body: requestBody
  }

  request.post(options, (err, response) => {
      if (err) {
            console.log('bankid creation error: ' + JSON.stringify(err))
            res.status(500).send('Failed with error: ' + JSON.stringify(err));
      }
      if (response) {
          res.status(200).send('Success');
          console.log('Succes body: ' + response.body)
      }
  });
});

Ответ, который я получаю :

{"code":"UNABLE_TO_VERIFY_LEAF_SIGNATURE"}

Я помещаю bankidtest.pfx в ту же папку, что и индекс. js. И, похоже, он загружен, потому что при его удалении выдается еще одна ошибка:

Error: could not handle the request

Edit1:

размещение пути к сертификату в agentOptions также не работает , Выдает такую ​​же UNABLE_TO_VERIFY_LEAF_SIGNATURE ошибку.

var options = {
    url: 'https://appapi2.test.bankid.com/rp/v5/auth',
    headers: {
        "content-type": "application/json",
    },
    agentOptions: {
        pfx: fs.readFileSync('bankidtest.pfx'),
        passphrase: '********'
    }
};

Edit2: Получил полу-рабочий. Установка параметра запроса "rejectUnauthorized" в значение "false" заставляет запрос работать. Но, согласно BankId, это не безопасный и не рекомендуемый способ. Полуработающий код:

  request({
    url: "https://appapi2.test.bankid.com/rp/v5/auth",
    host: "appapi2.test.bankid.com",
    rejectUnauthorized: false, // This like makes it work
    requestCert: true,
    method: "POST",
    headers: {
        "content-type": "application/json", 
        'Connection': "Keep-Alive"
    },

    body: requestBody,
    agentOptions: {
        pfx: fs.readFileSync('bankidtest.pfx'),
        passphrase: '*****'
    },

Edit3: Попробовал npm install ssl-root-cas, а затем добавил это в начало моего индекса. js:

var sslRootCAs = require('ssl-root-cas/latest')
sslRootCAs.inject()

Но потом я получил эту ошибку:

Error: EROFS: read-only file system, open '/srv/node_modules/ssl-root-cas/pems/mozilla-certdata.txt'
   at Object.fs.openSync (fs.js:646:18)
   at Object.fs.writeFileSync (fs.js:1299:33)
   at /srv/node_modules/ssl-root-cas/ca-store-generator.js:219:10
   at IncomingMessage.<anonymous> 
     (/srv/node_modules/@coolaj86/urequest/index.js:154:9)

Edit4: Попробовал их вместо этого для удаления inject(), но безуспешно. На этот раз ошибки только для чтения, но все равно UNABLE_TO_VERIFY_LEAF_SIGNATURE:

var rootCas = require('ssl-root-cas/latest').create();

//rootCas.addFile(__dirname + '/mycerts.crt');
rootCas.addFile('mycerts.cer');
rootCas.addFile('mycerts.crt');
rootCas.addFile('bankidtest.pfx'); // Also tried with __dirname

require('https').globalAgent.options.ca = rootCas;

// Also tried this:
//require('https').globalAgent.options.ca = require('ssl-root-cas').rootCas

Edit5 Решено

Похоже, что нужен CA, который не был получен из файл pfx.

1 Ответ

0 голосов
/ 13 марта 2020

Bank-ID предоставил CA в виде текста в своей документации. Начиная с "----- BEGIN CERTIFICATE" ... я скопировал текст в pem-файл и сослался на него из моего индекса. js -файл такой:

agentOptions: {
    pfx: fs.readFileSync('bankidtest.pfx'),
    passphrase: '*****',
    ca: fs.readFileSync('certificate.pem')
},
...