OpenSSL рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ C ++ рдореЗрдВ рдПрдХ рдЖрджрд┐рдо рд╡реЗрдм рд╕рд░реНрд╡рд░ рдХрд╛ рдПрдХ рдЙрджрд╛рд╣рд░рдг

рдореИрдВ рд▓рдВрдмреЗ рд╕рдордп рд╕реЗ рдПрдХ рдЙрдкрдпреЛрдЧреА рд▓реЗрдЦ рд▓рд┐рдЦрдирд╛ рдЪрд╛рд╣рддрд╛ рдерд╛, рдФрд░ рдЖрдЦрд┐рд░рдХрд╛рд░ рдореБрдЭреЗ рдПрдХ рдЙрдкрдпреБрдХреНрдд рд╕реВрдЪрдирд╛рддреНрдордХ рдЕрд╡рд╕рд░ рдорд┐рд▓рд╛ред

рдпрд╣ рд▓реЗрдЦ https рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдЪрд▓рд╛рдиреЗ рд╡рд╛рд▓реЗ рдПрдХ рдЖрджрд┐рдо рд╡реЗрдм рд╕рд░реНрд╡рд░ рдХреЗ рдирд┐рд░реНрдорд╛рдг рдкрд░ рдХреЗрдВрджреНрд░рд┐рдд рд╣реЛрдЧрд╛ред рд╣рдо рд╕рд░реНрд╡рд░ рднрд╛рдЧ рдирд╣реАрдВ рд▓рд┐рдЦ рд░рд╣реЗ рд╣реИрдВ, рдФрд░ рдХреЛрдИ рднреА рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдХреНрд▓рд╛рдЗрдВрдЯ рднрд╛рдЧ рдХреЗ рд░реВрдк рдореЗрдВ рдХрд╛рд░реНрдп рдХрд░реЗрдЧрд╛ред
рдирддреАрдЬрддрди, рд╣рдореЗрдВ рдПрдХ рдЖрджрд┐рдо рд╡реЗрдм рд╕рд░реНрд╡рд░ рдХрд╛ рд╕рдмрд╕реЗ рд╕рд░рд▓ рдЙрджрд╛рд╣рд░рдг рдорд┐рд▓рддрд╛ рд╣реИ рдЬрд┐рд╕реЗ рдЖрдкрдХреЗ рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рд▓рд┐рдП рдмреЗрд╣рддрд░ рдФрд░ рддреЗрдЬ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред

рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рд╣рдореЗрдВ рдкреНрд░рдорд╛рдгрдкрддреНрд░ рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдкреНрд░рдорд╛рдг рдкрддреНрд░ рдмрдирд╛рдиреЗ рдХреА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рд╕рд░рд▓ рд╣реИред
$ openssl req -new -x509 -days 30 -keyout server.key -out server.pem 

рдкреНрд░рд╢реНрди "рдкреАрдИрдПрдо рдкрд╛рд╕ рд╡рд╛рдХреНрдпрд╛рдВрд╢ рджрд░реНрдЬ рдХрд░реЗрдВ:" рд╣рдо рдПрдХ рдкрд╛рд╕рд╡рд░реНрдб рдХреЗ рд╕рд╛рде рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдХрд░рддреЗ рд╣реИрдВ, рдкреБрд╖реНрдЯрд┐ рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдпрд╛рдж рдХрд░рддреЗ рд╣реИрдВред
"рд╕рд╛рдорд╛рдиреНрдп рдирд╛рдо (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЖрдкрдХрд╛ рдирд╛рдо) []:" рд╣рдо рдЙрд╕ рд╕рд╛рдЗрдЯ рдХреЗ рдирд╛рдо рдХреЗ рд╕рд╛рде рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдХрд░рддреЗ рд╣реИрдВ рдЬрд┐рд╕рдХреЗ рд▓рд┐рдП рд╣рдо рдПрдХ рдкреНрд░рдорд╛рдг рдкрддреНрд░ рдмрдирд╛ рд░рд╣реЗ рд╣реИрдВред
рдЕрдиреНрдп рд╕рднреА рдЙрддреНрддрд░ рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдирд╣реАрдВ рд╣реИрдВред

рдЙрддреНрддрд░ рдХреЗ рдмрд╛рдж, рджреЛ рдирдИ рдлрд╛рдЗрд▓реЗрдВ рд╡рд░реНрддрдорд╛рди рдореЗрдВ рджрд┐рдЦрд╛рдИ рджреЗрдВрдЧреА- server.key рдФрд░ server.pem (рдХреБрдВрдЬреА рдФрд░ рдкреНрд░рдорд╛рдг рдкрддреНрд░, рдХреНрд░рдорд╢рдГ)ред

рд╕реБрд╡рд┐рдзрд╛ рдХреЗ рд▓рд┐рдП, рдХреБрдВрдЬреА рд╕реЗ рдкрд╛рд╕рд╡рд░реНрдб рдирд┐рдХрд╛рд▓реЗрдВ:
 $ cp server.key server.key.orig $ openssl rsa -in server.key.orig -out server.key $ rm server.key.orig 

