CryptodevATECCx08 Auth: различия между версиями

Нет описания правки
Строка 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>
18

правок