日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 运维知识 > linux >内容正文

linux

linux下openssl编程

發(fā)布時(shí)間:2025/4/16 linux 24 豆豆
生活随笔 收集整理的這篇文章主要介紹了 linux下openssl编程 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

1、ubuntu下安裝openssl

? ? ??sudo apt-get install openssl?
? ? sudo apt-get install libssl-dev


2、編寫服務(wù)端代碼

//============================================================================ // Name : css.cpp // Author : fjs // Version : // Copyright : Your copyright notice // Description : Hello World in C++, Ansi-style //============================================================================ #include <stdio.h> #include <stdlib.h> #include <errno.h> #include <string.h> #include <sys/types.h> #include <netinet/in.h> #include <sys/socket.h> #include <sys/wait.h> #include <unistd.h> #include <arpa/inet.h> #include <openssl/ssl.h> #include <openssl/err.h>#define MAXBUF 1024int main(int argc, char **argv) {int sockfd, new_fd;socklen_t len;struct sockaddr_in my_addr, their_addr;unsigned int myport, lisnum;char buf[MAXBUF + 1];SSL_CTX *ctx;if (argv[1])myport = atoi(argv[1]);elsemyport = 7838;if (argv[2])lisnum = atoi(argv[2]);elselisnum = 2;/* SSL 庫初始化 */SSL_library_init();/* 載入所有 SSL 算法 */OpenSSL_add_all_algorithms();/* 載入所有 SSL 錯(cuò)誤消息 */SSL_load_error_strings();/* 以 SSL V2 和 V3 標(biāo)準(zhǔn)兼容方式產(chǎn)生一個(gè) SSL_CTX ,即 SSL Content Text */ctx = SSL_CTX_new(SSLv23_server_method());/* 也可以用 SSLv2_server_method() 或 SSLv3_server_method() 單獨(dú)表示 V2 或 V3標(biāo)準(zhǔn) */if (ctx == NULL) {ERR_print_errors_fp(stdout);exit(1);}/* 載入用戶的數(shù)字證書, 此證書用來發(fā)送給客戶端。 證書里包含有公鑰 */if (SSL_CTX_use_certificate_file(ctx, argv[3], SSL_FILETYPE_PEM) <= 0) {ERR_print_errors_fp(stdout);exit(1);}/* 載入用戶私鑰 */if (SSL_CTX_use_PrivateKey_file(ctx, argv[4], SSL_FILETYPE_PEM) <= 0) {ERR_print_errors_fp(stdout);exit(1);}/* 檢查用戶私鑰是否正確 */if (!SSL_CTX_check_private_key(ctx)) {ERR_print_errors_fp(stdout);exit(1);}/* 開啟一個(gè) socket 監(jiān)聽 */if ((sockfd = socket(PF_INET, SOCK_STREAM, 0)) == -1) {perror("socket");exit(1);} elseprintf("socket created\n");bzero(&my_addr, sizeof(my_addr));my_addr.sin_family = PF_INET;my_addr.sin_port = htons(myport);my_addr.sin_addr.s_addr = INADDR_ANY;if (bind(sockfd, (struct sockaddr *) &my_addr, sizeof(struct sockaddr))== -1) {perror("bind");exit(1);} elseprintf("binded\n");if (listen(sockfd, lisnum) == -1) {perror("listen");exit(1);} elseprintf("begin listen\n");while (1) {SSL *ssl;len = sizeof(struct sockaddr);/* 等待客戶端連上來 */if ((new_fd =accept(sockfd, (struct sockaddr *) &their_addr,&len)) == -1) {perror("accept");exit(errno);} elseprintf("server: got connection from %s, port %d, socket %d\n",inet_ntoa(their_addr.sin_addr),ntohs(their_addr.sin_port), new_fd);/* 基于 ctx 產(chǎn)生一個(gè)新的 SSL */ssl = SSL_new(ctx);/* 將連接用戶的 socket 加入到 SSL */SSL_set_fd(ssl, new_fd);/* 建立 SSL 連接 */if (SSL_accept(ssl) == -1) {perror("accept");close(new_fd);break;}/* 開始處理每個(gè)新連接上的數(shù)據(jù)收發(fā) */bzero(buf, MAXBUF + 1);strcpy(buf, "server->client");/* 發(fā)消息給客戶端 */len = SSL_write(ssl, buf, strlen(buf));if (len <= 0) {printf("消息'%s'發(fā)送失敗!錯(cuò)誤代碼是%d,錯(cuò)誤信息是'%s'\n",buf, errno, strerror(errno));goto finish;} elseprintf("消息'%s'發(fā)送成功,共發(fā)送了%d個(gè)字節(jié)!\n",buf, len);bzero(buf, MAXBUF + 1);/* 接收客戶端的消息 */len = SSL_read(ssl, buf, MAXBUF);if (len > 0)printf("接收消息成功:'%s',共%d個(gè)字節(jié)的數(shù)據(jù)\n",buf, len);elseprintf("消息接收失敗!錯(cuò)誤代碼是%d,錯(cuò)誤信息是'%s'\n",errno, strerror(errno));/* 處理每個(gè)新連接上的數(shù)據(jù)收發(fā)結(jié)束 */finish:/* 關(guān)閉 SSL 連接 */SSL_shutdown(ssl);/* 釋放 SSL */SSL_free(ssl);/* 關(guān)閉 socket */close(new_fd);}/* 關(guān)閉監(jiān)聽的 socket */close(sockfd);/* 釋放 CTX */SSL_CTX_free(ctx);return 0; }

