:experimental: true
:source-highlighter: highlight.js

= Инструкция по настройке HTTP(S) для сервера АСМО в Linux

Если у вас отсутствует, то необходимо скачать пакет `openssl`.

Для работы через HTTPS агент использует ключ и сертификат в файле формата `PKCS12`. Сгенерировать этот файл можно с помощью `openssl`, для этого нужно:

Cгенерировать закрытый ключ можно с помощью следующей команды

[,shell]
----
openssl genrsa -out domain.key 2048
----
Ей необходимо передать имя файла ключа с помощью опции `-out`, например, `domain.key`.
Вы можете выбрать любое имя, оно не имеет значения. Если вы не укажете путь, то данный файл появится в этом же каталоге. Также можно указать размер ключа, например 2048. Если этого не сделать, то будет создан ключ размером 512 бит. Все ключи размером меньше 512 бит считаются *небезопасными*. После выполнения команды в выбранной папке появится файл ключа.

== Создание запроса на подпись

Для того чтобы получить сертификат, который можно использовать, нужно подписать только что полученный ключ. А для этого надо создать запрос на подпись с помощью следующей команды.

[,shell]
----
openssl req -key domain.key -new -out domain.csr
----

При создании запроса на подпись нужно указать необходимую информацию.
Обязательное поле здесь только одно – это *CN (_Common Name_)*.
Если вы хотите создать сертификат для сайта, то в этом поле нужно указать домен этого сайта. В этом примере будет создан сертификат для `localhost`.
Здесь должно быть указанно ваше доменное имя, для которого вы собираетесь использовать сертификат, также можно указать необязательную информацию о вашей компании, адресе, организации и т. п.

== Самоподписанный сертификат

Мы подпишем наш сертификат с помощью ключа, на основе которого он был создан:

[,shell]
----
openssl x509 -signkey domain.key -in domain.csr -req -days 365 -out domain.crt
----

С помощью параметра `-days` мы указываем, что сертификат будет действительным в течение 365 дней, то есть в течение года. Обратите внимание, что во время подписи проверяется CN, поэтому если вы не зададите этот параметр на этапе создания запроса на подпись, то ничего не заработает.

_Вы можете объединить всё в одну команду и сразу создать закрытый ключ, csr и подписанный сертификат:_
[,shell]
----
openssl req -newkey rsa:2048 -nodes -keyout domain.key -x509 -days 365 -out domain.crt
----

== Просмотр сертификатов

Сертификаты сохраняются в формате *PEM*, а это значит, что вы не сможете их открыть как текстовый файл и нужно использовать специальные команды для просмотра информации о них. Сначала смотрим содержимое CSR:
[,shell]
----
openssl req -text -noout -verify -in domain.csr
----

Следующим шагом используем консольную команду, с помощью которой мы можем преобразовать файл сертификата *PEM* (с расширениями `.pem`, `.cer` или `.crt`) вместе с его закрытым ключом (с расширением `.key`) в один файл *PKCS #12* (с расширениями `.p12` и `.pfx`):

[,shell]
----
openssl pkcs12 -inkey domain.key -in domain.crt -export -out certkey.p12
----
Само собой разумеется, поскольку *PKCS #12* является форматом, защищённым паролем, для выполнения всех вышеуказанных команд вам будет предложено ввести пароль, который использовался при создании файла `.pfx`. Ввод пароля будет невидимым. *_Пароль является обязательным параметром._*

=== Подключение контейнера с сертификатом к агенту
Открываем программу _AM Console_ на Windows, заходим в нужное подключение. Далее необходимо настроить конкретный агент. Для этого щёлкните стрелку кнопки <Редактировать INI-файл для выбранного сервера> на панели инструментов и выберите пункт <Настройки агентов (pha.conf)>.

image::edit_agent.png[align="center"]

Для подключения контейнера к агенту, нужно добавить в conf-файл агента параметр с именем `key_store` и значением в формате `<путь-к-файлу-контейнеру-p12>@<пароль-от-контейнера>`. 
Пример файла `pha.conf` для случая, когда файл `certkey.p12` находится в каталоге менеджера агентов:

[,shell]
----
...
key_store = certkey.p12@somepassword
----

=== Настройка http(s)-порта агента
Для приёма соединения и обработки https-запросов агенту нужен отдельный порт (обычно для https используется порт 443, для http – 80).
Активировать и настроить его можно с помощью параметра `https_port <номер-порта>` в секции `[agent]` файла `am.ini`:

[,ini]
----
[agent]
...
https_port=443
http_port=80
----
или, если не нужен автоматический запуск агента при обращении на этот порт, то передаём аргумент `--https_port <номер-порта>` командной строки агента:

[,ini]
----
[agent]
...
args=... --https_port 443
----

_Также важно обозначить:_ вы всё правильно настроили, но у вас не заходит по защищённому протоколу. Для этого можно перейти в log `.../log/ваш_id/ваш_id-date.log` и увидеть, что будет написано "Отказано в доступе" для файла `certkey.p12` , но при этом всем пользователям можно читать его и писать в него. Для этого вам нужно проставить всем папкам, которые находятся по уровням выше, вплоть до первой папки, атрибуты на чтение и запись. После этого у вас должно всё получиться. 

Если это не помогло, то можно попробовать сделать локальный проброс портов, потому что 80 и 443 попадают в специальный привилегированный диапазон номеров портов linux. Обычные пользователи, коим является пользователь *asmo*, не имеют прав на открытие порта в этом диапазоне номеров.

Для проброса портов необходимо использовать утилиту `iptables`. Предварительно необходимо установить её, если она ещё не установлена:

Для Debian
[,shell]
----
sudo apt-get install iptables
----

Перенаправление портов 80 -> 8000
[,shell]
----
sudo iptables -t nat -A PREROUTING -p tcp --dport 80 -j REDIRECT --to-port 8000
----
Для просмотра имеющихся цепочек необходимо выполнить команду:

[,shell]
----
sudo iptables -t nat -L
----
Такое перенаправление будет работать до следующей перезагрузки сервера.