Как использовать взаимный SSL с тестовой средой Mocha/Chai(chai-http) в приложении Node.js

Я разрабатываю приложение, использующее взаимную аутентификацию SSL, и хочу написать автоматический тест для оценки функциональности.

Я уже реализовал сервер и могу протестировать его с помощью Postman. Этот пост работает хорошо.

В моем тесте мокко я написал этот запрос:

chai.request(getServer())
    .post('/users')
    .ca(fs.readFileSync(path.join(process.cwd(), 'test', 'ca-crt.pem'), 'utf-8'))
    .cert(path.join(process.cwd(), 'test', 'client1-key.pem'), 'utf-8'))
    .key(path.join(process.cwd(), 'test', 'client1-crt'), 'utf-8'))
    .send(userToCreate)
    .end((error, response) => {
         if (error !== null) {
             reject(`User creation error : ${JSON.stringify(error)}`);
         } else if (response.status !== 201) {
             reject(`User creation failed : ${JSON.stringify(response.status)}`);
         } else {
             resolve(response.body);
         }
    });

Но этот запрос не отправляет сертификат на сервер:

  • request.socket.authorized = не определено

Я пытался использовать агент HTTPS:

let agent = new Agent({
    ca: fs.readFileSync(path.join(process.cwd(), 'test', 'ca-crt.pem'), 'utf-8'),
    key: fs.readFileSync(path.join(process.cwd(), 'test', 'client1-key.pem'), 'utf-8'),
    cert: fs.readFileSync(path.join(process.cwd(), 'test', 'client1-crt.pem'), 'utf-8')
});
chai.request(getServer())
    .post('/users')
    .agent(agent)
    .send(userToCreate)
    .end((error, response) => {
         if (error !== null) {
             reject(`User creation error : ${JSON.stringify(error)}`);
         } else if (response.status !== 201) {
             reject(`User creation failed : ${JSON.stringify(response.status)}`);
         } else {
             resolve(response.body);
         }
    });

Но этот запрос не отправляет сертификат на сервер:

  • request.socket.authorized = не определено
  • Я получаю исключение ERR_INVALID_PROTOCOL в тесте мокко

Может ли кто-нибудь помочь мне, пожалуйста?


person E.David    schedule 17.01.2020    source источник


Ответы (1)


Наконец-то я решил эту проблему, используя суперагент напрямую вместо chai-http. Несмотря на то, что chai-http использует суперагент, похоже, что в реализации пропущены методы ca, cert и key. Итак, приведенный ниже синтаксис решил проблему для меня:

superAgent
    .post('http:/localhost/users')
    .ca(fs.readFileSync(path.join(process.cwd(), 'test', 'ca-crt.pem'), 'utf-8'))
    .cert(fs.readFileSync(path.join(process.cwd(), 'test', 'client1-key.pem'), 'utf-8'))
    .key(fs.readFileSync(path.join(process.cwd(), 'test', 'client1-crt'), 'utf-8'))
    .send(sentBody)
    .end((error, response) => {
        if (error !== null) {
            reject(`User creation error : ${JSON.stringify(error)});
        } else if (response.status !== 201) {
            reject(`User creation failed : ${JSON.stringify(response.status)});
        } else {
            resolve(response.body);
        }
    }
});
person E.David    schedule 06.02.2020