рдЕрдм рдХреЛрдбред рдХреЛрдб рдЖрдзрд┐рдХрд╛рд░рд┐рдХ рдУрдкрдирдПрд╕рдПрд╕рдПрд▓ рд╡реЗрдмрд╕рд╛рдЗрдЯ рд╕реЗ рдЙрджрд╛рд╣рд░рдгреЛрдВ рдкрд░ рдЖрдзрд╛рд░рд┐рдд рд╣реИ, рд▓реЗрдХрд┐рди рдХреЗрд╡рд▓ рдореИрдВрдиреЗ рдЗрд╕реЗ рд╕рд░рд▓ рдмрдирд╛рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХреАред рд╣рд╛рдВ, рдФрд░ рдХрд┐рд╕реА рдХрд╛рд░рдг рд╕реЗ рд╕рд┐рд░реНрдл рдЙрджрд╛рд╣рд░рдг рдХреА рдирдХрд▓ рдХрд░рдирд╛ рдФрд░ рд╕рдВрдХрд▓рди рдХрд░рдирд╛ рдореЗрд░реЗ рдХрд╛рдо рдирд╣реАрдВ рдЖрдпрд╛ред

рдкреБрд╕реНрддрдХрд╛рд▓рдпреЛрдВ рдХрд╛ рдХрдиреЗрдХреНрд╢рди рдХрдард┐рдирд╛рдЗрдпреЛрдВ рдХрд╛ рдХрд╛рд░рдг рдирд╣реАрдВ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред
 #include <stdio.h> #include <stdlib.h> #include <errno.h> #include <sys/types.h> #include <sys/socket.h> #include <netinet/in.h> #include <netinet/tcp.h> #include <netdb.h> #include <fcntl.h> #include <signal.h> #include <unistd.h> #include <string.h> #include <openssl/ssl.h> #include <openssl/err.h> extern BIO *bio_err; BIO *bio_err=0; #define PEM_FILE "server.pem" #define KEY_FILE "server.key" #define PORT 4333 

рд╕реЙрдХреЗрдЯ рдирд┐рд░реНрдорд╛рдг рдХрд╛рд░реНрдп рднреА рд╕рд░рд▓ рд╣реИред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдпрд╣ рдЕрднреА рддрдХ OpenSSL рд╕реЗ рдХреБрдЫ рднреА рд╢рд╛рдорд┐рд▓ рдирд╣реАрдВ рд╣реИред
 /** *     */ int tcp_listen() { int sock; struct sockaddr_in sin; int val=1; if((sock=socket(AF_INET,SOCK_STREAM,0))<0) printf("Couldn't make socket"); memset(&sin,0,sizeof(sin)); sin.sin_addr.s_addr=INADDR_ANY; sin.sin_family=AF_INET; sin.sin_port=htons(PORT); setsockopt(sock,SOL_SOCKET,SO_REUSEADDR,&val,sizeof(val)); if(bind(sock,(struct sockaddr *)&sin, sizeof(sin))<0) printf("Couldn't bind"); listen(sock,5); return(sock); } 

Ssl рдЖрд░рдВрднреАрдХрд░рдг рд╕рдорд╛рд░реЛрд╣ред рдореИрдВ рдзреНрдпрд╛рди рд╕реЗ рдЯрд┐рдкреНрдкрдгреА рдХрд░реВрдВрдЧрд╛ред
  /*     SIGPIPE           */ static void sigpipe_handle(int x){} SSL_CTX *initialize_ctx(const char *key_file,const char *pem_file) { if(!bio_err) { /*    OpenSSL,         OpenSSL */ SSL_library_init(); SSL_load_error_strings(); /* An error write context */ bio_err=BIO_new_fp(stderr,BIO_NOCLOSE); } /* Set up a SIGPIPE handler */ /*    SIGPIPE           */ signal(SIGPIPE,sigpipe_handle); /* Create our context*/ SSL_CTX* ctx=SSL_CTX_new(SSLv23_method()); /* Load our keys and certificates*/ if(!(SSL_CTX_use_certificate_file(ctx,pem_file,SSL_FILETYPE_PEM))) { printf("    \n"); } if(!(SSL_CTX_use_PrivateKey_file(ctx, key_file,SSL_FILETYPE_PEM))) { printf("    \n"); } return ctx; } 

