2

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 を index.js と同じフォルダーに配置します。削除すると別のエラーが発生するため、アップロードされているようです。

Error: could not handle the request

編集1:

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: 半分は機能しています。request-parameter "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てから、これをindex.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: deprecated の代わりにこれらを試しまし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解決しました

pfx ファイルから派生したものではない CA が必要だったようです。

4

1 に答える 1