Предполагаем, что у нас есть доменное имя example.ru, наш email [email protected], имеющий права адиминистратора пользователь user. Сертификат может быть подключен только к доменному имени.
Предполагаем, что для доменного имени сделаны A Records, указывающие на IP сервера, на котором мы размещаем сайт.
Про работу с доменным именем для nginx можно почитать тут
Обычно для работы с веб используют специального пользователя
www-data. Про образцовую работу с пользователями можно посмотреть тут
Создаём папку под сайт с доменным именем. Даём пользователю права на полное использование папки, проверяем их присвоение, создаём тестовый index.html.
Неважно будем ли размещать итоговый сайт именно в этой папке: она нужна для описываемого способа получения сертификата.
sudo mkdir -p /var/www/example.ru/html
sudo chown -R user:user /var/www/example.ru/html
sudo chmod -R g+rw /var/www/example.ru/html
ls -la /var/www/example.ru/html
nano /var/www/example.ru/html/index.htmlСоздаём конфигурационный файл nginx для сайта.
sudo cp /etc/nginx/sites-available/default /etc/nginx/sites-available/example.ru
sudo nano /etc/nginx/sites-available/example.ruЕго содержание должно быть похоже на то, что приведено ниже
server {
listen 80;
listen [::]:80;
root /var/www/example.ru/html;
# Add index.php to the list if you are using PHP
index index.html;
server_name example.ru www.example.ru;
location / {
# First attempt to serve request as file, then
# as directory, then fall back to displaying a 404.
try_files $uri $uri/ =404;
}
}
Если подключится к сайту не получится, стоит проверить фаервол
sudo ufw statusи убедиться, что нужные порты открыты
sudo ln -s /etc/nginx/sites-available/example.ru /etc/nginx/sites-enabled/
sudo nginx -t
sudo systemctl restart nginx
sudo systemctl status nginx Проверяем подключение к сайту, переходя по доменному имени в браузере. В данном примере перейти нужно было бы по http://example.ru
Про установку см. тут
Из домашней папки выполнить
curl https://get.acme.sh | sh -s [email protected]Чтобы заработала команда acme.sh, надо открыть терминал заново.
Про получение сертификата тут
Предполагается, что уже работает веб-сервер (например, Apache или nginx) и по 80 порту отдаёт данные, например, из
/var/www/html
В конфигурационном файле сервера данные должны отдаваться через указанную в запросе ниже папку
У пользователя, который запрашивает сертификат, должны быть права на запись в папку!
sudo chown -R user:user /var/www/example.ru/html && sudo chmod -R g+rw /var/www/example.ru/html
acme.sh --issue -d example.ru -d www.example.ru -w /var/www/example.ru/htmlДолжны получить вот такое окончание
[Fri 27 Aug 2021 10:43:21 AM BST] Your cert is in: /root/.acme.sh/example.ru/example.ru.cer
[Fri 27 Aug 2021 10:43:21 AM BST] Your cert key is in: /root/.acme.sh/example.ru/example.ru.key
[Fri 27 Aug 2021 10:43:21 AM BST] The intermediate CA cert is in: /root/.acme.sh/example.ru/ca.cer
[Fri 27 Aug 2021 10:43:21 AM BST] And the full chain certs is there: /root/.acme.sh/example.ru/fullchain.cer
Про установку сертификата на nginx тут
Про Apache тут
Создадим папку для сертификата и переместим его туда
mkdir /etc/nginx/ssl
mkdir /etc/nginx/ssl/example.ru
sudo chown -R user:user /etc/nginx/ssl/example.ru/
sudo chmod -R g+rw /etc/nginx/ssl/example.ru/
# не уверен насчёт `sudo` в `sudo service nginx force-reload`
acme.sh --install-cert -d example.ru -d www.example.ru --key-file /etc/nginx/ssl/example.ru/example.ru.key --fullchain-file /etc/nginx/ssl/example.ru/example.ru.fullchain --cert-file /etc/nginx/ssl/example.ru/example.ru.cer --reloadcmd "sudo service nginx force-reload"Открываем конфигурационный файл sudo nano /etc/nginx/sites-available/example.ru и делаем его похожим на это.
server {
listen 80;
listen [::]:80;
listen 443 ssl;
listen [::]:443 ssl;
ssl_certificate /etc/nginx/ssl/example.ru/example.ru.cer;
ssl_certificate_key /etc/nginx/ssl/example.ru/example.ru.key;
root /var/www/example.ru/html;
# Add index.php to the list if you are using PHP
index index.html;
server_name example.ru www.example.ru;
location / {
# First attempt to serve request as file, then
# as directory, then fall back to displaying a 404.
try_files $uri $uri/ =404;
}
}
Проверяем корректность конфигурации.
sudo nginx -t
sudo systemctl restart nginx
sudo systemctl status nginx
sudo ufw allow 'Nginx Full'
Теперь при обращении по доменному имени можно использовать протокол HTTPS. В данном примере перейти нужно было бы по https://example.ru
Подробнее про редирект с HTTP на HTTPS тут
HTTP-прокотол теперь можно не использовать для обращения к сайту по доменному имени. Перенаправим запросы по HTTP на HTTPS. Открываем конфигурационный файл sudo nano /etc/nginx/sites-available/example.ru и делаем его похожим на это.
server {
listen 80;
listen [::]:80;
server_name example.ru www.example.ru;
return 301 https://$server_name$request_uri;
}
server {
listen 443 ssl;
listen [::]:443 ssl;
ssl_certificate /etc/nginx/ssl/example.ru/example.ru.fullchain; # exactly fullchain!
ssl_certificate_key /etc/nginx/ssl/example.ru/example.ru.key;
server_name example.ru www.example.ru;
root /var/www/example.ru/html;
# Add index.php to the list if you are using PHP
index index.html;
location / {
# First attempt to serve request as file, then
# as directory, then fall back to displaying a 404.
try_files $uri $uri/ =404;
}
}
Проверяем корректность конфигурации.
sudo nginx -t
sudo systemctl restart nginx
sudo systemctl status nginx
Теперь при обращении по доменному имени по протоколу HTTP запрос будет перенаправляться на HTTPS. В данном примере при переходе на http://example.ru открылась бы страница https://example.ru