Fetchmail через imaps. Добавляем корневой сертификат.

Для настройки fetchmail для работы с ssl просто необходимо только добавить в конце описания пула options ssl. Но если у вас нету корневого сертификата сервера, то не будет производится авторизация сервера по сертификату, а в этом случае возможно что узел с котором мы связываемся на самом деле не тот за кого себя выдаёт. Для того что-бы fetchmail проводил авторизацию узла по сертификату необходимо добавить сертификат и указать опции sslcertck , sslcertpath путь_к_каталогу_с_сертификатами . Но с начала этот сертификат надо достать :) . Для этого можно воспользоваться каким то другим почтовым клиентом вроде Thunderbird, но это как-то некрасиво. Намного удобнее для этого воспользоваться утилитой s_client из пакета openssl. Эта утилита некий аналог telnet (или даже netcat) только с поддержкой ssl. Просмотреть список параметров которыеіе она принимает можно набрав openssl s_client —help (или -h)
$ openssl s_client --help
usage: s_client args
-host host - use -connect instead
-port port - use -connect instead
-connect host:port - who to connect to (default is localhost:4433)
-verify depth - turn on peer certificate verification
-cert arg - certificate file to use, PEM format assumed
-certform arg - certificate format (PEM or DER) PEM default
-key arg - Private key file to use, in cert file if
not specified but cert file is.
-keyform arg - key format (PEM or DER) PEM default
-pass arg - private key file pass phrase source
-CApath arg - PEM format directory of CA's
-CAfile arg - PEM format file of CA's
-reconnect - Drop and re-make the connection with the same Session-ID
-pause - sleep(1) after each read(2) and write(2) system call
-showcerts - show all certificates in the chain
-debug - extra output
-msg - Show protocol messages
-nbio_test - more ssl protocol testing
-state - print the 'ssl' states
-nbio - Run with non-blocking IO
-crlf - convert LF from terminal into CRLF
-quiet - no s_client output
-ign_eof - ignore input eof (default when -quiet)
-no_ign_eof - don't ignore input eof
-ssl2 - just use SSLv2
-ssl3 - just use SSLv3
-tls1 - just use TLSv1
-dtls1 - just use DTLSv1
-mtu - set the MTU
-no_tls1/-no_ssl3/-no_ssl2 - turn off that protocol
-bugs - Switch on all SSL implementation bug workarounds
-serverpref - Use server's cipher preferences (only SSLv2)
-cipher - preferred cipher to use, use the 'openssl ciphers'
command to see what is available
-starttls prot - use the STARTTLS command before starting TLS
for those protocols that support it, where
'prot' defines which one to assume. Currently,
only "smtp", "pop3", "imap", "ftp" and "xmpp"
are supported.
-engine id - Initialise and use the specified engine
-rand file:file:...
-sess_out arg - file to write SSL session to
-sess_in arg - file to read SSL session from
-servername host - Set TLS extension servername in ClientHello
-tlsextdebug - hex dump of all TLS extensions received
-status - request certificate status from server
-no_ticket - disable use of RFC4507bis session tickets


Например чтобы соединится к узлу exemple.com на порт 443 надо набрать такую команду.
$ openssl s_client -connect example.com:443
В случае если ключ самоподписанный вы увидите что вроде такого:
depth=0 /C=UA/ST=Country/L=Country/O=Example Ltd/OU=Example/CN=example.com/emailAddress=admin@example.com
verify error:num=18:self signed certificate
verify return:1
depth=0 /C=UA/ST=Country/L=Country/O=Example Ltd/OU=Example/CN=example.com/emailAddress=admin@example.com

В этом случае надо скачать публичный ключ который передаёт сервер и добавить к списку доверенных. Публичный ключ в выводе утилиты s_client находится между строками «——BEGIN CERTIFICATE——» и «——END CERTIFICATE——» . Его необходимо скопировать в файл включая эти строки. Это можно сделать перенаправив вывод команды s_locate в файл и потом его редактируя любимым текстовым редактором либо обработав вывод с помощью sed.
$ openssl s_client -connect exemple.com:993 | sed -n '/^-----/,/^-----/p;/-----E/q' > example.pem
^C

