2010-04-01 7 views
3

J'utilise OpenSSL pour construire des connexions sécurisées à smtp gmail.com:25~~V~~plural~~3rd. Donc, je peux me connecter avec succès au serveur et envoie une commande STARTTLS (je reçois 220 2.0.0 Prêt à démarrer TLS). Ensuite, exécutez le code suivant sans déconnecter:SMTP sur C: STARTTLS via OpenSSL

SSL_METHOD* method = NULL; 

SSL_library_init(); 
SSL_load_error_strings(); 

method = SSLv23_client_method(); 

ctx = SSL_CTX_new(method); 
if (ctx == NULL) 
{ 
    ERR_print_errors_fp(stderr); 
} 
SSL_CTX_set_options(ctx, SSL_OP_NO_SSLv2); 
ssl = SSL_new(ctx); 
if (!SSL_set_fd(ssl, socket)) 
{ 
     ERR_print_errors_fp(stderr); 
     return; 
} 
if (ssl) 
{ 

    if (SSL_connect((SSL*)ssl) < 1) 
    { 
     ERR_print_errors_fp(stderr); 
    } 
    // then i think i need to send EHLO 
} 

Mais après avoir appelé SSL_CONNECT je reçois une erreur:

24953:error:140770FC:SSL routines:SSL23_GET_SERVER_HELLO:unknown protocol:s23_clnt.c:601: 

Si je SSLv3_client_method je reçois une erreur:

18143:error:1408F10B:SSL routines:SSL3_GET_RECORD:wrong version number:s3_pkt.c:284. 

Et si TLSv1_client_method :

21293:error:1408F10B:SSL routines:SSL3_GET_RECORD:wrong version number:s3_pkt.c:284: 

Pourquoi? Ce que je fais mal?

Répondre

1

Essayez d'utiliser SSLv3_client_method ou TLSv1_client_method au lieu de SSLv23_client_method. Je ne pense pas que Gmail supporte SSLv23.

+0

Si je SSLv3_client_method je reçois une erreur: 18143: Erreur: 1408F10B: routines SSL: ssl3_get_record: numéro de la mauvaise version: s3_pkt.c: 284. Et si TLSv1_client_method: 21293: Erreur: 1408F10B: routines SSL: ssl3_get_record: mauvais numéro de version: s3_pkt.c: 284: drôle :) – Jackell

0

Lisez-vous les caractères \r (retour chariot) et \n (nouvelle ligne) qui délimitent la fin de la réponse 220 du serveur avant de démarrer TLS?

2

J'ai couru dans le même problème hier. Voici comment je l'ai résolu:
- commencez par créer un socket TCP normal et connectez-le à smtp.gmail.com:587
- envoyez une commande "ehlo [127.0.0.1] \ r \ n"
- get les réponses du serveur (Remarque: jusqu'à présent, tout est en clair)
- envoyer une commande "STARTTLS \ r \ n"
- obtenir la réponse (par exemple "220 Ready for TLS")
- en ce moment, créer votre emballage ssl (méthode, CTX, etc ...) et l'utilisation "SSL_set_fd" et "SSL_CONNECT" pour l'activer
- envoyer un nouveau "EHLO [127.0.0.1] \ r \ n" commande mais en utilisant le socket SSL

A partir de maintenant, utilisez "SSL_write" et "SSL_read" avec le socket SSL pour envoyer vos informations d'authentification et votre email.

S'il vous plaît se rendre compte que cette méthode n'encrypte vos données, mais ne vous authentifie pas (ou le serveur) avec des certificats SSL. Mais pour moi, il a résolu le problème de l'obtention de "protocole inconnu".

Hope this helps ...
Phil

+0

ouais, merci beaucoup! – Jackell

+2

Il n'y a pas vraiment besoin d'utiliser le port 587 - smtp.gmail.com accepte STARTTLS sur 25 très bien, comme vous pouvez le voir en exécutant 'OpenSSL s_client -connect smtp.gmail.com:25 -starttls smtp'. –

+0

Ajoutez -crlf à la fin si vous n'obtenez aucune réponse après cette commande. – n0rm1e