Извлечение корректного формата файлов ключа и сертификата из .p12 файла для SSL MEAN приложения?

Вопрос или проблема

Я пишу приложение 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:

  1. Извлечение закрытого ключа:

    openssl pkcs12 -in Certificates.p12 -nocerts -nodes -out key.pem

    Эта команда извлекает закрытый ключ из вашего файла .p12 и сохраняет его в формате PEM в файл key.pem.

  2. Извлечение сертификата:

    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 запросы.

Если после выполнения этих шагов возникнут проблемы с загрузкой страницы, убедитесь в следующем:

  1. Корректность конфигурационных файлов: Проверьте, чтобы пути к файлам ключа и сертификата были указаны правильно. Любая опечатка может привести к сложности при загрузке SSL.

  2. Логирование и отладка: Внимательно изучите логи сервера. Node.js обычно предоставляет полезные сообщения об ошибках, которые могут указать направление для поиска решения.

  3. Тестирование через другие браузеры и инструменты: Используйте различные браузеры или инструменты для тестирования, такие как curl, чтобы убедиться в том, что проблема не связана с одиночным браузером.

  4. Клиентские ресурсы и фаерволы: Убедитесь, что все ресурсы, которые запрашивает ваше приложение (например, CSS, JavaScript), доступны и не блокируются политиками безопасности браузера или серверными фаерволами.

Следуя описанным шагам и уделяя должное внимание деталям, вы сможете успешно настроить и использовать SSL в вашем приложении MEAN, обеспечив тем самым дополнительный уровень безопасности для пользователей вашего приложения.

Оцените материал
Добавить комментарий

Капча загружается...