После этого можно просмотреть параметры сертификата.
$ openssl x509 -noout -text -in example.pem
И теперь можно посмотреть как будет проходить авторизация узла по сертификату.
$ openssl s_client -connect example.com:993 -CAfile example.pem

Если в начале вывода содержится примерно вот такой текст , тогда узел прошел проверку.
CONNECTED(00000003)
depth=0 /C=UA/ST=State/L=City/O=Example Ltd/OU=Example/CN=example.com/emailAddress=admin@exmaple.com
verify return:1
---

Теперь давайте создадим каталог в котором будут хранится сертификаты .
$ mkdir ~/.certs
$ cp example.pem ~/.certs/
$ cd ~/.certs
$ c_rehash ./

Теперь необходимо проверить опять или проходит узел авторизацию но уже указав вместо файла с сертификатом каталог с сертификатами.
$ openssl s_client -connect example.com:993 -CApath /home/user/.certs/

Ответ должен быть такой-же как в прошлый раз .
Теперь можно настраивать fetchmail для работы с сервером. Настройки приблизительно будут выглядеть так:
defaults protocol pop3,
timeout 60,
fetchall,
no keep,

poll example.com proto imap
user "user" , with password пароль , is "user@example.com" here, options ssl
sslcertck sslcertpath /home/user/.certs/ ;

Если вы используете не imap а pop3 тогда в конфиге вместо него должно быть pop3 и брать сертификат надо будет не с 993 порта а с 995.
В случае если сертификат сервера подписан каким-то другим сертификатом тогда надо добавить его. Рассмотрим это на примере gmail.
$ openssl s_client -connect imap.gmail.com:993 | sed -n '/^-----/,/^-----/p;/-----E/q' > gmail.pem
^C

Как видно он подписан другим сертификатом.
$ openssl x509 -noout -text -in example.pem
Certificate:
Data:
Version: 3 (0x2)
Serial Number:
28:d5:60:f1:00:00:00:00:07:7f
Signature Algorithm: sha1WithRSAEncryption
Issuer: C=US, O=Google Inc, CN=Google Internet Authority
Validity
Not Before: Mar 12 20:23:41 2009 GMT
Not After : Mar 12 20:33:41 2010 GMT
Subject: C=US, ST=California, L=Mountain View, O=Google Inc, CN=imap.gmail.com
Subject Public Key Info:
Public Key Algorithm: rsaEncryption
RSA Public Key: (1024 bit)
Modulus (1024 bit):
00:a3:57:03:84:38:60:48:dd:cc:f4:3a:3a:0f:8e:
7d:9d:23:71:65:6d:5f:4c:f2:55:e6:b9:89:72:db:
75:db:36:70:0d:30:5b:1e:a5:a5:66:c2:b5:66:f7:
15:d6:78:23:d6:76:20:67:b4:57:66:68:02:b3:11:
14:48:af:ec:c3:ef:f9:3a:d9:7a:06:92:b7:38:b1:
59:23:95:3f:16:63:14:4e:cb:06:e7:cf:07:b2:5d:
b5:48:1c:5e:2b:b4:68:02:0c:71:33:6b:c1:d8:98:
22:dc:a1:fe:13:5d:e6:96:05:17:94:2c:ab:7a:19:
db:6d:39:70:12:8b:14:47:25
Exponent: 65537 (0x10001)
X509v3 extensions:
X509v3 Subject Key Identifier:
D8:97:C3:B3:EC:E8:F5:B3:17:CD:15:AF:16:1B:CF:AD:EE:71:50:2B
X509v3 Authority Key Identifier:
keyid:BF:C0:30:EB:F5:43:11:3E:67:BA:9E:91:FB:FC:6A:DA:E3:6B:12:24

X509v3 CRL Distribution Points:
URI:http://crl.ext.google.com/GoogleInternetAuthority.crl