рдЖрд░рдВрдн рдореЗрдВ рдПрдХ рдмрд╛рд░ initialize_ctx рдлрд╝рдВрдХреНрд╢рди рд╣рдорд╛рд░реА рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЛ рд▓реЛрдб рдХрд░рддрд╛ рд╣реИ рдФрд░ рдПрдХ SSL_CTX рд╕рдВрджрд░реНрдн рдмрдирд╛рддрд╛ рд╣реИред рд╡реНрдпрдХреНрддрд┐рдЧрдд рдХрдиреЗрдХреНрд╢рди рдмрдирд╛рддреЗ рд╕рдордп рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред рдпрд╣ рдкреНрд░рддреНрдпреЗрдХ рдирдП рдХрдиреЗрдХреНрд╢рди рдХреЗ рд▓рд┐рдП рдореБрдЦреНрдп рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЛ рдбрд╛рдЙрдирд▓реЛрдб рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдХреЛ рд╕рдорд╛рдкреНрдд рдХрд░рддрд╛ рд╣реИред

рдЕрдм рдХрдиреЗрдХреНрд╢рди рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рдХрд╛рд░реНрдп рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВред
  #define BUFSIZZ 4048 static int http_serve(SSL *ssl,int s) { char buf[BUFSIZZ]; int r = 0; int e; bzero(buf,BUFSIZZ-1); //   r=SSL_read(ssl,buf,BUFSIZZ-1); //   if(r<0) //  r < 0    { e = SSL_get_error(ssl,r); } printf("[   %d, Error:%d]%s\n", r, e, buf); /*   */ r = SSL_write(ssl,"HTTP/1.0 200 OK\r\nServer: EKRServer\r\n\r\nServer test page\r\n",strlen("HTTP/1.0 200 OK\r\nServer: EKRServer\r\n\r\nServer test page\r\n")); if(r<=0) //  r < 0    { printf("Write error %d\n",r); } else { printf("Write ok %d\n",r); } /*   */ shutdown(s,1); SSL_shutdown(ssl); SSL_free(ssl); close(s); return(0); } 

рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣рд╛рдВ рд╕рдм рдХреБрдЫ рд╕реНрдкрд╖реНрдЯ рд╣реИред
рдФрд░ рдЕрдВрддрд┐рдо рдЪрд░рдг, рд╣рдо рд╕рдм рдХреБрдЫ рдПрдХ рд╕рд╛рде рдЬреЛрдбрд╝рддреЗ рд╣реИрдВред
 int main(int argc, char *argv[]) { int sock,s; SSL_CTX *ctx; SSL *ssl; int r; // Build our SSL context ctx=initialize_ctx(KEY_FILE,PEM_FILE); sock=tcp_listen(); printf("\n"); while(1) { if((s=accept(sock,0,0))<0) { printf("Problem accepting\n"); } else { printf("Accepting %d\n",s); } ssl=SSL_new(ctx); SSL_set_fd(ssl, s); r=SSL_accept(ssl); if( r < 0 ) { printf("SSL accept error %d\n",r); printf("SSL accept error code %d\n",SSL_get_error(ssl,r) ); exit(0); } else { printf("SSL accept %d\n",r); } http_serve(ssl,s); printf("\n"); } SSL_CTX_free(ctx); } 

рдХреЛрдб рд╕реЗ, рдореИрдВрдиреЗ рд╕рдм рдХреБрдЫ рд╣рдЯрд╛рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХреА рдЬрд┐рд╕рдХреЗ рдмрд┐рдирд╛ рдпрд╣ рдХрд╛рдо рдХрд░реЗрдЧрд╛ред рд▓реЗрдХрд┐рди рдЗрд╕рдХреЗ рдмрд╛рд╡рдЬреВрдж, рдЬреИрд╕рд╛ рдХрд┐ рдореБрдЭреЗ рдЙрдореНрдореАрдж рдереА, рдХреЛрдб рдкрд╛рда рд╕реЗ рдЕрдзрд┐рдХ рдирд┐рдХрд▓рд╛ред рд▓реЗрдХрд┐рди рдореБрдЭреЗ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЙрдореНрдореАрдж рд╣реИ рдХрд┐ рдпрд╣ рд▓реЗрдЦ рдХрд┐рд╕реА рдХреА рдорджрдж рдХрд░реЗрдЧрд╛ред
рдореИрдВрдиреЗ рдЙрдмрдВрдЯреВ рдХреЗ рддрд╣рдд рд╕рдм рдХреБрдЫ рд▓рд┐рдЦрд╛ рд╣реИ, рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рдЦрд┐рдбрд╝рдХрд┐рдпреЛрдВ рдореЗрдВ рд╕рдВрдХрд▓рди рдХрд░рддреЗ рд╕рдордп рдЖрдкрдХреЛ рдорд╛рдореВрд▓реА рд╕рдВрдкрд╛рджрди рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред

рдПрдкреЗрдВрдб рдореЗрдВ рдореИрдВ рдУрдкрдирдПрд╕рдПрд╕рдПрд▓ рдкрд░ рдЙрджрд╛рд╣рд░рдгреЛрдВ рдХреЗ рд▓рд┐рдП рдПрдХ рд▓рд┐рдВрдХ рдЬреЛрдбрд╝реВрдВрдЧрд╛

Source: https://habr.com/ru/post/In167107/


All Articles