Доброго времени суток. На сервере стоит связка FreeBSD+apache+Courier-IMAP+MySQL+postfix+postfixadmin+fetchmail. На данном локальном почтовом сервере настроены виртуальные почтовые ящики. С помощью fetchmail данный сервер забирает почту по POP3 с внешних почтовых серверов, которые находятся на gmail.com, yandex.ru, mail.ru, rambler.ru, а затем пользователи с помощью почтовых клиентов забирают с него письма. Все работало нормально пока провайдеры не сделали обязательным SSL. Оно-то, конечно, безопасней, только вот в чем косяк... С mail, rambler и yandex почту fetchmail забирает без проблем, а вот gmail каждую неделю меняет SSL сертификаты и стабильно раз в неделю приходится их менять. Работу с сертификатами настраивал как написано здесь http://www.opennet.me/base/net/fetchmail_setup.txt.html; ПУНКТ: "Избавимся от предупреждений касающихся ssl сертификата." Как побороть сей недуг? Заранее спасибо.
Да, у gmail есть такая заморочка с сертификатами.
Меняют они его. Может боятся чего? трУсы.. ))Ладно, на хитрую опу есть чего-то там с винтом.
Можно (нужно?) просто тупа скачивать и устанавливать новый сертификат. А?
например (у вас пути в скрипте могут быть другие):
cat replace_cert.sh
#!/bin/sh# Удаляем все из директории /usr/local/etc/fetchmail/sslcerts/
/bin/rm -f /usr/local/etc/fetchmail/sslcerts/*# Получаем сертификат Gmail
/bin/echo | /usr/local/bin/openssl s_client -connect imap.gmail.com:993 -showcerts \
| /usr/bin/sed -n '/^-----/,/^-----/p;/-----E/q' > /usr/local/etc/fetchmail/sslcerts/gmail.pem# Скачиваем и получаем самый последний сертификат
/bin/echo | /usr/local/bin/openssl s_client -connect imap.gmail.com:993 -showcerts \
| /usr/bin/sed -n '/^-----B/,/^-----E/p' | /usr/bin/sed '1p;/^--*B/,/^--*B/d' > /usr/local/etc/fetchmail/sslcerts/gmail2.pem# Выполряем хеширование сертификата
c_rehash /usr/local/etc/fetchmail/sslcerts/# Получаем отпечаток ключа (fingerprint) сертификата
FINPR="$(/usr/local/bin/openssl x509 -in /usr/local/etc/fetchmail/sslcerts/gmail.pem -noout -md5 -fingerprint | sed 's/^.*=\(.*\)/\1/')"# Вставляем полученный отпечаток в файл
/usr/bin/sed -i "" 's/^sslfingerprint ".*"$/sslfingerprint "'$FINPR'"/' /usr/local/etc/fetchmailrc
#/usr/bin/sed -i "" 's/\([A-F0-9]\{2\}:\)\{15\}[A-F0-9]\{2\}/'$FINPR'/' /usr/local/etc/fetchmailrc
#/usr/bin/sed -i "" 's/"\(.*\)"/"'$FINPR'"/' /usr/local/etc/fetchmailrc# Перезапускаем fetchmail
/usr/local/etc/rc.d/fetchmail restartКидаем данный скрипт в /etc/crontab
@weekly root /usr/local/etc/scripts/replace_cert/replace_cert.sh >/dev/null 2>&
теперь пусть меняют себе на здоровье
А и еще почему необходимо?
# Получаем сертификат Gmail
/bin/echo | /usr/local/bin/openssl s_client -connect imap.gmail.com:993 -showcerts \
| /usr/bin/sed -n '/^-----/,/^-----/p;/-----E/q' > /usr/local/etc/fetchmail/sslcerts/gmail.pem# Скачиваем и получаем самый последний сертификат
/bin/echo | /usr/local/bin/openssl s_client -connect imap.gmail.com:993 -showcerts \
| /usr/bin/sed -n '/^-----B/,/^-----E/p' | /usr/bin/sed '1p;/^--*B/,/^--*B/d' > /usr/local/etc/fetchmail/sslcerts/gmail2.pem
почему нельзя получить сертификат
/bin/echo | /usr/local/bin/openssl s_client -connect imap.gmail.com:993 -showcerts \
| /usr/bin/sed -n '/^-----/,/^-----/p;/-----E/q' > /usr/local/etc/fetchmail/sslcerts/gmail.pemи сразу хешировать?
> А и еще почему необходимо?ну иногда нужен самый последний сертификат,
если это не ваш случай, то вам оно не нужно> почему нельзя получить сертификат и сразу хешировать?
можно, если не нужен последний (см. выше)
мне нужны оба сертификата и соответственно их хеши (обоих)
> # Удаляем все из директории /usr/local/etc/fetchmail/sslcerts/А почему вы решили, что здесь хранятся сертификаты?
Директории /usr/local/etc/fetchmail/ не существует.
По-дефолту конфиг fetchmail в /usr/local/etc/fetchmailrc
>> # Удаляем все из директории /usr/local/etc/fetchmail/sslcerts/
> А почему вы решили, что здесь хранятся сертификаты?
> Директории /usr/local/etc/fetchmail/ не существует.
> По-дефолту конфиг fetchmail в /usr/local/etc/fetchmailrcХых! ну у меня так, чтобы враги не догадались ))
ну это же не принципиально!
>>> # Удаляем все из директории /usr/local/etc/fetchmail/sslcerts/
>> А почему вы решили, что здесь хранятся сертификаты?
>> Директории /usr/local/etc/fetchmail/ не существует.
>> По-дефолту конфиг fetchmail в /usr/local/etc/fetchmailrc
> Хых! ну у меня так, чтобы враги не догадались ))
> ну это же не принципиально!И второе:
Если в /usr/local/etc/fetchmailrc описаны несколько аккаунтов, то будут проблемы с заменой fingerprint строк.
> Если в /usr/local/etc/fetchmailrc описаны несколько аккаунтов, то будут проблемы с заменой fingerprint строк.тогда никаких скриптов автоматизации, только хардкор,
тогда только руками скачивать, править и устанавливать, только врукопашную ((и всё же, почему будут прогблемы?
что, для каждой учетки свой сертификат и отпечаток, неужели?
>> Если в /usr/local/etc/fetchmailrc описаны несколько аккаунтов, то будут проблемы с заменой fingerprint строк.
> тогда никаких скриптов автоматизации, только хардкор,
> тогда только руками скачивать, править и устанавливать, только врукопашную ((
> и всё же, почему будут прогблемы?
> что, для каждой учетки свой сертификат и отпечаток, неужели?Ага. Сервера разные.
имхо, перед строкой fingerprint надо ставить комментарий-метку и по ней делать замену.
т.е. надо в лоб и других вариантов нет. Я понял Вас, спасибо. Еще вопрос. Я с скриптами на вы и кое-что не понятно например, что означает
'/^-----/,/^-----/p;/-----E/q'
'/^-----B/,/^-----E/p'
's/^.*=\(.*\)/\1/')
s/\([A-F0-9]\{2\}:\)\{15\}[A-F0-9]\{2\}/
s/"\(.*\)"/"'$FINPR'"/
/dev/null 2>&
> т.е. надо в лоб и других вариантов нет. Я понял Вас, спасибо.
> Еще вопрос. Я с скриптами на вы и кое-что не понятно
> например, что означает
> '/^-----/,/^-----/p;/-----E/q'
> '/^-----B/,/^-----E/p'
> 's/^.*=\(.*\)/\1/')
> s/\([A-F0-9]\{2\}:\)\{15\}[A-F0-9]\{2\}/
> s/"\(.*\)"/"'$FINPR'"/
> /dev/null 2>&Это называется потоковый редактор sed.
Добро пожаловать! ))с помощью него мы и редактируем полученный (скачиваемый) сертификат,
обрезая лишнее и оставляя только то, что нам необходимо.получаем отпечаток ключа, сохраняем его в переменной $FINPR,
ищем в файле fetchmailrc строку
sslfingerprint "DA:2F:CF:56:77:8B:D9:7F:D1:BC:1B:07:F1:27:C0:E8"
и заменяем в ней старый отпечаток на полученный новый.
После перезапускаем fetchmail,
чтобы он перечитал конфиг и знал про новый сертификат и отпечаток ключа.Вроде все.
А! это /dev/null 2>& - глушим выхлоп