#node.js #ssl
Вопрос:
Я запускаю сервер веб-API в Windows. Он использует сертификат и веб-API хоста на https.
Например, когда я помещаю URL-адрес ниже в браузере Chrome, он выдает список клиентов в виде массива JSON.
https://windows-hostname.xyz.com/api/customers
Кроме того, когда я помещаю этот URL-адрес в браузер Chrome на любых компьютерах в организации, он отлично работает и возвращает данные. Он НЕ выдает ошибку сертификата, поскольку используемый им сертификат является действительным сертификатом, выданным эмитентом сертификата компании.
Однако, когда я пишу программу Nodejs для доступа к одному и тому же URL-адресу. ЭТО выдает мне ошибку SSL
const superagent = require('superagent');
var baseUrl = 'https://windows-hostname.xyz.com';
superagent
.get(baseUrl "/api/customers")
.set("accept", "application/json")
.end(function(err, resp){
// throws ERROR - err = Error: unable to get local issuer certificate at TLSSocket.onConnectSecure
}
У меня установлен сертификат (запустите MMC на Windows server->Добавить/Удалить оснастки->>Выберите Сертификаты в левой панели->>>Добавить в правую панель->>>>Учетная запись компьютера ->>>>>>) в разделе >>>>>«Доверенные корневые центры сертификации»
Я мог бы щелкнуть правой кнопкой мыши на сертификате и экспортировать сертификат с помощью .Расширение CER (кодировка BASE-64). Я никак не мог экспортировать закрытый ключ.
Я изменил вышеуказанную программу, чтобы использовать этот экспортированный сертификат. Затем он выдает мне ошибку: не удалось получить сертификат локального эмитента в TLSSocket.onConnectSecure
const superagent = require('superagent');
var ca = fs.readFileSync('exported.cer');
var baseUrl = 'https://windows-hostname.xyz.com';
superagent
.get(baseUrl "/api/customers")
.set("accept", "application/json")
.ca(ca)
.end(function(err, resp){
// throws ERROR - err = Error: unable to get local issuer certificate at TLSSocket.onConnectSecure
}
Мой вопрос в том, как мне использовать этот экспортированный файл .Файл CER и напишите программу nodejs, которая может подключаться к этому веб-приложению без ошибок SSL?
Кроме того, я не должен игнорировать ошибку сертификата.
Спасибо, Атул
Комментарии:
1. Возможно, сервер не отправляет необходимые сертификаты цепочки, которые браузеры, такие как Chrome, могут «заполнить», но программное обеспечение, такое как nodejs, не может. Если у вас есть (или вы получаете) OpenSSL, попробуйте
openssl s_client -connect $hostname:443 -CAfile exported.cer <NUL:
(ниже 1.1.1 добавить-servername $hostname
) и посмотрите наVerify return code
строку в конце. Если это показывает аналогичную ошибку, добавьте-showcerts
, чтобы узнать, что на самом деле отправляет сервер, и либо (1) исправьте сервер, либо (2) извлеките отсутствующие сертификаты из вашего браузера(ов) или извлеките их, используя данные AIA в нижних сертификатах, и добавьте в файл, для которого они используютсяca
.2. PS: совершенно правильно, что ваша копия сертификата CA в «Надежных корнях» (или где-либо еще) не должна и не имеет закрытого ключа, поэтому вы не можете экспортировать его, потому что его там нет. Вы можете видеть на дисплеях Windows, что на его значке слева нет желтой клавиши (только круглая печать справа).
Ответ №1:
Спасибо @dave_thompson_085 за ваши усилия и помощь. Я мог бы решить эту проблему. это было не так уж трудно. В основном, когда я экспортировал сертификат в виде файла CER (кодировка BASE — 64), он не включает все сертификаты в цепочку сертификатов. Например, сертификат эмитента не был включен.
Поэтому я создал один экспортированный файл.CER, который объединяет все сертификаты в цепочке сертификатов, включая всех эмитентов сверху.
-----BEGIN CERTIFICATE-----
XXXXIszCCBpugAwIBAgITKQAANSmJkY5OfHmEGgAAAAA1AAAAAAAAAAABBBBBBBBB
YYYYMR33333333333333333333YD55555555555555555555LGQBGR11223344553
...
-----END CERTIFICATE-----
Bag Attributes: <Empty Attributes>
subject=DC = com, DC = xyz, DC = domain, CN = Company Root CA
issuer=DC = com, DC = xyz, DC = domain, CN = Company Root CA
-----BEGIN CERTIFICATE-----
XXXXYYYYYYYYYYwIBAgITKQAAN77777777777777777777TAN1111111111111111
YYYYMRMwEQYKCZImiZPyLG99999999999999999999ImiZPyLGQBGR11223344553
...
-----END CERTIFICATE-----
Bag Attributes: <Empty Attributes>
subject=DC = com, DC = xyz, DC = domain, CN = Issuer
issuer=DC = com, DC = xyz, DC = domain, CN = Company Root CA
-----BEGIN CERTIFICATE-----
XXXXYYYYYYYYYYwIBAgITKQAANSmJkY5OfHmEGgAAAAA1KTANBgkqhkiG9w0BAQsF
YYYYMRMwEQYKCZI00011111111111111111111111111111yLGQBGR11223344553
...
-----END CERTIFICATE-----
Теперь моя предыдущая программа работает, когда у меня есть .Файл CER, включающий все сертификаты в цепочке сертификатов.
Также мы можем использовать следующую команду openssl для получения всех сертификатов в цепочке.
openssl s_client -connect windows-hostname.xyz.com:443 -showcerts
Эта команда выдает 2 сертификата, а НЕ сертификат верхнего уровня. Я не уверен, что это все еще будет работать.
Проще всего щелкнуть правой кнопкой мыши и экспортировать все сертификаты в цепочке сертификатов и создать один файл.
Спасибо, Атул