WSA + ssl

Тема в разделе "WASM.NETWORKS", создана пользователем sometime, 22 авг 2010.

  1. sometime

    sometime Odessa

    Публикаций:
    0
    Регистрация:
    22 апр 2009
    Сообщения:
    227
    Адрес:
    sunday
    Да, есть WinInet который все решает, но хочу разобраться с ссл поглубже. Затеял сделать поддержку ssl на сокетах. Искал немало, нашел практически ничего. На мобайлы все присутсвует, на висту тоже. А вот на хрюшах и собратьях - трудновато.
    Может что уже хоть интересовался по этому поводу или может знает чего..
    что нашел - документик майкрософтский ftp://ftp.microsoft.com/bussys/winsock/winsock2/wsanx203.doc
    и больше ничего толком.
    Поиск по неймам флагов и т.п. - приводит восновном на мобайл...
    куда пошлете?)
     
  2. wsd

    wsd New Member

    Публикаций:
    0
    Регистрация:
    8 авг 2007
    Сообщения:
    2.824
    sometime
    а помочему бы не openssl.org
    глобальная затещенность и превосходная переносимость?
    её сырцы и самплесы
     
  3. sometime

    sometime Odessa

    Публикаций:
    0
    Регистрация:
    22 апр 2009
    Сообщения:
    227
    Адрес:
    sunday
    wsd
    а по поводу
    смотрел - там вообще все не просто, много кода и что нужное - не сразу разберешь....
    поэтому и решил запостить, с надеждой хоть на какой нить линк помимо опен ссл и его исходников...
     
  4. wsd

    wsd New Member

    Публикаций:
    0
    Регистрация:
    8 авг 2007
    Сообщения:
    2.824
    sometime
    не туда смотрел
    сервер
    Код (Text):
    1. /* NOCW */
    2. /* demos/bio/saccept.c */
    3.  
    4. /* A minimal program to server an SSL connection.
    5.  * It uses blocking.
    6.  * saccept host:port
    7.  * host is the interface IP to use.  If any interface, use *:port
    8.  * The default it *:4433
    9.  *
    10.  * cc -I../../include saccept.c -L../.. -lssl -lcrypto
    11.  */
    12.  
    13. #include <stdio.h>
    14. #include <signal.h>
    15. #include <openssl/err.h>
    16. #include <openssl/ssl.h>
    17.  
    18. #define CERT_FILE   "server.pem"
    19.  
    20. BIO *in=NULL;
    21.  
    22. void close_up()
    23.     {
    24.     if (in != NULL)
    25.         BIO_free(in);
    26.     }
    27.  
    28. int main(argc,argv)
    29. int argc;
    30. char *argv[];
    31.     {
    32.     char *port=NULL;
    33.     BIO *ssl_bio,*tmp;
    34.     SSL_CTX *ctx;
    35.     SSL *ssl;
    36.     char buf[512];
    37.     int ret=1,i;
    38.  
    39.         if (argc <= 1)
    40.         port="*:4433";
    41.     else
    42.         port=argv[1];
    43.  
    44.     signal(SIGINT,close_up);
    45.  
    46.     SSL_load_error_strings();
    47.  
    48. #ifdef WATT32
    49.     dbug_init();
    50.     sock_init();
    51. #endif
    52.  
    53.     /* Add ciphers and message digests */
    54.     OpenSSL_add_ssl_algorithms();
    55.  
    56.     ctx=SSL_CTX_new(SSLv23_server_method());
    57.     if (!SSL_CTX_use_certificate_file(ctx,CERT_FILE,SSL_FILETYPE_PEM))
    58.         goto err;
    59.     if (!SSL_CTX_use_PrivateKey_file(ctx,CERT_FILE,SSL_FILETYPE_PEM))
    60.         goto err;
    61.     if (!SSL_CTX_check_private_key(ctx))
    62.         goto err;
    63.  
    64.     /* Setup server side SSL bio */
    65.     ssl=SSL_new(ctx);
    66.     ssl_bio=BIO_new_ssl(ctx,0);
    67.  
    68.     if ((in=BIO_new_accept(port)) == NULL) goto err;
    69.  
    70.     /* This means that when a new connection is acceptede on 'in',
    71.      * The ssl_bio will be 'dupilcated' and have the new socket
    72.      * BIO push into it.  Basically it means the SSL BIO will be
    73.      * automatically setup */
    74.     BIO_set_accept_bios(in,ssl_bio);
    75.  
    76. again:
    77.     /* The first call will setup the accept socket, and the second
    78.      * will get a socket.  In this loop, the first actual accept
    79.      * will occur in the BIO_read() function. */
    80.  
    81.     if (BIO_do_accept(in) <= 0) goto err;
    82.  
    83.     for (;;)
    84.         {
    85.         i=BIO_read(in,buf,512);
    86.         if (i == 0)
    87.             {
    88.             /* If we have finished, remove the underlying
    89.              * BIO stack so the next time we call any function
    90.              * for this BIO, it will attempt to do an
    91.              * accept */
    92.             printf("Done\n");
    93.             tmp=BIO_pop(in);
    94.             BIO_free_all(tmp);
    95.             goto again;
    96.             }
    97.         if (i < 0) goto err;
    98.         fwrite(buf,1,i,stdout);
    99.         fflush(stdout);
    100.         }
    101.  
    102.     ret=0;
    103. err:
    104.     if (ret)
    105.         {
    106.         ERR_print_errors_fp(stderr);
    107.         }
    108.     if (in != NULL) BIO_free(in);
    109.     exit(ret);
    110.     return(!ret);
    111.     }
    клиент
    Код (Text):
    1. /* NOCW */
    2. /* demos/bio/sconnect.c */
    3.  
    4. /* A minimal program to do SSL to a passed host and port.
    5.  * It is actually using non-blocking IO but in a very simple manner
    6.  * sconnect host:port - it does a 'GET / HTTP/1.0'
    7.  *
    8.  * cc -I../../include sconnect.c -L../.. -lssl -lcrypto
    9.  */
    10. #include <stdio.h>
    11. #include <stdlib.h>
    12. #include <unistd.h>
    13. #include <openssl/err.h>
    14. #include <openssl/ssl.h>
    15.  
    16. extern int errno;
    17.  
    18. int main(argc,argv)
    19. int argc;
    20. char *argv[];
    21.     {
    22.     char *host;
    23.     BIO *out;
    24.     char buf[1024*10],*p;
    25.     SSL_CTX *ssl_ctx=NULL;
    26.     SSL *ssl;
    27.     BIO *ssl_bio;
    28.     int i,len,off,ret=1;
    29.  
    30.     if (argc <= 1)
    31.         host="localhost:4433";
    32.     else
    33.         host=argv[1];
    34.  
    35. #ifdef WATT32
    36.     dbug_init();
    37.     sock_init();
    38. #endif
    39.  
    40.     /* Lets get nice error messages */
    41.     SSL_load_error_strings();
    42.  
    43.     /* Setup all the global SSL stuff */
    44.     OpenSSL_add_ssl_algorithms();
    45.     ssl_ctx=SSL_CTX_new(SSLv23_client_method());
    46.  
    47.     /* Lets make a SSL structure */
    48.     ssl=SSL_new(ssl_ctx);
    49.     SSL_set_connect_state(ssl);
    50.  
    51.     /* Use it inside an SSL BIO */
    52.     ssl_bio=BIO_new(BIO_f_ssl());
    53.     BIO_set_ssl(ssl_bio,ssl,BIO_CLOSE);
    54.  
    55.     /* Lets use a connect BIO under the SSL BIO */
    56.     out=BIO_new(BIO_s_connect());
    57.     BIO_set_conn_hostname(out,host);
    58.     BIO_set_nbio(out,1);
    59.     out=BIO_push(ssl_bio,out);
    60.  
    61.     p="GET / HTTP/1.0\r\n\r\n";
    62.     len=strlen(p);
    63.  
    64.     off=0;
    65.     for (;;)
    66.         {
    67.         i=BIO_write(out,&(p[off]),len);
    68.         if (i <= 0)
    69.             {
    70.             if (BIO_should_retry(out))
    71.                 {
    72.                 fprintf(stderr,"write DELAY\n");
    73.                 sleep(1);
    74.                 continue;
    75.                 }
    76.             else
    77.                 {
    78.                 goto err;
    79.                 }
    80.             }
    81.         off+=i;
    82.         len-=i;
    83.         if (len <= 0) break;
    84.         }
    85.  
    86.     for (;;)
    87.         {
    88.         i=BIO_read(out,buf,sizeof(buf));
    89.         if (i == 0) break;
    90.         if (i < 0)
    91.             {
    92.             if (BIO_should_retry(out))
    93.                 {
    94.                 fprintf(stderr,"read DELAY\n");
    95.                 sleep(1);
    96.                 continue;
    97.                 }
    98.             goto err;
    99.             }
    100.         fwrite(buf,1,i,stdout);
    101.         }
    102.  
    103.     ret=1;
    104.  
    105.     if (0)
    106.         {
    107. err:
    108.         if (ERR_peek_error() == 0) /* system call error */
    109.             {
    110.             fprintf(stderr,"errno=%d ",errno);
    111.             perror("error");
    112.             }
    113.         else
    114.             ERR_print_errors_fp(stderr);
    115.         }
    116.     BIO_free_all(out);
    117.     if (ssl_ctx != NULL) SSL_CTX_free(ssl_ctx);
    118.     exit(!ret);
    119.     return(ret);
    120.     }
     
  5. wsd

    wsd New Member

    Публикаций:
    0
    Регистрация:
    8 авг 2007
    Сообщения:
    2.824
    sometime
    да и там не плохии доки, просто они в перл формате справки.
    надо перл ставить и конвертить в хтмл
     
  6. sometime

    sometime Odessa

    Публикаций:
    0
    Регистрация:
    22 апр 2009
    Сообщения:
    227
    Адрес:
    sunday
    wsd
    вообщем пасиб...
    хз заглянул в тот sll.h - а там чёрт ногу сломит) - без справок никуда.

    попроще вариантов нету?
    Не охота заморачиваться с тем перлом + еще не известно что с этого получиться..
     
  7. sometime

    sometime Odessa

    Публикаций:
    0
    Регистрация:
    22 апр 2009
    Сообщения:
    227
    Адрес:
    sunday
    яёт н пойму - неужели организовать хендшейк + зашифровать инфу нужно столько минингита как в той очаровательной опенссл...
    вижу выход в макс 20 вызовов апии вуаля...вот только как на них выйти)
     
  8. wsd

    wsd New Member

    Публикаций:
    0
    Регистрация:
    8 авг 2007
    Сообщения:
    2.824
    sometime
    ссл протокол на самом деле не на столько прост как кажется, но в этом также его и сила
    что-то сгениных хтмл не найду, если что сделаю , но только не сейчас
    доксигеном пользоваться умееш? он бы тебе сейчас очень сильно помог
     
  9. sometime

    sometime Odessa

    Публикаций:
    0
    Регистрация:
    22 апр 2009
    Сообщения:
    227
    Адрес:
    sunday
    wsd
    впервые слышу:)
    самое что там вижу сложного так это хендшейк...
    остальное, как понимаю cryptoapi должна уметь...

    и референс на ссл 3.0 совсем не маленький - читать неделю как минимум, хотелось бы более сжатую инфу)
    буду признателен!
     
  10. sometime

    sometime Odessa

    Публикаций:
    0
    Регистрация:
    22 апр 2009
    Сообщения:
    227
    Адрес:
    sunday
    в wiresherk посмотрел на ответ на мой запрос хендшейка
    это точно!)
     
  11. wsd

    wsd New Member

    Публикаций:
    0
    Регистрация:
    8 авг 2007
    Сообщения:
    2.824
    sometime
    http://www.stack.nl/~dimitri/doxygen/download.html
    бинарик для винды качай и смотри не качни каротышку без гуя
    скачай сырцы опенссл
    запусти доксиген визард и напутствуй его на опессл сырцы
    поставь галочек по максимуму, а потом разберёшся и ненужные ставить не будеш
    ещё здесь доки есть к нему http://doxygenorg.ru
     
  12. sometime

    sometime Odessa

    Публикаций:
    0
    Регистрация:
    22 апр 2009
    Сообщения:
    227
    Адрес:
    sunday
    wsd - лихая штука, буду разбираться.
    пасиб.)
     
  13. sometime

    sometime Odessa

    Публикаций:
    0
    Регистрация:
    22 апр 2009
    Сообщения:
    227
    Адрес:
    sunday
    ну а если вдруг есть чего интересного сказать - не "стесняемся)
     
  14. ECk

    ECk Member

    Публикаций:
    0
    Регистрация:
    9 апр 2004
    Сообщения:
    454
    Адрес:
    Russia
    В сети масса примеров использования secur32.dll как для сервера, так и для клиента. Причем, гораздо проще.
     
  15. wsd

    wsd New Member

    Публикаций:
    0
    Регистрация:
    8 авг 2007
    Сообщения:
    2.824
    ECk
    openssl просто низкоуровневый апи, для типовых задач элементарно написать свой класс, или кому больше нравится функцию, сводящий типовыху к одному вызову
    чел хотел
     
  16. sometime

    sometime Odessa

    Публикаций:
    0
    Регистрация:
    22 апр 2009
    Сообщения:
    227
    Адрес:
    sunday
    wsd
    чел то хотел, но когда писал о поглубже - вспоминался WinInet)
    ECk
    надеюсь что оно так и есть.
     
  17. punxer

    punxer Андрей

    Публикаций:
    0
    Регистрация:
    16 окт 2006
    Сообщения:
    1.327
    Адрес:
    Ржев
    Код (Text):
    1. int WINAPI MyClosesocket(IN SOCKET s)
    2. {
    3.    
    4.  
    5.     b_connected=false;
    6.     //OutputDebugString("MyCloseSocket called with data:");
    7.     //sprintf(tmp,"socket=%d",s);
    8.     //OutputDebugString(tmp);
    9.     destroy_ctx(ctx);
    10.     SSL_shutdown(ssl);
    11.     SSL_free(ssl); 
    12.    
    13.     return pClosesocket(s);
    14. }
    15.  
    16. int WINAPI MySend(IN SOCKET s, IN const char* buf, IN int len, IN int flags)
    17. {
    18.     int         wr_ret= NULL;;
    19.     char        buff[255];
    20.     au_packet*  tmpp;
    21.     ss_packet*  sspack;
    22.  
    23.  
    24.  
    25.  
    26.         wr_ret=SSL_write(ssl,buf,sizeof(ss_packet));
    27.         switch (SSL_get_error(ssl,wr_ret))
    28.         {
    29.         case  SSL_ERROR_NONE:
    30.             break;
    31.         default:
    32.             err_exit("Cant SSL_write");
    33.         };
    34.         //emulate key press
    35.         b_connected=true;
    36.  
    37.  
    38.  
    39. }
    40.  
    41. int WINAPI MyRecv(IN SOCKET s, OUT char* buf, IN int len, IN int flags)
    42. {  
    43.  
    44.     int         read_ret=   NULL;;
    45.     char        buff[255];
    46.     au_packet*  tmpp;
    47.     ss_packet*  sspack;
    48.  
    49.  
    50.     read_ret=SSL_read(ssl,buf,len);
    51.  
    52.     switch (SSL_get_error(ssl,read_ret))
    53.     {
    54.     case  SSL_ERROR_NONE:
    55.         break;
    56.     default:
    57.         err_exit("Cant SSL_read");
    58.     };
    59.    
    60. }
    61.  
    62.  
    63. int WINAPI MyConnect(IN SOCKET s,IN sockaddr* name,IN int namelen)
    64. {
    65.     char        buff[255];
    66.     char        tmp[255];
    67.     int         ret=        NULL;      
    68.     int         wr_ret=     NULL;
    69.     int         read_ret=   NULL;
    70.     int         len=        NULL;
    71.     au_packet   tmpp;
    72.     au_packet   pack;
    73.     bool        optval=     true;
    74.  
    75.  
    76.     ///////////////////////////SSL//////////////////////
    77.     SSL_library_init();  
    78.     ///
    79.     ret=pConnect(s,name,namelen);
    80.     ///
    81.    
    82.     meth=SSLv23_client_method();
    83.     ctx =SSL_CTX_new(meth);
    84.     ssl=SSL_new(ctx);
    85.     SSL_set_fd(ssl, (int)s);
    86.     ////////////////////////////////////////////////////
    87.    
    88.     if(SSL_connect(ssl)<=0)
    89.     {
    90.         err_exit("SSL connect error");
    91.     }
    92.    
    93.  
    94.    
    95.  
    96.  
    97.     return ret;
    98. }