Вопрос или проблема
Я пишу приложение MEAN для моего университетского факультета на моем Mac для разработки. Я начал с шаблона от mean.io. В файле конфигурации config/env/all.js
есть секция для настройки SSL:
https: {
port: false,
// Пути к ключу и сертификату в виде строки
ssl: {
key: '',
cert: ''
}
}
Я понимаю, что нужно изменить port:false
на порт, который я использую для SSL, port:443
, и указать пути к ключу и сертификату.
Шаги, которые я предпринял:
- создать директорию
ssl
в корне приложения - открыть Keychain Access на Mac
- в разделе
Certificates
слева, я щелкаю правой кнопкой мыши на выданный CA (DigiCert) сертификат моего факультета и выбираюExport
- сохранить как
Certificates.p12
вapp_root/ssl
- нажать OK, когда запрашивается пароль для защиты экспортируемого файла, чтобы пропустить этот шаг
Вот где я запутался. Согласно инструкциям, найденным здесь, пути должны вести к открытому ключу и сертификату. Как извлечь открытый ключ из этого файла Certificates.p12
, и как извлечь certificate
, чтобы приложение mean корректно его загрузило?
Дополнительные шаги, которые я предпринял, пробуя инструкции, найденные здесь:
генерация открытого ключа
cd ssl
openssl pkcs12 -in Certificates.p12 -nocerts -nodes | openssl rsa > id_rsa
openssl rsa -in id_rsa -pubout > pubkey.txt
генерация сертификата
openssl pkcs12 -in Certificates.p12 -clcerts -nokeys -out pubcert.txt
Затем я установил следующее:
https: {
port: 443,
// Пути к ключу и сертификату в виде строки
ssl: {
key: rootPath + '/ssl/pubkey.txt',
cert: rootPath + '/ssl/pubcert.txt'
}
}
При попытке запустить сервер я получаю следующую ошибку:
crypto.js:100
c.context.setKey(options.key);
^
Error: error:0906D06C:PEM routines:PEM_read_bio:no start line
at Object.exports.createCredentials (crypto.js:100:17)
at Server (tls.js:1127:28)
at new Server (https.js:35:14)
at Object.exports.createServer (https.js:54:10)
Любая помощь была бы замечательна!
После следования этому короткому руководству я попытался использовать приватный ключ моего сервера, а не публичный ключ.
генерация приватного ключа из Certificates.p12:
openssl pkcs12 -in Certificates.p12 -nocerts -nodes > key.pem
генерация публичного сертификата из Certificates.p12:
openssl pkcs12 -in Certificates.p12 -clcerts -nokeys > cert.pem
Затем я установил key: rootPath + '/ssl/key.pem'
и cert: rootPath + '/ssl/cert.pem'
И сервер успешно запустился. Я подключился через браузер к доменному имени моего факультета с https и используя назначенный мной порт https. Подключение прошло успешно, и был показан зеленый значок замка. HTML из app index.html был загружен, но ничего не выводится на экран — он просто продолжает загружаться. Консоль сервера зарегистрировала успешный GET-запрос с ответом 200 OK.
Ответ или решение
Для успешного извлечения ключа и сертификата из файла формата .p12 для использования в SSL конфигурации MEAN приложения, необходимо последовательно выполнить несколько шагов. Этот процесс включает использование OpenSSL для преобразования вашего сертификата и ключа в формат, подходящий для Node.js.
Теоретическая часть
Файл в формате .p12 (или PKCS#12) представляет собой контейнер, который может хранить несколько криптографических объектов, таких как сертификаты X.509 и закрытые ключи, и защищается паролем. Этот формат часто используется для переноса ключевых пар и сертификатов. В контексте SSL конфигурации Node.js приложения нужны отдельные файлы для закрытого ключа и сертификата, так как именно они необходимы для установки защищенного соединения.
Пример
Возьмем описание вашей проблемы. Удалось извлечь сертификат и ключ, следуя примерно следующей последовательности команд OpenSSL:
-
Извлечение закрытого ключа:
openssl pkcs12 -in Certificates.p12 -nocerts -nodes -out key.pem
Эта команда извлекает закрытый ключ из вашего файла .p12 и сохраняет его в формате PEM в файл
key.pem
. -
Извлечение сертификата:
openssl pkcs12 -in Certificates.p12 -clcerts -nokeys -out cert.pem
Здесь извлекается сертификат из файла .p12, который сохраняется в формате PEM в файл
cert.pem
.
В вашем случае проблема, скорее всего, связана с неверным использованием публичного ключа вместо закрытого ключа в конфигурации Node.js. Эти действия могут привести к ошибкам при инициализации SSL, так как Node.js требует закрытый ключ для выполнения криптографических операций.
Применение
Теперь, когда у вас есть файлы key.pem
и cert.pem
, вы можете указать их в конфигурационном файле вашего MEAN приложения в виде:
https: {
port: 443,
ssl: {
key: rootPath + '/ssl/key.pem',
cert: rootPath + '/ssl/cert.pem'
}
}
Этот подход должен устранить ошибки, связанные с неправильным форматом входных данных для SSL и позволит вашему серверу корректно обрабатывать HTTPS запросы.
Если после выполнения этих шагов возникнут проблемы с загрузкой страницы, убедитесь в следующем:
-
Корректность конфигурационных файлов: Проверьте, чтобы пути к файлам ключа и сертификата были указаны правильно. Любая опечатка может привести к сложности при загрузке SSL.
-
Логирование и отладка: Внимательно изучите логи сервера. Node.js обычно предоставляет полезные сообщения об ошибках, которые могут указать направление для поиска решения.
-
Тестирование через другие браузеры и инструменты: Используйте различные браузеры или инструменты для тестирования, такие как
curl
, чтобы убедиться в том, что проблема не связана с одиночным браузером. -
Клиентские ресурсы и фаерволы: Убедитесь, что все ресурсы, которые запрашивает ваше приложение (например, CSS, JavaScript), доступны и не блокируются политиками безопасности браузера или серверными фаерволами.
Следуя описанным шагам и уделяя должное внимание деталям, вы сможете успешно настроить и использовать SSL в вашем приложении MEAN, обеспечив тем самым дополнительный уровень безопасности для пользователей вашего приложения.