Победил. ))
Может кому пригодится.
Исходные:
- Почтовый сервер на одной машине с биллингом, организовать на нем обработку невозможно.
Требуется:
Подписывать сообщение (само тело сообщения без заголовков) имеющимся сертификатом.
Решение:
- Для обработки сообщений ставим proxsmtp.
Конфигурация proxsmtp (может быть несколько конфигураций, для каждой должен быть файл /etc/proxsmtp/*.conf):
# cat billing.conf
Код:
Listen: 127.0.0.1:10025
MaxConnections: 64
OutAddress: 127.0.0.1:25
TransparentProxy: off
FilterCommand: /etc/proxsmtp/billing.sh
FilterType: file
Скрипт обработки:
# cat billing.sh
Код:
#! /bin/sh
#Будем подписывать только если отправитель - биллинг и есть вложения
if [ "$SENDER" = "billing@MyCompany.ru" ]; then
att=$( cat $EMAIL | grep "Content-Disposition: attachment;" )
if [ "qqq$att" != "qqq" ]; then
/etc/proxsmtp/sign $EMAIL
fi
fi
exit 0
Скрипт, который непосредственно подписывает сообщение:
# cat sign
Код:
#! /bin/sh
msg=$1
#Временные файлы
f_in=$( mktemp /tmp/in.XXXXXXXXXX )
f_line=$( mktemp /tmp/line.XXXXXXXXXX )
f_out=$( mktemp /tmp/out.XXXXXXXXXX )
#Найдем начало тела сообщения
n=$( cat $msg | awk '$0 ~ "MIME-Version: 1.0" { print NR }' )
#Сохраним отдельно тело сообщения
cat $msg | awk -v n_start=$n 'NR>=n_start { print $0 }' > $f_in
#И заголовки
cat $msg | awk -v n_start=$n 'NR<n_start { print $0 }' > $f_line
#Подпишем тело имеющимся сертификатом
openssl smime -sign -signer /etc/proxsmtp/mycert.pem -in $f_in -out $f_out
#Соберем сообщение из сохраненных заголовков + подписанное тело
cat $f_line > $msg
cat $f_out >> $msg
#Удаляем временные файлы
rm -f $f_in
rm -f $f_line
rm -f $f_out
В результате получается подписанное сообщение (вложен файл подписи, включает сертификат с публичным ключем).
Сообщения нормально открываются в MS Outlook Express и MS Outlook (если есть доверие к сертификату).
PS. В конфигурации сервера добавить строку
Код:
mail.properties.mail.smtp.port=10025
и перезапустить биллинг (достаточно сам процесс server).
PSS. Файл mycert.pem содержит сертификат + приватный ключ.
Т.е. формат:
Код:
-----BEGIN CERTIFICATE-----
*****
-----END CERTIFICATE-----
-----BEGIN RSA PRIVATE KEY-----
*****
-----END RSA PRIVATE KEY-----