Как я могу предоставить сертификат SSL с помощью приложения create-react-app?
Я пытаюсь разместить приложение для реагирования, которое я создал и протестировал локально, используя шаблон facebook.
Клиентское приложение взаимодействует с API, который я создал с помощью node.js, и с которым у меня не возникало проблем с настройкой безопасного соединения (с клиентом node.js, отправляющим мой сертификат SSL, для тестирования).
Тем не менее, я сталкиваюсь с трудностями, когда дело доходит до использования реакции на отправку моего SSL-сертификата вместо самозаверяющего, что заставляет меня столкнуться с этой ошибкой, используя хром, и пытается получить доступ к https://example.net:3000:
Ваше соединение не является приватным (NET: ERR_CERT_AUTHORITY_INVALID)
Документация мне не очень помогла:
Обратите внимание, что сервер будет использовать самозаверяющий сертификат, поэтому ваш веб-браузер почти наверняка отобразит предупреждение при доступе к странице. https://github.com/facebookincubator/create-react-app/blob/master/packages/react-scripts/template/README.md#using-https-in-development
Как я могу использовать собственный SSL-сертификат (который я уже использую в другом приложении в своем домене и работает как шарм) вместо этого самозаверяющего? Я что-то пропустил?
Ответы
Ответ 1
Ваш сервер, который обслуживает файлы с этого порта, должен быть настроен на использование вашего сертификата SSL. Я предполагаю, что вы используете webpack-dev-server на этом порту (то, что npm start
делает в create-реагировать-app), и, возможно, другой сервер (apache, nginx и т.д.) На порту 80?
Вы можете либо обслуживать свои скомпилированные файлы, используя уже настроенный сервер, либо настроить webpack-dev-server для использования вашего сертификата SSL.
Для этого вы можете использовать опцию webpack-dev-server --cert
. См. Https://webpack.github.io/docs/webpack-dev-server.html.
Если вы хотите сделать это с помощью npm start, который вызывает собственный стартовый скрипт, вам придется отредактировать этот стартовый скрипт. Возможно, вам сначала потребуется использовать команду eject
, которая сбрасывает весь конфигурационный код в репозиторий, чтобы вы могли его изменить.
Вот исходный код стартового скрипта: https://github.com/facebookincubator/create-react-app/blob/master/packages/react-scripts/scripts/start.js#L230
Следует также отметить, что webpack-dev-server не предназначен для использования в производственной среде.
Повеселись!
Ответ 2
Извлечение create-react-app
не рекомендуется, так как вы не сможете легко обновить его. Кроме того, вы можете легко получить действительный сертификат SSL без извлечения.
Вам нужно будет скопировать ваш сертификат в node_modules/webpack-dev-server/ssl/server.pem
. Недостатком является то, что вам нужно вручную скопировать файл. Однако один из способов добиться этого - добавить скрипт postinstall
который создает символическую ссылку. Вот скрипт, который я создал:
#!/bin/bash
# With create-react-app, a self signed (therefore invalid) certificate is generated.
# 1. Create some folder in the root of your project
# 2. Copy your valid development certificate to this folder
# 3. Copy this file to the same folder
# 4. In you package.json, under 'scripts', add 'postinstall' script that runs this file.
# Every time a user runs npm install this script will make sure to copy the certificate to the
# correct location
TARGET_LOCATION="./node_modules/webpack-dev-server/ssl/server.pem"
SOURCE_LOCATION=$(pwd)/$(dirname "./local-certificate/server.pem")/server.pem
echo Linking ${TARGET_LOCATION} TO ${SOURCE_LOCATION}
rm -f ${TARGET_LOCATION} || true
ln -s ${SOURCE_LOCATION} ${TARGET_LOCATION}
chmod 400 ${TARGET_LOCATION} # after 30 days create-react-app tries to generate a new certificate and overwrites the existing one.
echo "Created server.pem symlink"
Ваш package.json
должен выглядеть примерно так:
"scripts": {
...
"postinstall": "sh ./scripts/link-certificate.sh"
}
- Мое решение основано на этой теме
Ответ 3
Подробнее о Elad:
- Создайте самозаверяющий сертификат, следуя инструкциям из https://github.com/webpack/webpack-dev-server/tree/master/examples/cli/https
- Сохраните файл pem (содержащий как сертификат, так и закрытый ключ) где-нибудь в вашем проекте (например,
/cert/server.pem
)
- Измените ваши сценарии package.json:
"start": "HTTPS=true react-scripts start",
"prestart": "rm ./node_modules/webpack-dev-server/ssl/server.pem && cp -f ./cert/server.pem ./node_modules/webpack-dev-server/ssl",
Ответ 4
Вот что я сделал:
bash <(wget -qO- https://gist.github.com/w35l3y/5bb7fe8508d576472136f35428019177/raw/local-cert-generator.sh)
Затем я дважды щелкнул и импортировал: rootCA.pem
и server.pem
Затем я изменил package.json
:
"start": "HTTPS=true react-scripts start",
"prestart": "cp -f /path/to/server.pem ./node_modules/webpack-dev-server/ssl",
Очень важные источники:
Ответ 5
Может ли кто-нибудь предоставить пример для последующего использования сертификата в React?
Я добавил .pem в указанный каталог, но как мне ссылаться на него в моем вызове API?
Я попробовал следующее различными способами, но не смог заставить его работать:
axios
.post(loginApi, body,
{
httpsAgent: new https.Agent({
ca: "test_certificate.pem"
})
}
)
.then(response => {
...
})
.catch(error => {
...
});
Как передать сертификат https-агенту? Нужно ли импортировать сертификат по его пути?
Я действительно новичок в этой теме, поэтому прошу прощения за отсутствие знаний.