Erreurs dans le journal système du serveur :

Feb  5 13:42:30 p400 dovecot: imap-login: SSL_accept() failed: 
 error:04077077:rsa routines:RSA_verify:wrong signature length [192.168.0.5]
Feb  5 13:42:30 p400 dovecot: imap-login: Disconnected: rip=192.168.0.5, 
 lip=192.168.0.2, TLS handshake

Pour obtenir plus d'infos, lançons Claws Mail en mode débogage :

claws-mail --debug > debug-claws-mail.log 2>&1

Une erreur se produit quand la connexion SSL est établie. Le certificat client semble illisible :

[14:21:36] IMAP4> 1 STARTTLS 
[14:21:36] IMAP4< 1 OK Begin TLS negotiation now. 
imap-thread.c:1174:imap starttls run - end 0
ssl_certificate.c:277:cert import failed: Base64 unexpected header error.
ssl_certificate.c:282:got cert! (nil)
ssl_certificate.c:307:key import failed: Base64 unexpected header error.
ssl_certificate.c:312:got key! (nil)
ssl_certificate.c:343:got p12! 0xa2f7e60
ssl_certificate.c:903:got p12
GNUTLS ERROR: A TLS fatal alert has been received.
imap-thread.c:1192:imap starttls run - can't tls_open
imap-thread.c:403:generic_cb
imap-thread.c:1217:imap starttls - end

Claws Email utilise une bibliothèque GnuTLS pour établir une connexion SSL :

ldd `which claws-mail` | grep tls
        libgnutls.so.26 => /usr/lib/libgnutls.so.26 (0xb6e0f000)
        libcurl-gnutls.so.4 => /usr/lib/libcurl-gnutls.so.4 (0xb67e9000)

Cette bibliothèque fait partie du paquet libgnutls26.

dpkg --search libgnutls.so
libgnutls26: /usr/lib/libgnutls.so.26
libgnutls26: /usr/lib/libgnutls.so.26.14.12

On remarque que certtool (paquet gnutls-bin) utilise la même bibliothèque :

ldd `which certtool` | grep libgnutls
        libgnutls.so.26 => /usr/lib/libgnutls.so.26 (0xb773d000)
        libgnutls-extra.so.26 => /usr/lib/libgnutls-extra.so.26 (0xb7736000)

L'utilitaire certtool peut-il lire le certificat client ?

certtool --p12-info --infile certif+clef.p12
certtool: p12_import: Base64 unexpected header error.

Non, et on trouve la même erreur que dans le fichier de débogage de Claws Mail. La même commande en plus détaillé :

certtool --debug 2 --p12-info --infile certif+clef.p12

Setting log level to 2
|<2>| ASSERT: x509_b64.c:452
|<2>| Could not find '-----BEGIN PKCS12'
|<2>| ASSERT: pkcs12.c:227
certtool: p12_import: Base64 unexpected header error.

On dirait que par défaut, cet outil essaye d'ouvrir un fichier PKCS #12 encodé en Base64, or le certificat est binaire.

Le paramètre --inraw permet cependant d'ouvrir le certificat :

certtool --p12-info --inraw --infile cert+clef.p12
Enter password: 
BAG #0
        Type: Encrypted

        Decrypting...
        Elements: 2
        Type: Certificate
(...)

Le certificat avait été créé avec openssl, qui peut le relire sans problème :

openssl pkcs12 -info -in certif+clef.p12 

Enter Import Password:
MAC Iteration 2048
MAC verified OK
(...)

Si on crée un certificat équivalent avec certtool, on obtient effectivement un fichier en Base64, précédé de l'en-tête BEGIN PKCS12 :

certtool --load-certificate certif.pem --load-privkey clef.pem --to-p12 --outfile certif+clef-gnutls.p12

Ce fichier est ensuite lisible avec certtool, mais openssl n'en veut pas. (Pour obtenir un fichier binaire avec certtool, il faut rajouter le paramètre --outder ou --outraw sur la ligne de commande ci-dessus.)

J'ai essayé d'utiliser ce certificat au format Base64 avec Claws Mail, mais ça ne fonctionne pas, même erreur Base64 que précédemment (cert import failed: Base64 unexpected header error).

Solutions :

1) Dans Claws Mail, utiliser un certificat client PKCS # 12 binaire généré avec certtool :

certtool --load-certificate certif.pem --load-privkey clef.pem --to-p12 --outder --outfile certif+clef-gnutls.p12

2) Dans Claws Mail, utiliser un couple certificat/clef au format PEM. Pour convertir :

openssl pkcs12 -in certif+clef.p12 -out certif+clef.pem -nodes

Plus de problème ensuite pour établir une connexion SSL avec un certificat client. Extrait du journal de Claws Email :

[19:17:47] IMAP4> 1 STARTTLS 
[19:17:47] IMAP4< 1 OK Begin TLS negotiation now. 
imap-thread.c:1174:imap starttls run - end 0
ssl_certificate.c:282:got cert! 0x9b19710
ssl_certificate.c:312:got key! 0x9b9c280
imap-thread.c:403:generic_cb
imap-thread.c:1217:imap starttls - end