Authority Information Access:
CA Issuers - URI:http://ca.ext.google.com/GoogleInternetAuthority.crt

1.3.6.1.4.1.311.20.2:
...W.e.b.S.e.r.v.e.r
Signature Algorithm: sha1WithRSAEncryption
ba:3b:7c:2c:dc:71:bf:b4:39:e5:3e:88:63:c9:fc:21:32:9d:
32:1e:82:2a:ad:fc:e9:19:3c:fe:0f:69:5c:bb:6b:43:23:c0:
ae:e6:0c:36:29:30:cb:b5:d2:be:28:61:23:3c:88:8d:41:37:
68:88:5d:11:43:92:ea:20:a7:8f:32:7a:1f:0f:dc:89:f5:03:
7d:f6:5d:d5:b7:52:86:a8:22:12:3c:0e:e9:cb:5e:07:c1:12:
bd:bf:4c:f5:07:b5:70:df:26:e9:ae:fb:00:a8:8d:d8:d3:db:
2c:30:b9:dd:61:63:c2:d2:45:1d:b3:bf:6e:c5:58:40:03:39:
a4:61

Теперь можно взять сертификат которым подписан данный (то есть тот который находится по адресу http://ca.ext.google.com/GoogleInternetAuthority.crt)
$ wget -O gmail2.pem `openssl x509 -noout -text -in gmail.crt | grep CA | gawk '{match($0,/(http.*)$/,arr); print arr[1]}'`
Или
$ wget -O gmail2.pem `openssl x509 -noout -text -in gmail.crt | grep CA | grep -oe 'http.*$'`
Или-же
$ wget -O gmail2.pem 'http://ca.ext.google.com/GoogleInternetAuthority.crt'
Следующий сертификат может ссылатся ещё на один и так далее (хотя обычно максимальная длина цепочки сертификатов ограничена параметром depth ).
Увидеть цепочку сертификатов можно и по-другому например использовав утилиту s_client с опцией -showcerts.
$ openssl s_client -connect imap.gmail.com:993 -showcerts
В данном случае вы увидите два сертификата но из может быть и больше (первый тот который мы сохранили как gmail.pem, а второй gmail2.pem).
Иногда бывает полезным чтобы не тратить время на скачивание каждого сертификата сохранить самый последний.
$ echo QUIT| openssl s_client -connect imap.gmail.com:993 -showcerts | sed -n '/^-----B/,/^-----E/p' | sed '1p;/^--*B/,/^--*B/d'
Как видно этот сертификат подписан другим но ссылки на него нет.
$ openssl x509 -noout -text -in gmail2.pem
Certificate:
Data:
Version: 3 (0x2)
Serial Number: 432304 (0x698b0)
Signature Algorithm: sha1WithRSAEncryption
Issuer: C=US, O=Equifax, OU=Equifax Secure Certificate Authority
Validity
Not Before: Dec 5 22:38:00 2006 GMT
Not After : Jun 20 21:38:00 2010 GMT
Subject: C=US, O=Google Inc, CN=Google Internet Authority
Subject Public Key Info:
Public Key Algorithm: rsaEncryption
RSA Public Key: (1024 bit)
Modulus (1024 bit):
00:c9:ed:b7:a4:8b:9c:57:e7:84:3e:40:7d:84:f4:
8f:d1:71:63:53:99:e7:79:74:14:af:44:99:33:20:
92:8d:7b:e5:28:0c:ba:ad:6c:49:7e:83:5f:34:59:
4e:0a:7a:30:cd:d0:d7:c4:57:45:ed:d5:aa:d6:73:
26:ce:ad:32:13:b8:d7:0f:1d:3b:df:dd:dc:08:36:
a8:6f:51:44:9b:ca:d6:20:52:73:b7:26:87:35:6a:
db:a9:e5:d4:59:a5:2b:fc:67:19:39:fa:93:18:18:
6c:de:dd:25:8a:0e:33:14:47:c2:ef:01:50:79:e4:
fd:69:d1:a7:c0:ac:e2:57:6f
Exponent: 65537 (0x10001)
X509v3 extensions:
X509v3 Key Usage: critical
Certificate Sign, CRL Sign
X509v3 Subject Key Identifier:
BF:C0:30:EB:F5:43:11:3E:67:BA:9E:91:FB:FC:6A:DA:E3:6B:12:24
X509v3 Authority Key Identifier:
keyid:48:E6:68:F9:2B:D2:B2:95:D7:47:D8:23:20:10:4F:33:98:90:9F:D4

X509v3 Basic Constraints: critical
CA:TRUE, pathlen:0
X509v3 CRL Distribution Points:
URI:http://crl.geotrust.com/crls/secureca.crl

Signature Algorithm: sha1WithRSAEncryption
51:c5:08:8c:ef:3d:16:8d:3d:d5:ec:9d:66:67:de:02:4a:a8:
b5:2b:ed:54:42:0f:9b:87:fe:07:6d:a0:bf:9b:08:17:c4:bc:
c6:42:fb:cf:6e:03:53:b1:26:3d:af:d1:98:5b:e7:01:96:13:
46:91:c7:06:76:0d:bb:e6:74:ed:df:75:f5:6f:1a:99:6d:66:
98:f2:59:b8:0b:d6:62:56:67:68:47:09:3b:55:85:f9:d7:ee:
e8:57:a7:ee:6b:0c:0d:42:22:42:b8:1a:be:26:c6:84:03:60:
96:eb:66:92:c1:e1:85:ab:87:05:1d:75:88:ca:db:40:b9:5d:
c8:b5

Он подписан сертификатом «Equifax Secure Certificate Authority». Этот сертификат есть один из рутовых (то есть главных). Рутовые сертификаты часто идут вместе с программным обеспечением которое использует SSL. Например в Firefox рутовые сертификаты можно посмотреть нажав Правка->Настройка->Просмотр Сертификатов->Центры Сертификации . Во многих случаях (в зависимости от операционной системы и дистрибутива) рутовые сертификаты идут вместе с OpenSSL, и находятся чаще всего в /etc/ssl/certs/ или /usr/share/ssl/certs/ . Если у вас OpenSSL идёт вместе с рутовыми сертификатами тогда вам повезло и в случае если сертификат сервера подписан одним из таких сертификатов то скачивать никаких сертификатов вообще не надо надо лишь в настройках fetchmail указать путь к ним.
То есть конфиг будет примерно таким:
defaults protocol pop3,
timeout 60,
fetchall,
no keep,

poll example.com proto imap
user "user" , with password пароль , is "user@example.com" here, options ssl
sslcertck sslcertpath /etc/ssl/certs/ ;

В случае если у вас OpennSSL идёт без рутовых сертификатов или некоторых нету тогда вам необходимо добавить самостоятельно. Например сертификат которым подписан imap сервер gmail называется «Equifax Secure Certificate Authority» можно найти на этой странице https://www.geotrust.com/resources/root-certificates/index.html или прямая ссылка. Или так
$ wget https://www.geotrust.com/resources/root_certificates/certificates/Equifax_Secure_Certificate_Authority.cer
Скачивать надо сертификаты закодированные в base-64 (не DER сертификаты).
Также иногда организации заводят собственный рутовый сертификат и подписывают ним все свои сервера , в этом случае вы должны получить публичный ключ данного сертификата (как правила организации в этом случае сами раздают их клиентам) и положит в каталог ко всем ключам.
После добавления ключей в каталог где они будут хранится надо сделать
$ c_rehash
Теперь можно проверить из с помощью утилиты s_client как было показано раньше и добавить в свой конфиг fetchmail .
Также в конфиге fetchmail можно задать опцию sslfingerprint (хеш сертификата который может быть вычислен так openssl x509 -in cert.pem -noout -md5 -fingerprint ).

Запись опубликована в рубрике Без рубрики с метками , . Добавьте в закладки постоянную ссылку.

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *

Можно использовать следующие HTML-теги и атрибуты: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>