Autenticação de certificado do Dovecot

6

Depois de implementar a autenticação de certificado no servidor da Web Nginx, gostaria de fazer o mesmo no servidor de email Dovecot. A ideia é criar sua própria autoridade de certificação e gerenciar certificados (emitindo e revogando). Para verificar o certificado do cliente, você precisa do certificado de CA raiz e da CRL. Para estabelecer uma conexão segura, um certificado assinado por uma autoridade de certificação verdadeira pode ser usado (se você não quiser importar seu próprio certificado de CA raiz em todas as estações de trabalho).

Até agora, eu li essas páginas do wiki oficial da Dovecot:

  1. link
  2. link

O que me levou a este arquivo de configuração:

listen = *,[::]
protocols = imap pop3
auth_mechanisms = plain login
disable_plaintext_auth = no
log_timestamp = "%Y-%m-%d %H:%M:%S "
mail_privileged_group = vmail
ssl = required
ssl_cert = </etc/postfix/smtpd.cert
ssl_key = </etc/postfix/smtpd.key
ssl_ca = </etc/postfix/ca.pem
ssl_cert_username_field = emailAddress
ssl_verify_client_cert = yes
ssl_require_crl = yes
auth_ssl_require_client_cert = yes
ssl_username_from_cert = yes
passdb {
  args = /etc/dovecot/dovecot-sql.conf
  driver = sql
}
userdb {
  args = /etc/dovecot/dovecot-sql.conf
  driver = sql
}
plugin {
  quota = dict:user::file:/var/vmail/%d/%n/.quotausage
  sieve=/var/vmail/%d/%n/.sieve
}
service auth {
  unix_listener /var/spool/postfix/private/auth {
    group = postfix
    mode = 0660
    user = postfix
  }
  unix_listener auth-userdb {
    group = vmail
    mode = 0600
    user = vmail
  }
  user = root
}
service imap-login {
  client_limit = 1000
  process_limit = 500
}
protocol imap {
  mail_plugins = quota imap_quota
}
protocol pop3 {
  pop3_uidl_format = %08Xu%08Xv
  mail_plugins = quota
}
protocol lda {
  mail_plugins = sieve quota
}

O ca.pem, que é usado para validar certificados de clientes, é formatado de acordo com o segundo link acima e contém o certificado de CA raiz e a CRL, ambos no formato PEM. Além disso, o certificado e o par de chaves usados para estabelecer a conexão segura estão no formato PEM (embora as extensões sejam .cert e .key).

