Меню

Программисту

Суть асимметричного шифрования

Я использую TLS очень часто, как пользователь (Госуслуги, Диадок и т.д.) где зоопарк из всяких рутокенов, криптопрох и т.п., как администратор (доступ по SSH, установка сертификатов для Nginx), и как программист, когда например самописному SMTP серверу нужно добавить поддержку STARTLS или заглушить ругань PHP отключая проверку хоста:

curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);

Вот не втыкал я как оно работает, тупо следовал инструкциям и примерам, понимая только в общих чертах. А сегодня прочитал этот абзац в статье про SSL/TLS и всё встало на свои места: весь опыт и теория.

tls wiki

Суть асимметричного шифрования заключается в том, что используется пара ключей. Один из них используется в качестве открытого (как правило, он публикуется в самом сертификате владельца), второй ключ называется секретным — он держится в тайне и никогда никому не открывается. Оба ключа работают в паре: один используется для запуска противоположных функций другого ключа. Если открытый ключ используется для того, чтобы зашифровать данные, то расшифровать их можно только секретным ключом и наоборот. Такая взаимосвязь позволяет делать две важные вещи.

Любой пользователь может получить открытый ключ и использовать его для шифрования данных, расшифровать которые может только пользователь, владеющий секретным ключом. (RSA)

Если кто-то шифрует данные, используя свой секретный ключ, каждый может расшифровать эти данные, используя соответствующий открытый ключ. Именно это является основой для цифровых подписей. (DSA)

RSA — самый распространенный алгоритм шифрования с использованием асимметричных ключей.

Отправляем почту в PHP в 2019 опубликовал Shuchkin\SimpleMail

$mail = new Shuchkin\SimpleMail();
$mail->setFrom('example@example.com')
	->setTo('sergey.shuchkin@gmail.com')
	->setSubject('Test SimpleMail')
	->setText('Hi, Sergey!')
	->send();

Возможности

  1. Сборка письма цепочкой вызовов
  2. Расширенная поддержка встроенной функции mail
  3. Встроенный SMTP клиент (TLS)
  4. Фабричные методы, один раз указали метод отправки и почту отправителя, а дальше отправляем через копию этого базового объекта
  5. Передача файлов
  6. UTF-8
  7. Свои заголовки
  8. Свой метод отправки
  9. Экспорт в массив или JSON
  10. Импорт из массива или JSON

Установка

Залит на GitHub, см. больше примеров

https://github.com/shuchkin/simplemail

И, конечно, на Packagist:

$ composer require shuchkin/simplemail

Асинхронная отправка почты PHP — react-smtp-client

Мне не хватало в ReactPHP простого инструмента для асинхронной отправки почты, так появился react-smtp-client

$loop = \React\EventLoop\Factory::create();

// у меня установлен postfix, в котором есть локальный smtp сервер
$smtp = new \Shuchkin\ReactSMTP\Client( $loop ); // localhost:25

$smtp->send('info@example.org', 'sergey.shuchkin@gmail.com', 'Test ReactPHP mailer', 'Hello, Sergey!')->then(
	function() {
		echo 'Message sent'.PHP_EOL;
	},
	function ( \Exception $ex ) {
		echo 'SMTP error '.$ex->getCode().' '.$ex->getMessage().PHP_EOL;
	}
);

$loop->run();

Получился аналог mail() для фреймворка ReactPHP. Можно подключаться хоть к GMail:

$smtp = new \Shuchkin\ReactSMTP\Client( $loop, 'tls://smtp.google.com:465', 'username@gmail.com','password' );

хоть к серверу Яндекс.Почты:

$smtp = new \Shuchkin\ReactSMTP\Client( $loop, 'tls://smtp.yandex.ru:465', 'username@yandex.ru', '**password**' );

Устанавливается через composer

composer require shuchkin/react-smtp-client

SimpleCSV читаем, пишем CSV

Продолжаю вносить посильный вклад в опенсорс.
Исходники PHP-библиотеки для чтения/записи CSV можно забрать на GitHub

if ( $csv = SimpleCSV::import('book.csv') ) {
	print_r( $csv );
}

Можно установить через Composer

$ composer require shuchkin/simplecsv

Свой SMTP сервер для функции Email2SMS на ReactPHP

Дописал наконец-то сервер транслятор SMTP в HTTP API для smspilot.ru. ReactPHP очень крутой инструмент, с идеальным Promise API, но сцуко слишком бедный в плане качественных пакетов.

99% веб приложений нужно: слой работы с БД, http-клиент и отправка почты — SMTP-клиент. Так вот эти нужные пакеты для reactphp сделаны через жопу. Пришлось написать свои:

  1. smtp-сервер с авторизацией (LOGIN PLAIN CRAM-MD5)
  2. простой smtp-клиент, асинхронный аналог функции mail
  3. нормальный mysqli pool на MYSQL_ASYNC (есть такая штука в mysqlnd, там свой event-loop внутри)
  4. простой http-клиент c chunked и SSL (во всех проверенных либо не понравился интерфейс, либо что-то не работало)

Если будет интересно, то опубликую на github-е

SENDERR only (P)SUBSCRIBE / (P)UNSUBSCRIBE / PING / QUIT allowed in this context

Я ему

RPUSH mail_queue {email:info@example.com,text:test}
PUBLISH mail_channel send

он мне

ОК

а демон на reactphp такой
SUBSCRIBE mail_channel

получаю сообщение send по каналу mail_channel
и тут-же вызываю

LPOP mail

а redis мне

SENDERR only (P)SUBSCRIBE / (P)UNSUBSCRIBE / PING / QUIT allowed in this context

Оказывается Redis не разрешает использовать одно соединение для SUBSCRIBE и для работы с данными. Используйте отдельные соединения.