рдореИрдВ рд▓рдВрдмреЗ рд╕рдордп рд╕реЗ рдПрдХ рдЙрдкрдпреЛрдЧреА рд▓реЗрдЦ рд▓рд┐рдЦрдирд╛ рдЪрд╛рд╣рддрд╛ рдерд╛, рдФрд░ рдЖрдЦрд┐рд░рдХрд╛рд░ рдореБрдЭреЗ рдПрдХ рдЙрдкрдпреБрдХреНрдд рд╕реВрдЪрдирд╛рддреНрдордХ рдЕрд╡рд╕рд░ рдорд┐рд▓рд╛ред
рдпрд╣ рд▓реЗрдЦ 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 рдЖрд░рдВрднреАрдХрд░рдг рд╕рдорд╛рд░реЛрд╣ред рдореИрдВ рдзреНрдпрд╛рди рд╕реЗ рдЯрд┐рдкреНрдкрдгреА рдХрд░реВрдВрдЧрд╛ред
static void sigpipe_handle(int x){} SSL_CTX *initialize_ctx(const char *key_file,const char *pem_file) { if(!bio_err) { SSL_library_init(); SSL_load_error_strings(); bio_err=BIO_new_fp(stderr,BIO_NOCLOSE); } signal(SIGPIPE,sigpipe_handle); SSL_CTX* ctx=SSL_CTX_new(SSLv23_method()); 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);
рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣рд╛рдВ рд╕рдм рдХреБрдЫ рд╕реНрдкрд╖реНрдЯ рд╣реИред
рдФрд░ рдЕрдВрддрд┐рдо рдЪрд░рдг, рд╣рдо рд╕рдм рдХреБрдЫ рдПрдХ рд╕рд╛рде рдЬреЛрдбрд╝рддреЗ рд╣реИрдВред
int main(int argc, char *argv[]) { int sock,s; SSL_CTX *ctx; SSL *ssl; int r;
рдХреЛрдб рд╕реЗ, рдореИрдВрдиреЗ рд╕рдм рдХреБрдЫ рд╣рдЯрд╛рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХреА рдЬрд┐рд╕рдХреЗ рдмрд┐рдирд╛ рдпрд╣ рдХрд╛рдо рдХрд░реЗрдЧрд╛ред рд▓реЗрдХрд┐рди рдЗрд╕рдХреЗ рдмрд╛рд╡рдЬреВрдж, рдЬреИрд╕рд╛ рдХрд┐ рдореБрдЭреЗ рдЙрдореНрдореАрдж рдереА, рдХреЛрдб рдкрд╛рда рд╕реЗ рдЕрдзрд┐рдХ рдирд┐рдХрд▓рд╛ред рд▓реЗрдХрд┐рди рдореБрдЭреЗ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЙрдореНрдореАрдж рд╣реИ рдХрд┐ рдпрд╣ рд▓реЗрдЦ рдХрд┐рд╕реА рдХреА рдорджрдж рдХрд░реЗрдЧрд╛ред
рдореИрдВрдиреЗ рдЙрдмрдВрдЯреВ рдХреЗ рддрд╣рдд рд╕рдм рдХреБрдЫ рд▓рд┐рдЦрд╛ рд╣реИ, рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рдЦрд┐рдбрд╝рдХрд┐рдпреЛрдВ рдореЗрдВ рд╕рдВрдХрд▓рди рдХрд░рддреЗ рд╕рдордп рдЖрдкрдХреЛ рдорд╛рдореВрд▓реА рд╕рдВрдкрд╛рджрди рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред
рдПрдкреЗрдВрдб рдореЗрдВ рдореИрдВ
рдУрдкрдирдПрд╕рдПрд╕рдПрд▓ рдкрд░ рдЙрджрд╛рд╣рд░рдгреЛрдВ рдХреЗ рд▓рд┐рдП рдПрдХ
рд▓рд┐рдВрдХ рдЬреЛрдбрд╝реВрдВрдЧрд╛