Библиотека паспорта-самла неправильно расшифровывает saml EncryptedAssertion с помощью закрытого ключа дешифрования

У меня есть зашифрованный ответ/утверждение SAML 2.0, который мне нужно расшифровать. формат выглядит так:

<saml:EncryptedAssertion xmlns:saml="urn:oasis:names:tc:SAML:2.0:assertion">
    <xenc:EncryptedData Type="http://www.w3.org/2001/04/xmlenc#Element" xmlns:xenc="http://www.w3.org/2001/04/xmlenc#">
      <xenc:EncryptionMethod Algorithm="http://www.w3.org/2001/04/xmlenc#aes128-cbc"/>
      <ds:KeyInfo xmlns:ds="http://www.w3.org/2000/09/xmldsig#">
        <xenc:EncryptedKey>
          <xenc:EncryptionMethod Algorithm="http://www.w3.org/2001/04/xmlenc#rsa-oaep-mgf1p"/>
          <xenc:CipherData>
            <xenc:CipherValue>{some ciphers}</xenc:CipherValue>
          </xenc:CipherData>
        </xenc:EncryptedKey>
      </ds:KeyInfo>
      <xenc:CipherData>
        <xenc:CipherValue>{assertion body}</xenc:CipherValue>
    </xenc:CipherData>
    </xenc:EncryptedData>
</saml:EncryptedAssertion>

У меня также есть закрытый ключ дешифрования с таким форматом:

-----BEGIN RSA PRIVATE KEY-----
{mumbo jumbos}
-----END RSA PRIVATE KEY-----

Я попытался использовать инструменты расшифровки saml OneLogin, чтобы расшифровать зашифрованное утверждение SAML (копировать + вставить в это поле ввода), и это работает как шарм. https://www.samltool.com/decrypt.php

Однако, когда я попытался использовать nodejs, паспорт-самл для импорта файла закрытого ключа и попытаться расшифровать ответ, он получает «Недопустимый формат PEM», если я опускаю («----- НАЧАТЬ ----» или баннер "---END---"), либо возникает ошибка "Недопустимое заполнение RSAES-OAEP".

Это мой фрагмент кода:

const fs = require('fs');
const Promise = require('bluebird');
const path = require('path');
const forge = require('node-forge');
let pkey = fs.readFileSync(path.join(__dirname,'./myTestKey.pem'), 'utf8');
//let testKey = new Buffer(pkey).toString('base64');
let SAML = require('passport-saml/lib/passport-saml/saml.js');
let saml = new SAML({...,decryptionPvk: pkey });
let validatePostResponseAsync = Promise.promisify(saml.validatePostResponse);

validatePostResponseAsync(myResponse, pkey)
.then(response=>{
})
.catch(error=>{
 // it always throw error of the 2 mentioned above. 
})

Любое обходное решение будет оценено.


person WABBIT0111    schedule 19.04.2017    source источник
comment
@dlongley, что произойдет, если мой закрытый ключ будет в формате чистой строки ASCII/UTF8   -  person WABBIT0111    schedule 19.04.2017


Ответы (1)


Думаю, я понял это. для тех, кто борется с подобной проблемой, вы должны включить ---BEGIN RSA PRIVATE KEY--- и ---END RSA PRIVATE KEY---. библиотека node-forge, от которой зависит паспорт-самл, выдаст ошибку, если баннер не включен.

person WABBIT0111    schedule 19.04.2017