3、編寫客戶端代碼

//============================================================================ // Name : cs.cpp // Author : fjs // Version : // Copyright : Your copyright notice // Description : Hello World in C++, Ansi-style //============================================================================ #include <stdio.h> #include <string.h> #include <errno.h> #include <sys/socket.h> #include <resolv.h> #include <stdlib.h> #include <netinet/in.h> #include <arpa/inet.h> #include <unistd.h> #include <openssl/ssl.h> #include <openssl/err.h>#define MAXBUF 1024void ShowCerts(SSL * ssl) {X509 *cert;char *line;cert = SSL_get_peer_certificate(ssl);if (cert != NULL) {printf("數(shù)字證書信息:\n");line = X509_NAME_oneline(X509_get_subject_name(cert), 0, 0);printf("證書: %s\n", line);free(line);line = X509_NAME_oneline(X509_get_issuer_name(cert), 0, 0);printf("頒發(fā)者: %s\n", line);free(line);X509_free(cert);} elseprintf("無證書信息!\n"); }int main(int argc, char **argv) {int sockfd, len;struct sockaddr_in dest;char buffer[MAXBUF + 1];SSL_CTX *ctx;SSL *ssl;if (argc != 3) {printf("參數(shù)格式錯(cuò)誤!正確用法如下:\n\t\t%s IP地址 端口\n\t比如:\t%s 127.0.0.1 80\n此程序用來從某個(gè)""IP 地址的服務(wù)器某個(gè)端口接收最多 MAXBUF 個(gè)字節(jié)的消息",argv[0], argv[0]);exit(0);}/* SSL 庫初始化,參看 ssl-server.c 代碼 */SSL_library_init();OpenSSL_add_all_algorithms();SSL_load_error_strings();ctx = SSL_CTX_new(SSLv23_client_method());if (ctx == NULL) {ERR_print_errors_fp(stdout);exit(1);}/* 創(chuàng)建一個(gè) socket 用于 tcp 通信 */if ((sockfd = socket(AF_INET, SOCK_STREAM, 0)) < 0) {perror("Socket");exit(errno);}printf("socket created\n");/* 初始化服務(wù)器端(對(duì)方)的地址和端口信息 */bzero(&dest, sizeof(dest));dest.sin_family = AF_INET;dest.sin_port = htons(atoi(argv[2]));if (inet_aton(argv[1], (struct in_addr *) &dest.sin_addr.s_addr) == 0) {perror(argv[1]);exit(errno);}printf("address created\n");/* 連接服務(wù)器 */if (connect(sockfd, (struct sockaddr *) &dest, sizeof(dest)) != 0) {perror("Connect ");exit(errno);}printf("server connected\n");/* 基于 ctx 產(chǎn)生一個(gè)新的 SSL */ssl = SSL_new(ctx);SSL_set_fd(ssl, sockfd);/* 建立 SSL 連接 */if (SSL_connect(ssl) == -1)ERR_print_errors_fp(stderr);else {printf("Connected with %s encryption\n", SSL_get_cipher(ssl));ShowCerts(ssl);}/* 接收對(duì)方發(fā)過來的消息,最多接收 MAXBUF 個(gè)字節(jié) */bzero(buffer, MAXBUF + 1);/* 接收服務(wù)器來的消息 */len = SSL_read(ssl, buffer, MAXBUF);if (len > 0)printf("接收消息成功:'%s',共%d個(gè)字節(jié)的數(shù)據(jù)\n",buffer, len);else {printf("消息接收失敗!錯(cuò)誤代碼是%d,錯(cuò)誤信息是'%s'\n",errno, strerror(errno));goto finish;}bzero(buffer, MAXBUF + 1);strcpy(buffer, "from client->server");/* 發(fā)消息給服務(wù)器 */len = SSL_write(ssl, buffer, strlen(buffer));if (len < 0)printf("消息'%s'發(fā)送失敗!錯(cuò)誤代碼是%d,錯(cuò)誤信息是'%s'\n",buffer, errno, strerror(errno));elseprintf("消息'%s'發(fā)送成功,共發(fā)送了%d個(gè)字節(jié)!\n",buffer, len);finish:/* 關(guān)閉連接 */SSL_shutdown(ssl);SSL_free(ssl);close(sockfd);SSL_CTX_free(ctx);return 0; }
4、編譯 :

