OpenSSL утилита: RSA encrypt/decrypt
04.08.2017

Давайте поиграемся с openssl утилиткой и RSA-криптингом...

За работу с RSA отвечают 3 команды внутри пакета openssl:

  • openssl genrsa: Генерирует приватный RSA ключ
  • openssl rsa: Управляет RSA ключом
  • openssl rsautl: encrypt/decrypt с помощью RSA

Сгенерируем ключ длиной 1024:

# openssl genrsa -out private.key 1024

Вытащим из приватного ключа открытый ключ:

# openssl rsa -in private.key -pubout > public.key

Подготовим 2 файлика для шифрования:

# dd if=/dev/zero of=data8 count=8 bs=1
# dd if=/dev/zero of=data200 count=200 bs=1

Важно упомянуть, что RSA может зашифровать только ограниченное число байт (для 2048-битного ключа это 256 байт). Для 1024-битного ключа и того меньше...

# openssl rsautl -encrypt -inkey public.key -pubin -in data8 > data8.enc
# openssl rsautl -encrypt -inkey public.key -pubin -in data200 > data200.enc
RSA operation error
140107901544096:error:0406D06E:rsa routines:RSA_padding_add_PKCS1_type_2:data too large for key size:rsa_pk1.c:151:

Расшифруем то, что зашифровали и сверим с исходником.

# openssl rsautl -decrypt -inkey private.key -in data8.enc -out data8.enc.dec
# md5sum data8 data8.enc.dec
7dea362b3fac8e00956a4952a3d4f474  data8
7dea362b3fac8e00956a4952a3d4f474  data8.enc.dec
# rm -f data8.enc*

Расшифровалось все нормально. Рассмотрим обратный процесс, когда шифруют приватным ключом, а расшифровывают публичным, он называется подписывание (sign/verify).

# openssl rsautl -sign -inkey private.key -in data8 > data8.enc
# openssl rsautl -verify -inkey public.key -pubin -in data8.enc -out data8.enc.dec
# md5sum data8 data8.enc.dec
7dea362b3fac8e00956a4952a3d4f474  data8
7dea362b3fac8e00956a4952a3d4f474  data8.enc.dec
# rm -f data8.enc*

Как видно, опять соблюдается целостность, только название операций поменялось с encrypt/decrypt на sign/verify. Такая разница объясняется практикой применения ключей. Подписывание обеспечивает целостность сообщения, а шифрование - безопасность передачи сообщения.

openssl s_client

Утилита предназначена для отладки https протокола. Давайте попробуем:

# echo "" | openssl s_client -servername ejz.ru -connect ejz.ru:443 -showcerts
Certificate chain
 0 s:/CN=ejz.ru
   i:/C=US/O=Let's Encrypt/CN=Let's Encrypt Authority X3
-----BEGIN CERTIFICATE-----
[...]
-----END CERTIFICATE-----
 1 s:/C=US/O=Let's Encrypt/CN=Let's Encrypt Authority X3
   i:/O=Digital Signature Trust Co./CN=DST Root CA X3
-----BEGIN CERTIFICATE-----
[...]
-----END CERTIFICATE-----

Параметр -servername отвечает за указание SNI. -showcerts покажет всю цепочку сертификатов. Скопируем первый сертификат в subject.pem, а второй в issuer.pem. Провалидируем их:

# openssl verify -CAfile issuer.pem subject.pem
subject.pem: OK
# openssl verify -CAfile /etc/ssl/certs/DST_Root_CA_X3.pem issuer.pem
issuer.pem: OK

Как видно из примера, корневой сертификат (что я нашел в системе) подписал промежуточный. А промежуточный подписал сертификат сайта.

Всего хорошего!

Теги → openssl rsa encrypt decrypt