As configurações mencionadas no segundo link acima: ssl_username_from_cert = yes (que é usado em combinação com ssl_cert_username_field (cujo padrão é commonName) produz um erro:

doveconf: Fatal: Error in configuration file /etc/dovecot/dovecot.conf line 15: Unknown setting: ssl_username_from_cert
[....] Restarting IMAP/POP3 mail server: dovecotdoveconf: Fatal: Error in configuration file /etc/dovecot/dovecot.conf line 15: Unknown setting: ssl_username_from_cert
failed!

Comentando essa opção e reiniciando o Dovecot, não recebo erros de configuração, mas não está funcionando. Um teste de shell resulta em:

openssl s_client -connect mail.example.com:imaps
CONNECTED(00000003)

Isso é tudo.

Se eu comentar todas as linhas referentes à autenticação do certificado (toda a linha que começa com ssl, exceto ssl, ssl_cert e ssl_key, elas são usadas para permitir apenas conexões SSL / TLS seguras), funciona, mas recebo não autenticação de certificados.

As pesquisas no Google resultam na implementação de conexões SSL / TLS seguras (o que eu fiz até agora). Este guia , que explica exatamente o que eu quero fazer, não está terminado. Bem no arquivo de configuração do Dovecot, ele tem uma lista de tarefas.

Estou executando a versão 2.1.7 do Dovecot em um Linux Debian 7 (Wheezy) - atualmente a versão estável do Debian.

Qualquer ajuda é apreciada.

Observação: quero implementá-lo apenas para o protocolo IMAP.

EDIT 1:

Se você notar algo errado (má prática, insegura), por favor deixe um comentário!

Depois de alterar ssl_username_from_cert com auth_ssl_username_from_cert e reiniciar o Dovecot, tudo parece funcionar bem.

openssl s_client -connect mail.example.com:imaps
CONNECTED(00000003)
depth=0 description = XXXXXXXXXXXXXXXX, C = XX, CN = mail.example.com, emailAddress = [email protected]
verify error:num=20:unable to get local issuer certificate
verify return:1
depth=0 description = XXXXXXXXXXXXXXXX, C = XX, CN = mail.example.com, emailAddress = [email protected]
verify error:num=27:certificate not trusted
verify return:1
depth=0 description = XXXXXXXXXXXXXXXX, C = XX, CN = mail.example.com, emailAddress = [email protected]
verify error:num=21:unable to verify the first certificate
verify return:1
---
Certificate chain
 0 s:/description=XXXXXXXXXXXXXXXX/C=XX/CN=mail.example.com/[email protected]
   i:/C=XX/O=Company Ltd./OU=Some High Security Name/CN=Certificate Class
---
Server certificate
-----BEGIN CERTIFICATE-----
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
XXXXXXXX
-----END CERTIFICATE-----
subject=/description=XXXXXXXXXXXXXXXX/C=XX/CN=mail.example.com/[email protected]
issuer=/C=XX/O=Company Ltd./OU=Some High Security Name/CN=Certificate Class
---
Acceptable client certificate CA names
/C=XX/ST=Some-State/O=Another Company Ltd.
---
SSL handshake has read 3107 bytes and written 519 bytes
---
New, TLSv1/SSLv3, Cipher is DHE-RSA-AES256-GCM-SHA384
Server public key is 4096 bit
Secure Renegotiation IS supported
Compression: zlib compression
Expansion: zlib compression
SSL-Session:
    Protocol  : TLSv1.2
    Cipher    : DHE-RSA-AES256-GCM-SHA384
    Session-ID: XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
    Session-ID-ctx: 
    Master-Key: XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
    Key-Arg   : None
    PSK identity: None
    PSK identity hint: None
    SRP username: None
    TLS session ticket lifetime hint: 300 (seconds)
    TLS session ticket:
    0000 - XX XX XX XX XX XX XX XX-XX XX XX XX XX XX XX XX   XXXXXXXXXXXXXXXX
    0010 - XX XX XX XX XX XX XX XX-XX XX XX XX XX XX XX XX   XXXXXXXXXXXXXXXX
    0020 - XX XX XX XX XX XX XX XX-XX XX XX XX XX XX XX XX   XXXXXXXXXXXXXXXX
    0030 - XX XX XX XX XX XX XX XX-XX XX XX XX XX XX XX XX   XXXXXXXXXXXXXXXX
    0040 - XX XX XX XX XX XX XX XX-XX XX XX XX XX XX XX XX   XXXXXXXXXXXXXXXX
    0050 - XX XX XX XX XX XX XX XX-XX XX XX XX XX XX XX XX   XXXXXXXXXXXXXXXX
    0060 - XX XX XX XX XX XX XX XX-XX XX XX XX XX XX XX XX   XXXXXXXXXXXXXXXX
    0070 - XX XX XX XX XX XX XX XX-XX XX XX XX XX XX XX XX   XXXXXXXXXXXXXXXX
    0080 - XX XX XX XX XX XX XX XX-XX XX XX XX XX XX XX XX   XXXXXXXXXXXXXXXX
    0090 - XX XX XX XX XX XX XX XX-XX XX XX XX XX XX XX XX   XXXXXXXXXXXXXXXX

    Compression: 1 (zlib compression)
    Start Time: 1409206799
    Timeout   : 300 (sec)
    Verify return code: 21 (unable to verify the first certificate)
---
* OK [CAPABILITY IMAP4rev1 LITERAL+ SASL-IR LOGIN-REFERRALS ID ENABLE IDLE AUTH=PLAIN AUTH=LOGIN] Dovecot ready.

e

doveconf -a | grep ssl
auth_ssl_require_client_cert = yes
auth_ssl_username_from_cert = yes
imapc_ssl = no
imapc_ssl_ca_dir = 
imapc_ssl_verify = yes
pop3c_ssl = no
pop3c_ssl_ca_dir = 
pop3c_ssl_verify = yes
    ssl = no
    ssl = yes
    ssl = no
    ssl = yes
service ssl-params {
  executable = ssl-params
  unix_listener login/ssl-params {
ssl = required
ssl_ca = </etc/postfix/ca.pem
ssl_cert = </etc/postfix/smtpd.cert
ssl_cert_username_field = emailAddress
ssl_cipher_list = ALL:!LOW:!SSLv2:!EXP:!aNULL
ssl_client_cert = 
ssl_client_key = 
ssl_crypto_device = 
ssl_key = </etc/postfix/smtpd.key
ssl_key_password = 
ssl_parameters_regenerate = 1 weeks
ssl_protocols = !SSLv2
ssl_require_crl = yes
ssl_verify_client_cert = yes
verbose_ssl = no

Hora de experimentar. Eu importei um certificado de usuário para o Thunderbird e defini o método de autenticação: Certificado TLS. Mas quando tento me conectar, recebo a seguinte mensagem de erro:

The IMAP Server [email protected] does not support the selected authentication method. Please change the 'Authentication method' in the 'Account Settings | Server Settings'.

Nota: A autenticação por senha funciona (é claro, por meio de conexão segura TLS).

Estamos próximos.

    
por Daniel Iancu 27.08.2014 / 08:06

2 respostas

5

O wiki do Dovecot parece ter um erro, ou talvez o nome da configuração ssl_username_from_cert tenha mudado. No meu host Ubuntu com o Dovecot 2.2.9, em /etc/dovecot/conf.d/10-auth.conf, eu tenho:

# Take the username from client's SSL certificate, using 
# X509_NAME_get_text_by_NID() which returns the subject's DN's
# CommonName. 
#auth_ssl_username_from_cert = no

Portanto, parece que você precisa substituir ssl_username_from_cert por auth_ssl_username_from_cert , e o wiki precisa ser corrigido.

    
por 27.08.2014 / 08:55
2

Eu tive exatamente o mesmo problema.

Consegui fazer isso funcionar depois de ler as especificações e examinar a saída do registro bruto.

Você precisa ativar o método de autenticação external listando-o no valor da variável auth_mechanisms .

S: * OK [CAPABILITY IMAP4rev1 LITERAL+ SASL-IR LOGIN-REFERRALS ID ENABLE IDLE STARTTLS LOGINDISABLED] Dovecot ready.
C: 1 STARTTLS
S: 1 OK Begin TLS negotiation now.
C: 2 capability
S: CAPABILITY IMAP4rev1 LITERAL+ SASL-IR LOGIN-REFERRALS ID ENABLE IDLE AUTH=PLAIN AUTH=EXTERNAL
S: 2 OK Pre-login capabilities listed, post-login capabilities have more.

Se o Dovecot não responder com um recurso AUTH=EXTERNAL (dentro da saudação quando houver uma porta IMAPS ou após solicitação CAPABILITY do cliente, como mostrado acima), o Thunderbird desligará a conexão e apresentará uma mensagem de erro o servidor não suporta o registro em log com um certificado.

Caso contrário, prossegue com a autenticação.

C: 3 authenticate EXTERNAL bm9ib2R5QGV4YW1wbGUuY29t

Além disso, não se esqueça de incluir o nome de usuário no banco de dados do usuário.

    
por 21.10.2016 / 23:18