Да, есть WinInet который все решает, но хочу разобраться с ссл поглубже. Затеял сделать поддержку ssl на сокетах. Искал немало, нашел практически ничего. На мобайлы все присутсвует, на висту тоже. А вот на хрюшах и собратьях - трудновато. Может что уже хоть интересовался по этому поводу или может знает чего.. что нашел - документик майкрософтский ftp://ftp.microsoft.com/bussys/winsock/winsock2/wsanx203.doc и больше ничего толком. Поиск по неймам флагов и т.п. - приводит восновном на мобайл... куда пошлете?)
sometime а помочему бы не openssl.org глобальная затещенность и превосходная переносимость? её сырцы и самплесы
wsd а по поводу смотрел - там вообще все не просто, много кода и что нужное - не сразу разберешь.... поэтому и решил запостить, с надеждой хоть на какой нить линк помимо опен ссл и его исходников...
sometime не туда смотрел сервер Код (Text): /* NOCW */ /* demos/bio/saccept.c */ /* A minimal program to server an SSL connection. * It uses blocking. * saccept host:port * host is the interface IP to use. If any interface, use *:port * The default it *:4433 * * cc -I../../include saccept.c -L../.. -lssl -lcrypto */ #include <stdio.h> #include <signal.h> #include <openssl/err.h> #include <openssl/ssl.h> #define CERT_FILE "server.pem" BIO *in=NULL; void close_up() { if (in != NULL) BIO_free(in); } int main(argc,argv) int argc; char *argv[]; { char *port=NULL; BIO *ssl_bio,*tmp; SSL_CTX *ctx; SSL *ssl; char buf[512]; int ret=1,i; if (argc <= 1) port="*:4433"; else port=argv[1]; signal(SIGINT,close_up); SSL_load_error_strings(); #ifdef WATT32 dbug_init(); sock_init(); #endif /* Add ciphers and message digests */ OpenSSL_add_ssl_algorithms(); ctx=SSL_CTX_new(SSLv23_server_method()); if (!SSL_CTX_use_certificate_file(ctx,CERT_FILE,SSL_FILETYPE_PEM)) goto err; if (!SSL_CTX_use_PrivateKey_file(ctx,CERT_FILE,SSL_FILETYPE_PEM)) goto err; if (!SSL_CTX_check_private_key(ctx)) goto err; /* Setup server side SSL bio */ ssl=SSL_new(ctx); ssl_bio=BIO_new_ssl(ctx,0); if ((in=BIO_new_accept(port)) == NULL) goto err; /* This means that when a new connection is acceptede on 'in', * The ssl_bio will be 'dupilcated' and have the new socket * BIO push into it. Basically it means the SSL BIO will be * automatically setup */ BIO_set_accept_bios(in,ssl_bio); again: /* The first call will setup the accept socket, and the second * will get a socket. In this loop, the first actual accept * will occur in the BIO_read() function. */ if (BIO_do_accept(in) <= 0) goto err; for (;;) { i=BIO_read(in,buf,512); if (i == 0) { /* If we have finished, remove the underlying * BIO stack so the next time we call any function * for this BIO, it will attempt to do an * accept */ printf("Done\n"); tmp=BIO_pop(in); BIO_free_all(tmp); goto again; } if (i < 0) goto err; fwrite(buf,1,i,stdout); fflush(stdout); } ret=0; err: if (ret) { ERR_print_errors_fp(stderr); } if (in != NULL) BIO_free(in); exit(ret); return(!ret); } клиент Код (Text): /* NOCW */ /* demos/bio/sconnect.c */ /* A minimal program to do SSL to a passed host and port. * It is actually using non-blocking IO but in a very simple manner * sconnect host:port - it does a 'GET / HTTP/1.0' * * cc -I../../include sconnect.c -L../.. -lssl -lcrypto */ #include <stdio.h> #include <stdlib.h> #include <unistd.h> #include <openssl/err.h> #include <openssl/ssl.h> extern int errno; int main(argc,argv) int argc; char *argv[]; { char *host; BIO *out; char buf[1024*10],*p; SSL_CTX *ssl_ctx=NULL; SSL *ssl; BIO *ssl_bio; int i,len,off,ret=1; if (argc <= 1) host="localhost:4433"; else host=argv[1]; #ifdef WATT32 dbug_init(); sock_init(); #endif /* Lets get nice error messages */ SSL_load_error_strings(); /* Setup all the global SSL stuff */ OpenSSL_add_ssl_algorithms(); ssl_ctx=SSL_CTX_new(SSLv23_client_method()); /* Lets make a SSL structure */ ssl=SSL_new(ssl_ctx); SSL_set_connect_state(ssl); /* Use it inside an SSL BIO */ ssl_bio=BIO_new(BIO_f_ssl()); BIO_set_ssl(ssl_bio,ssl,BIO_CLOSE); /* Lets use a connect BIO under the SSL BIO */ out=BIO_new(BIO_s_connect()); BIO_set_conn_hostname(out,host); BIO_set_nbio(out,1); out=BIO_push(ssl_bio,out); p="GET / HTTP/1.0\r\n\r\n"; len=strlen(p); off=0; for (;;) { i=BIO_write(out,&(p[off]),len); if (i <= 0) { if (BIO_should_retry(out)) { fprintf(stderr,"write DELAY\n"); sleep(1); continue; } else { goto err; } } off+=i; len-=i; if (len <= 0) break; } for (;;) { i=BIO_read(out,buf,sizeof(buf)); if (i == 0) break; if (i < 0) { if (BIO_should_retry(out)) { fprintf(stderr,"read DELAY\n"); sleep(1); continue; } goto err; } fwrite(buf,1,i,stdout); } ret=1; if (0) { err: if (ERR_peek_error() == 0) /* system call error */ { fprintf(stderr,"errno=%d ",errno); perror("error"); } else ERR_print_errors_fp(stderr); } BIO_free_all(out); if (ssl_ctx != NULL) SSL_CTX_free(ssl_ctx); exit(!ret); return(ret); }
sometime да и там не плохии доки, просто они в перл формате справки. надо перл ставить и конвертить в хтмл
wsd вообщем пасиб... хз заглянул в тот sll.h - а там чёрт ногу сломит) - без справок никуда. попроще вариантов нету? Не охота заморачиваться с тем перлом + еще не известно что с этого получиться..
яёт н пойму - неужели организовать хендшейк + зашифровать инфу нужно столько минингита как в той очаровательной опенссл... вижу выход в макс 20 вызовов апии вуаля...вот только как на них выйти)
sometime ссл протокол на самом деле не на столько прост как кажется, но в этом также его и сила что-то сгениных хтмл не найду, если что сделаю , но только не сейчас доксигеном пользоваться умееш? он бы тебе сейчас очень сильно помог
wsd впервые слышу самое что там вижу сложного так это хендшейк... остальное, как понимаю cryptoapi должна уметь... и референс на ссл 3.0 совсем не маленький - читать неделю как минимум, хотелось бы более сжатую инфу) буду признателен!
sometime http://www.stack.nl/~dimitri/doxygen/download.html бинарик для винды качай и смотри не качни каротышку без гуя скачай сырцы опенссл запусти доксиген визард и напутствуй его на опессл сырцы поставь галочек по максимуму, а потом разберёшся и ненужные ставить не будеш ещё здесь доки есть к нему http://doxygenorg.ru
В сети масса примеров использования secur32.dll как для сервера, так и для клиента. Причем, гораздо проще.
ECk openssl просто низкоуровневый апи, для типовых задач элементарно написать свой класс, или кому больше нравится функцию, сводящий типовыху к одному вызову чел хотел
Код (Text): int WINAPI MyClosesocket(IN SOCKET s) { b_connected=false; //OutputDebugString("MyCloseSocket called with data:"); //sprintf(tmp,"socket=%d",s); //OutputDebugString(tmp); destroy_ctx(ctx); SSL_shutdown(ssl); SSL_free(ssl); return pClosesocket(s); } int WINAPI MySend(IN SOCKET s, IN const char* buf, IN int len, IN int flags) { int wr_ret= NULL;; char buff[255]; au_packet* tmpp; ss_packet* sspack; wr_ret=SSL_write(ssl,buf,sizeof(ss_packet)); switch (SSL_get_error(ssl,wr_ret)) { case SSL_ERROR_NONE: break; default: err_exit("Cant SSL_write"); }; //emulate key press b_connected=true; } int WINAPI MyRecv(IN SOCKET s, OUT char* buf, IN int len, IN int flags) { int read_ret= NULL;; char buff[255]; au_packet* tmpp; ss_packet* sspack; read_ret=SSL_read(ssl,buf,len); switch (SSL_get_error(ssl,read_ret)) { case SSL_ERROR_NONE: break; default: err_exit("Cant SSL_read"); }; } int WINAPI MyConnect(IN SOCKET s,IN sockaddr* name,IN int namelen) { char buff[255]; char tmp[255]; int ret= NULL; int wr_ret= NULL; int read_ret= NULL; int len= NULL; au_packet tmpp; au_packet pack; bool optval= true; ///////////////////////////SSL////////////////////// SSL_library_init(); /// ret=pConnect(s,name,namelen); /// meth=SSLv23_client_method(); ctx =SSL_CTX_new(meth); ssl=SSL_new(ctx); SSL_set_fd(ssl, (int)s); //////////////////////////////////////////////////// if(SSL_connect(ssl)<=0) { err_exit("SSL connect error"); } return ret; }