gcc -o cs cs.c -Wall -g -lssl -lcrypto ? ?//客戶端
gcc -o css css.c -Wall -g -lssl -lcrypto //服務(wù)端

說明:ssl和crypto庫要加上,否則編譯失敗。


5、生產(chǎn)rsa私鑰和證書

openssl genrsa -out fkey.pem 1024
openssl req -new -x509 -key fkey.pem -out CAcert.pem -days 1095

證書服務(wù)端發(fā)給客戶端作為公鑰,要了解具體ssl加密原理,需要更多學(xué)習(xí)。


6、程序運(yùn)行:

./css 7838 1 CAcert.pem fkey.pem
./cs 127.0.0.1 7838

main()函數(shù)argv字符串?dāng)?shù)組傳參。源碼參考網(wǎng)絡(luò)上發(fā)表的。






? ?

總結(jié)

以上是生活随笔為你收集整理的linux下openssl编程的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 奇米成人网| 天天干天天爱天天射 | 我的大叔 | 男人天堂v| 欧美日本免费 | 免费av一区二区 | 91色网站 | 日韩精品播放 | 国产富婆一级全黄大片 | 亚洲av女人18毛片水真多 | 1024你懂的日韩 | 直接看的毛片 | 三级黄色短视频 | 国产一精品一aⅴ一免费 | 在线视频日韩欧美 | 日韩精品在线一区二区三区 | 亚洲蜜桃精久久久久久久久久久久 | 亚洲电影影音先锋 | 国产手机在线播放 | 日本久久高清视频 | 亚洲综合色网站 | 在线观看视频一区二区三区 | 成人免费无码大片a毛片抽搐色欲 | 中文字幕亚洲欧美 | 国产精品一区无码 | 欧美日韩国产一区二区 | 国产成人精品电影 | 亚洲电影在线观看 | www,jizz,com| 91精品国产一区二区无码 | 涩涩在线看 | 视频国产在线 | 国产视频福利在线观看 | 波多野结衣操 | 日韩女同一区二区三区 | 在线免费黄色片 | 91一区二区国产 | 日韩精品一区二区不卡 | 欧美一区二区三区国产 | 爱看av| 国产在线极品 | yellow免费在线观看 | 污视频网址 | 99极品视频| 日本成人网址 | 轻轻色在线观看 | 日本va在线| 男人懂的网站 | 久艹在线视频 | 亚洲欧美在线观看视频 | 中午字幕在线观看 | 亚洲国产精品久久人人爱 | 女人的av | 丝袜人妻一区 | 天天操天天干天天插 | 亚洲免费在线看 | 日韩成人一区二区 | 国产一区二 | 夜夜狠狠擅视频 | 亚洲a v网站 | 亚洲精品国产精品国自产在线 | 久久三区| 精品人妻无码一区二区三区换脸 | 全国男人的天堂网 | jizz日本在线观看 | 精品免费囯产一区二区三区 | 亚洲国产精品久久久久婷婷老年 | 综合成人在线 | 日本不卡一区二区三区在线观看 | 黄色av导航 | 国产在线第二页 | 91蝌蚪91密月 | 原来神马电影免费高清完整版动漫 | 中国av一区 | 成人无码www在线看免费 | 男人天堂久久久 | 亚洲精品乱码久久久久久按摩观 | 亚洲人成在线免费观看 | av毛片网 | 国产youjizz| 日本精品一区在线 | 国产精品一区二区三区四区五区 | 国产成人二区 | 天天做日日做 | 深夜的私人秘书 | 亚洲影院av | 黑人精品一区二区三区不 | 在线观看国产一区 | 欧美性猛交乱大交xxxx | 97人妻天天摸天天爽天天 | 1024金沙人妻一区二区三区 | 4438全国成人免费 | 午夜精品视频一区二区三区在线看 | 国产夫妻久久 | 青青色在线视频 | 亚洲国产第一区 | 毛片免费在线观看视频 | 国产精品1区2区3区4区 | 国产精品无人区 |