18
правок
Xenols (обсуждение | вклад) |
Xenols (обсуждение | вклад) |
||
Строка 196: | Строка 196: | ||
Настройка nginx. | == Настройка nginx. == | ||
Допустим в интернете есть сервер, который должен обрабатывать запросы только от устройств обладающих сертификатами, | Допустим в интернете есть сервер, который должен обрабатывать запросы только от устройств обладающих сертификатами, | ||
Строка 259: | Строка 259: | ||
</body> | </body> | ||
</html> | </html> | ||
</pre> | |||
== Настройка openvpn == | |||
Для начала установим пакет: | |||
<pre> | |||
apt install openvpn | |||
</pre> | |||
Cоздадим файл req.cnf - он нам потребуется для создания сертификата сервера. | |||
<pre> | |||
[ v3_req ] | |||
basicConstraints = CA:FALSE | |||
keyUsage = nonRepudiation, digitalSignature, keyEncipherment | |||
extendedKeyUsage = serverAuth, clientAuth | |||
</pre> | |||
Серверу openvpn также требуется файл с параметрами DH, сделаем его. | |||
<pre> | |||
openssl dhparam -out dh2048.pem 2048 | |||
</pre> | |||
Создание данного файла может потребовать несколько минут. | |||
Далее сделаем приватный ключ нашего сервера и запрос на сертификат. Предполагаем, для примера, что | |||
сервер имеет имя example.com: | |||
<pre> | |||
openssl genrsa -out example.key 2048 | |||
openssl req -new -key example.key -subj "/CN=example.com" -out example.csr | |||
</pre> | |||
Подписываем запрос в нашем центре сертификации: | |||
<pre> | |||
openssl x509 -req -in example.csr -CA ca.crt -CAkey ca.key -out example.crt -days 365 -CAcreateserial -extfile req.cnf -extensions v3_req | |||
</pre> | |||
Теперь приступим к настройке openvpn сервера на машине example.com. | |||
Копируем файлы '''ca.crt''', '''example.crt''', '''example.key''' и '''dh2048.pem''' и редактируем файл конфигурации openvpn сервера. | |||
По умолчанию конфигурационный файл лежит в файле /etc/openvpn/server.conf | |||
<pre> | |||
port 1194 | |||
proto tcp | |||
dev tun | |||
ca /etc/openvpn/server/ca.crt | |||
cert /etc/openvpn/server/example.crt | |||
key /etc/openvpn/server/example.key | |||
dh /etc/openvpn/server/dh2048.pem | |||
topology subnet | |||
server 10.8.0.0 255.255.255.0 | |||
keepalive 10 60 | |||
key-direction 0 | |||
cipher AES-128-CBC | |||
auth SHA256 | |||
comp-lzo | |||
user nobody | |||
group nogroup | |||
persist-key | |||
persist-tun | |||
status /var/run/openvpn/openvpn-status.log | |||
management 127.0.0.1 7500 | |||
log-append /var/log/openvpn.log | |||
</pre> | |||
Добавим пользователя openvpn в группу i2c для доступа к криптоустройству: | |||
<pre> | |||
usermod -G www-data | |||
</pre> | |||
после этого запускаем сервер командой | |||
service openvpn start. | |||
Далее на контроллере создаем файл конфигурации клиента: | |||
client.ovpn: | |||
------------------------------------------------------------------------- | |||
client | |||
dev tun | |||
proto tcp | |||
remote example.com 1194 | |||
resolv-retry infinite | |||
nobind | |||
user openvpn | |||
'''group i2c''' | |||
persist-key | |||
persist-tun | |||
cipher AES-128-CBC | |||
auth SHA256 | |||
key-direction 1 | |||
keepalive 1 10 | |||
remote-cert-tls server | |||
comp-lzo | |||
------------------------------------------------------------------------- | |||
Обратите внимание на строчку group i2c. Она необходима для работы с криптоустройством. | |||
После этого запускаем клиента: | |||
<pre> | |||
openvpn --config example.ovpn --ca ca.crt --cert device_AP6V5MDG.crt --key engine:ateccx08:ATECCx08:00:04:C0:00 | |||
</pre> | |||
Если все хорошо, то в системе должен появиться интерфейс tun0 с адресом из подсети 10.8.0.0/24: | |||
<pre> | |||
tun0: flags=4305<UP,POINTOPOINT,RUNNING,NOARP,MULTICAST> mtu 1500 | |||
inet 10.8.0.2 netmask 255.255.255.0 destination 10.8.0.2 | |||
inet6 fe80::53b0:83f3:b1f5:b817 prefixlen 64 scopeid 0x20<link> | |||
unspec 00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00 txqueuelen 100 (UNSPEC) | |||
RX packets 0 bytes 0 (0.0 B) | |||
RX errors 0 dropped 0 overruns 0 frame 0 | |||
TX packets 6 bytes 288 (288.0 B) | |||
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0 | |||
</pre> | |||
Для проверки работоспособности запускаем ping: | |||
<pre> | |||
ping 10.8.0.1 | |||
PING 10.8.0.1 (10.8.0.1) 56(84) bytes of data. | |||
64 bytes from 10.8.0.1: icmp_seq=1 ttl=64 time=2.23 ms | |||
64 bytes from 10.8.0.1: icmp_seq=2 ttl=64 time=2.83 ms | |||
</pre> | |||
== Настройка mosquitto == | |||
Генерируем приватный ключ и запрос на сртификат: | |||
<pre> | |||
openssl genrsa -out example.key 2048 | |||
openssl req -new -key example.key -subj "/CN=example.com" -out example.csr | |||
</pre> | |||
Создаем сертификат сервера в CA. | |||
<pre> | |||
openssl x509 -req -in example.csr -CA ca.crt -CAkey ca.key -out example.crt -days 365 -CAcreateserial -extfile req.cnf -extensions v3_req | |||
</pre> | |||
Копируем файлы '''ca.crt''', '''mosquitto.crt''', '''mosquitto.key''' на сервер и редактируем файл конфигурации: | |||
/etc/mosquitto/conf.d/server.conf | |||
<pre> | |||
cafile /etc/mosquitto/ssl/ca.crt | |||
certfile /etc/mosquitto/ssl/mosquitto.crt | |||
keyfile /etc/mosquitto/ssl/mosquitto.key | |||
require_certificate true | |||
use_identity_as_username true | |||
</pre> | |||
Запускаем серис: | |||
<pre> | |||
service mosquitto start | |||
</pre> | |||
Также, если требуется, можно сделать чтобы локальный mosquitto сервер на контроллере | |||
форвардил некоторые топики на удаленный сервер. Для этого создаем файл бриджа: '''/etc/mosquitto/bridge.conf''' | |||
<pre> | |||
connection main | |||
topic test/# out | |||
address example.com:1883 | |||
bridge_cafile /etc/mosquitto/certs/ca.crt | |||
bridge_certfile /etc/mosquitto/certs/device_AP6V5MDG.crt | |||
bridge_keyfile engine:ateccx08:ATECCx08:00:04:C0:00 | |||
</pre> | |||
После перезапуска локального сервиса mosquitto топики /test/.. будут отправлятся на удаленный сервер example.com | |||
по защищенному ssl каналу. | |||
Примеры клиентских команд mosquitto. | |||
Отправка сообщения "message" в топик "test" на сервере example.com | |||
<pre> | |||
mosquitto_pub -h example.com --cert device_AP6V5MDG.crt --key 'engine:ateccx08:ATECCx08:00:04:C0:00' --cafile ca.crt -t "test" -m "message" | |||
</pre> | |||
Получение сообщений из топика "test" на сервере example.com | |||
<pre> | |||
mosquitto_sub -h example.com --cert device_AP6V5MDG.crt --key 'engine:ateccx08:ATECCx08:00:04:C0:00' -t "test" --cafile ca.crt | |||
</pre> | </pre> |
правок