基于GmSSL實現server服務端和client客戶端之間SSL通信代碼(升級優化公開版)

參考鏈接

工程搭建介紹

  • Ubuntu安裝GmSSL庫適用于ubuntu18和ubuntu20版本_MY CUP OF TEA的博客-CSDN博客
  • CLion運行程序時添加命令行參數 即設置argv輸入參數_MY CUP OF TEA的博客-CSDN博客
  • 基于SM2證書實現SSL通信_MY CUP OF TEA的博客-CSDN博客
  • 基于Gmssl庫靜態編譯,實現服務端和客戶端之間的SSL通信_MY CUP OF TEA的博客-CSDN博客
  • 基于openssl和國密算法生成CA、服務器和客戶端證書_MY CUP OF TEA的博客-CSDN博客
  • openssl實現雙向認證教程(服務端代碼+客戶端代碼+證書生成)_MY CUP OF TEA的博客-CSDN博客
  • mac系統使用 clion遠程調試redis4源碼_跡憶客??target_link_libraries

相關函數介紹

  • dtls到srtp的整個流程_小獅子slioner的博客-CSDN博客
  • dtls_srtp學習筆記_weixin_30779691的博客-程序員宅基地 - 程序員宅基地? ?SSL_export_keying_material
  • C語言inet_aton()函數:將網絡地址轉成網絡二進制的數字_C語言中文網??
  • /docs/man1.0.2/man3/SSL_CTX_set_mode.html
  • /docs/man1.0.2/man3/SSLeay_add_ssl_algorithms.html

Server

層次結構

  • lib存放靜態編譯gmssl代碼生成的靜態庫,即libssl.a和libcrypto.a
  • pem存放證書文件,因為SSL雙向驗證,服務端會驗證客戶端的證書,因此服務端存放客戶端的證書和私鑰,以及生成客戶端證書時用于簽名的ca證書

Code

#include <cstdio>
#include <cstdlib>
#include <cerrno>
#include <cstring>
#include <netinet/in.h>
#include <sys/socket.h>
#include <unistd.h>
#include <arpa/inet.h>
#include <openssl/ssl.h>
#include <openssl/err.h>#define MAXBUF 1500void ShowCerts(SSL * ssl)
{X509 *cert;char *line;cert = SSL_get_peer_certificate(ssl);// SSL_get_verify_result()是重點,SSL_CTX_set_verify()只是配置啟不啟用并沒有執行認證,調用該函數才會真證進行證書認證// 如果驗證不通過,那么程序拋出異常中止連接if(SSL_get_verify_result(ssl) == X509_V_OK){printf("證書驗證通過\n");}if (cert != nullptr) {printf("數字證書信息:\n");line = X509_NAME_oneline(X509_get_subject_name(cert), nullptr, 0);printf("證書: %s\n", line);free(line);line = X509_NAME_oneline(X509_get_issuer_name(cert), nullptr, 0);printf("頒發者: %s\n", line);free(line);X509_free(cert);} elseprintf("無證書信息!\n");
}int main(int argc, char **argv) {int listen_fd = -1; /* TCP監聽套接字 */int accept_fd = -1; /* 已連接TCP套接字 */struct sockaddr_in server_addr, client_addr;bzero(&server_addr, sizeof(server_addr));SSL_CTX *ctx = nullptr; /* SSL會話環境 */SSL *ssl = nullptr; /* SSL安全套接字 */socklen_t len;char buf[MAXBUF]={0};  /* 服務器接收數據buffer */if( 3!=argc ){printf("argcment wrong:ip port\n");}SSL_library_init(); /* SSL 庫初始化 */SSLeay_add_ssl_algorithms();OpenSSL_add_all_algorithms();  /* 載入所有 SSL 算法 */SSL_load_error_strings(); /* 載入所有 SSL 錯誤消息 */
//    ERR_load_BIO_strings();//TCP服務器:創建、綁定、監聽if ((listen_fd = socket(PF_INET, SOCK_STREAM, 0)) == -1) {perror("socket create wrong\n");exit(1);} elseprintf("socket created\n");server_addr.sin_family = PF_INET;server_addr.sin_port = htons(atoi(argv[2]));server_addr.sin_addr.s_addr = inet_addr(argv[1]);;if (bind(listen_fd, (struct sockaddr *) &server_addr, sizeof(struct sockaddr))== -1) {perror("bind wrong\n");exit(1);} elseprintf("binded success\n");int lisnum = 2;do{//使用SSL_CTX_new()創建會話環境,建立連接時要使用協議由TLS_server_method()來定。如果這一步出錯,需要查看錯誤棧來查看原因if(nullptr == (ctx = SSL_CTX_new( TLSv1_2_method())))		//using sm3, TLSv1_2_method{ERR_print_errors_fp(stdout);break;}// 雙向驗證// SSL_VERIFY_PEER---要求對證書進行認證,沒有證書也會放行// SSL_VERIFY_FAIL_IF_NO_PEER_CERT---要求客戶端需要提供證書,但驗證發現單獨使用沒有證書也會放行SSL_CTX_set_verify(ctx, SSL_VERIFY_PEER|SSL_VERIFY_FAIL_IF_NO_PEER_CERT, nullptr);// 設置信任根證書if(SSL_CTX_load_verify_locations(ctx, "/home/chy-cpabe/CLionProjects/learn_GmSSL_server/pem/CaCert.pem", nullptr) != 1){printf("SSL_CTX_load_verify_locations error\n");ERR_print_errors_fp(stdout);break;}/* 載入用戶的數字證書, 此證書用來發送給客戶端。 證書里包含有公鑰 */if( 0>=SSL_CTX_use_certificate_file(ctx, "/home/chy-cpabe/CLionProjects/learn_GmSSL_server/pem/HuiguanCert.pem", SSL_FILETYPE_PEM/*SSL_FILETYPE_ASN1*/) ) /* 為SSL會話加載用戶證書 */{ERR_print_errors_fp(stdout);break;}/* 載入用戶私鑰 */if( 0>=SSL_CTX_use_PrivateKey_file(ctx, "/home/chy-cpabe/CLionProjects/learn_GmSSL_server/pem/HuiguanKey.pem", SSL_FILETYPE_PEM/*SSL_FILETYPE_ASN1*/) ) /* 為SSL會話加載用戶私鑰 */{ERR_print_errors_fp(stdout);break;}/* 檢查用戶私鑰是否正確 */if(!SSL_CTX_check_private_key(ctx))                                 										 /* 驗證私鑰和證書是否相符 */{ERR_print_errors_fp(stdout);break;}if (listen(listen_fd, lisnum) == -1) {perror("listen wrong\n");exit(1);} elseprintf("begin listen\n");len = sizeof(struct sockaddr);/* 等待客戶端連上來 */if ((accept_fd = accept(listen_fd, (struct sockaddr *) &client_addr, &len))== -1) {perror("accept wrong\n");exit(errno);} else{printf("server: got connection from %s, port %d, socket %d\n",inet_ntoa(client_addr.sin_addr), ntohs(client_addr.sin_port),accept_fd);}ssl = SSL_new(ctx); /* 基于 ctx 產生一個新的 SSL */SSL_set_fd(ssl, accept_fd); /* 將連接用戶的 socket 加入到 SSL *//* 建立 SSL 連接 */if (SSL_accept(ssl) == -1) {perror("accept wrong\n");SSL_shutdown(ssl);SSL_free(ssl);ssl= nullptr;close(accept_fd);accept_fd=-1;break;}ShowCerts(ssl);/* 開始處理每個新連接上的數據收發 */bzero(buf, MAXBUF + 1);strcpy(buf, "server->client");/* 發消息給客戶端 */len = SSL_write(ssl, buf, strlen(buf));if (len <= 0) {printf("消息'%s'發送失敗!錯誤代碼是%d,錯誤信息是'%s'\n", buf, errno,strerror(errno));goto finish;} elseprintf("消息'%s'發送成功,共發送了%d個字節!\n", buf, len);bzero(buf, MAXBUF + 1);/* 接收客戶端的消息 */len = SSL_read(ssl, buf, MAXBUF);if (len > 0)printf("接收消息成功:'%s',共%d個字節的數據\n", buf, len);elseprintf("消息接收失敗!錯誤代碼是%d,錯誤信息是'%s'\n",errno, strerror(errno));/* 處理每個新連接上的數據收發結束 */finish:/* 關閉 SSL 連接 */SSL_shutdown(ssl);/* 釋放 SSL */SSL_free(ssl);ssl = nullptr;/* 關閉 socket */close(accept_fd);accept_fd = -1;}while(1);/* 關閉監聽的 socket */close(listen_fd);listen_fd = -1;/* 釋放 CTX */SSL_CTX_free(ctx);ctx = nullptr;return 0;
}

CMakeLists.txt

cmake_minimum_required(VERSION 3.22)project(ssl_server)
set(CMAKE_CXX_STANDARD 11)# 忽略警告
set(CMAKE_CXX_FLAGS "-Wno-error=deprecated-declarations -Wno-deprecated-declarations ")# 指定lib目錄link_directories(${PROJECT_SOURCE_DIR}/lib)# 指定頭文件搜索策略
include_directories(/usr/local/gmssl/include)# 使用指定的源文件來生成目標可執行文件
add_executable(${PROJECT_NAME} ssl_server.cpp)# 將庫鏈接到項目中
target_link_libraries(${PROJECT_NAME} libssl.a libcrypto.a pthread dl)

配置執行輸入參數

  • CLion運行程序時添加命令行參數 即設置argv輸入參數_MY CUP OF TEA的博客-CSDN博客
  • 127.0.0.1
    7838

執行結果

Client

層次結構

  • lib存放靜態編譯gmssl代碼生成的靜態庫,即libssl.a和libcrypto.a
  • pem存放證書文件,因為SSL雙向驗證,客戶端同樣會驗證客戶端的證書,因此客戶端存放服務端的證書和私鑰,以及生成服務端證書時用于簽名的ca證書

Code

#include <cstdio>
#include <cstring>
#include <cerrno>
#include <sys/socket.h>
#include <cstdlib>
#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);// SSL_get_verify_result()是重點,SSL_CTX_set_verify()只是配置啟不啟用并沒有執行認證,調用該函數才會真證進行證書認證// 如果驗證不通過,那么程序拋出異常中止連接if(SSL_get_verify_result(ssl) == X509_V_OK){printf("證書驗證通過\n");}if (cert != nullptr) {printf("數字證書信息:\n");line = X509_NAME_oneline(X509_get_subject_name(cert), nullptr, 0);printf("證書: %s\n", line);free(line);line = X509_NAME_oneline(X509_get_issuer_name(cert), nullptr, 0);printf("頒發者: %s\n", line);free(line);X509_free(cert);} elseprintf("無證書信息!\n");
}static void PrintData(char *p, char *buf,int len,char *filename)
{char *name=p;printf("%s[%d]:\n",p,len);for (p=buf; p && p++-buf<len;)printf("%02x%c",(unsigned char)p[-1],(!((p-buf)%16) || p-buf==len)?'\n':' ');
//	if (filename) FileWrite(name,buf,len,filename);
}int main(int argc, char **argv)
{int sock_fd = -1;            /* TCP套接字    */int len = 0;                 /* SSL會話環境 */SSL *ssl = nullptr;          /* SSL安全套接字 */struct sockaddr_in ser_addr; /* 服務器地址 */bzero(&ser_addr, sizeof(ser_addr));SSL_CTX *ctx = nullptr;char buffer[MAXBUF + 1];if( argc != 3 ){printf("argcment wrong:ip port content\n");exit(0);}/* SSL 庫初始化,參看 ssl-server.c 代碼 */SSL_library_init();SSLeay_add_ssl_algorithms();OpenSSL_add_all_algorithms();SSL_load_error_strings();
//    ERR_load_BIO_strings();do{/* 申請SSL會話環境 */if( nullptr==(ctx=SSL_CTX_new(TLSv1_2_method())) )    //使用SSL_CTX_new()創建會話環境,建立連接時要使用協議由TLS_client_method()來定,服務器由對應的TLS_server_method()來定。如果這一步出錯,需要查看錯誤棧來查看原因{ERR_print_errors_fp(stdout);break;}// 雙向驗證// SSL_VERIFY_PEER---要求對證書進行認證,沒有證書也會放行// SSL_VERIFY_FAIL_IF_NO_PEER_CERT---要求客戶端需要提供證書,但驗證發現單獨使用沒有證書也會放行SSL_CTX_set_verify(ctx, SSL_VERIFY_PEER|SSL_VERIFY_FAIL_IF_NO_PEER_CERT, nullptr);// 設置信任根證書if (SSL_CTX_load_verify_locations(ctx, "/home/chy-cpabe/CLionProjects/learn_GmSSL_server/pem/CaCert.pem",nullptr)<=0){ERR_print_errors_fp(stdout);exit(1);}/* 載入用戶的數字證書, 此證書用來發送給客戶端。 證書里包含有公鑰 */if (SSL_CTX_use_certificate_file(ctx, "/home/chy-cpabe/CLionProjects/ssl_client/src/pem/TerminalCert.pem", SSL_FILETYPE_PEM) <= 0) {ERR_print_errors_fp(stdout);exit(1);}/* 載入用戶私鑰 */if (SSL_CTX_use_PrivateKey_file(ctx, "/home/chy-cpabe/CLionProjects/ssl_client/src/pem/TerminalKey.pem", 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);}//https://www.openssl.org/docs/man1.0.2/man3/SSL_CTX_set_mode.htmlSSL_CTX_set_mode(ctx, SSL_MODE_AUTO_RETRY);/* 創建一個 socket 用于 tcp 通信 */if(-1==(sock_fd=socket(AF_INET, SOCK_STREAM, 0)) ){printf("creat socket wrong\n");break;}printf("socket created\n");/* 初始化服務器端(對方)的地址和端口信息 */ser_addr.sin_family = AF_INET;ser_addr.sin_port = htons(atoi(argv[2]));ser_addr.sin_addr.s_addr = inet_addr(argv[1]);//將網絡地址轉成網絡二進制的數字//http://c.biancheng.net/cpp/html/362.html//另外一種寫法
/*		if (inet_aton(argv[1], (struct in_addr *) &ser_addr.sin_addr.s_addr) == 0) {perror(argv[1]);exit(errno);}
*/printf("address created\n");//建立連接if( -1==(connect(sock_fd, (struct sockaddr *)&ser_addr, sizeof(ser_addr))) ){printf("connect wrong\n");break;}printf("server connected\n");/* 基于 ctx 產生一個新的 SSL */ssl = SSL_new(ctx);SSL_set_fd(ssl, sock_fd);/* 建立 SSL 連接 */if (SSL_connect(ssl) == -1)ERR_print_errors_fp(stderr);else {printf("The relevant information is as follows:\n");printf("-->ssl version %s\n",SSL_get_version(ssl));printf("-->ssleay version %s\n",SSLeay_version(0));printf("-->Connected with %s encryption\n", SSL_get_cipher(ssl));ShowCerts(ssl);}//導出key和saltunsigned char buf[16];int err = -1;err = SSL_export_keying_material(ssl, buf, 16, nullptr,0, nullptr, 0, 1);if(err != 1){printf("err=%d\n",err);}else{PrintData("SSL_export_keying_material", (char*)buf, 16, nullptr);}/* 接收對方發過來的消息,最多接收 MAXBUF 個字節 */bzero(buffer, MAXBUF + 1);/* 接收服務器來的消息 */len = SSL_read(ssl, buffer, MAXBUF);if (len > 0)printf("接收消息成功:'%s',共%d個字節的數據\n",buffer, len);else {printf("消息接收失敗!錯誤代碼是%d,錯誤信息是'%s'\n",errno, strerror(errno));goto finish;}bzero(buffer, MAXBUF + 1);strcpy(buffer, "from client->server");/* 發消息給服務器 */len = SSL_write(ssl, buffer, strlen(buffer));if (len < 0)printf("消息'%s'發送失敗!錯誤代碼是%d,錯誤信息是'%s'\n",buffer, errno, strerror(errno));elseprintf("消息'%s'發送成功,共發送了%d個字節!\n",buffer, len);/* 處理每個新連接上的數據收發結束 */finish:/* 關閉 SSL 連接 */SSL_shutdown(ssl);/* 釋放 SSL */SSL_free(ssl);ssl = nullptr;}while(0);/* 關閉socket */close(sock_fd);sock_fd = -1;/* 釋放 CTX */SSL_CTX_free(ctx);ctx = nullptr;return 0;
}

CMakeLists.txt

cmake_minimum_required(VERSION 3.22)
project(ssl_client)set(CMAKE_CXX_STANDARD 11)# 忽略警告
set(CMAKE_CXX_FLAGS "-Wno-error=deprecated-declarations -Wno-deprecated-declarations ")# 指定lib目錄
link_directories(${PROJECT_SOURCE_DIR}/lib)# 指定頭文件搜索策略
include_directories(/usr/local/gmssl/include)link_libraries(ssl crypto)# 使用指定的源文件來生成目標可執行文件
add_executable(${PROJECT_NAME} ssl_client.cpp)# 將庫鏈接到項目中
target_link_libraries(${PROJECT_NAME} libssl.a libcrypto.a pthread dl)

配置執行輸入參數

  • 127.0.0.1
    7838

執行結果

?

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/445899.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/445899.shtml
英文地址,請注明出處:http://en.pswp.cn/news/445899.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

easyui 表頭合并_JQuery EasyUI DataGrid動態合并(標題)單元) 一

JS&#xff1a;/*** EasyUI DataGrid根據字段動態合并單元格* param fldList 要合并table的id* param fldList 要合并的列,用逗號分隔(例如&#xff1a;"name,department,office");*/function MergeCells(tableID, fldList) {var Arr fldList.split(",");…

openssl 密碼套件相關內容(OID|密碼套件)

參考鏈接 SSL通信雙方如何判斷對方采用了國密 - Bigben - 博客園滑動驗證頁面 OpenSSL TLS1.2密碼套件推薦安全的TLS協議 | Hexo OID OID是由ISO/IEC、ITU-T國際標準化組織上世紀80年代聯合提出的標識機制&#xff0c;其野心很大&#xff0c;為任何類型的對象&#xff08;包…

墨刀可以導入文件嗎_墨刀和Sketch擦出的火花

墨刀開發的Sketch插件終于從內測中脫殼而出了&#xff0c;可以將Sketch中的Artboard直接導入墨刀中&#xff0c;然后進行交互操作(頁面跳轉)的鏈接設置。一時手癢&#xff0c;趕緊試了試&#xff0c;也把使用過程和感受分享給大家。(然而非要拖到周一才發)使用條件1)有Mac(因為…

Ubuntu配置gmssl和openssl,且均使用動態庫,使用時根據需要進行動態切換

前情提要 openssl和gmssl如果想要共存&#xff0c;只能一個是動態庫&#xff0c;一個是靜態庫配置openssl和gmssl無特定的編譯順序要求openssl3.x版本是未來趨勢&#xff0c;openssl1.1.x等版本只是適用于基礎軟件包&#xff0c;后期將會刪除配置文件 /etc/ld.so.conf文件只用…

thymeleaf動態選中select_一些LowPoly動態漸變效果實現

這篇文章根大家分享一些LowPoly動態效果的制作方法&#xff0c;由于使用的是uv采樣方式效率很高&#xff0c;手機也可以隨意使用&#xff0c;我們先來看一些效果的參考 本文將在Unity3D中還原這些效果,如果你學會后當然可以在你喜歡的引擎中實現~如果一篇太長有可能會分多篇&am…

使用Clion和gmssl動態庫實現服務器server和客戶端client之間的SSL通信

參考鏈接 Ubuntu配置gmssl和openssl&#xff0c;且均使用動態庫&#xff0c;使用時根據需要進行動態切換_MY CUP OF TEA的博客-CSDN博客 編譯gmssl動態庫并關閉openssl配置&#xff0c;開啟gmssl配置基于GmSSL實現server服務端和client客戶端之間SSL通信代碼&#xff08;升級…

shiro 攔截未登錄的ajax_Shiro是如何攔截未登錄請求的(二)

/*** 重寫父類獲取sessionID的方法,若請求為APP或者H5則從請求頭中取出token,若為PC端后臺則從cookie中獲取** param request* param response* return*/Overrideprotected Serializable getSessionId(ServletRequest request, ServletResponse response){if (!(request instan…

使用Clion和openssl動態庫實現服務器server和客戶端client之間的SSL通信

參考鏈接 使用Clion和gmssl動態庫實現服務器server和客戶端client之間的SSL通信_MY CUP OF TEA的博客-CSDN博客 服務端server CMakeLists.txt文件 cmake_minimum_required(VERSION 3.22)project(ssl_server) set(CMAKE_CXX_STANDARD 11)# 忽略警告 set(CMAKE_CXX_FLAGS &quo…

使用Clion和gmssl動態庫實現服務器server和客戶端client之間的SSL通信,測試指定密碼套件

參考鏈接 列出gmssl支持的國密算法TLS1.x密碼套件_liuqun69的博客-CSDN博客使用Clion和gmssl動態庫實現服務器server和客戶端client之間的SSL通信_MY CUP OF TEA的博客-CSDN博客 注意事項 GM/T 標準涵蓋 2 個協議&#xff1a;- SSL VPN 協議 (GM/T 0024-2014)- IPSec VPN 協議…

樣式緩存沒更新_差點沒認出來:Office 2019/365桌面新圖標來啦

微軟應該是從昨天晚上開始就向Microsoft Office 正式版通道推送新圖標(測試版早就推送了)&#xff0c;主要包括的是桌面文檔顯示圖標。目前微軟更新圖標的速度有些慢并且還有些混亂&#xff0c;因為這些圖標并不是同時更新的而存在分批分次推送情況。如下圖多數組件已經可以看到…

在Ubuntu上安裝Git

安裝步驟 首先&#xff0c;確認系統是否已安裝git&#xff0c;可以通過git指令進行查看&#xff0c;如果沒有&#xff0c;則輸入sudo apt-get install git命令進行安裝。 安全配置 安裝完成后進行git配置&#xff0c;輸入指令git config --global user.name "xxx"…

10kv線路負載率計算_電工必懂計算公式,你若不會,如何立足于電力行業?

一電力變壓器額定視在功率Sn200KVA&#xff0c;空載損耗Po0.4KW&#xff0c;額定電流時的短路損耗PK2.2KW,測得該變壓器輸出有功功率P2&#xff1d;140KW時&#xff0c;二次則功率因數20.8。求變壓器此時的負載率b 和工作效率。解&#xff1a;因P2bSn2100%bP2(Sn2)100%140(2000…

在基于 Ubuntu 的 Linux 發行版上安裝 Wireshark

參考鏈接 Ubuntu 上 Wireshark 的安裝與使用 - 知乎https://www.myfreax.com/how-to-add-apt-repository-in-ubuntu/ 前情提要 使用Ubuntu軟件中心或命令行apt或apt-get安裝軟件包時&#xff0c;這些軟件包是從一個或多個apt軟件存儲庫中下載的。 APT存儲庫是一個網絡服務器或…

使用wireshark抓包,驗證客戶端和服務端SSL通信時指定的算法套件

前情提要 使用Clion和gmssl動態庫實現服務器server和客戶端client之間的SSL通信&#xff0c;測試指定密碼套件_MY CUP OF TEA的博客-CSDN博客在基于 Ubuntu 的 Linux 發行版上安裝 Wireshark_MY CUP OF TEA的博客-CSDN博客本地搭建server和客戶端使用端口進行數據通信&#xf…

r語言隨機森林回歸預測_從零實現回歸隨機森林

一、前言回歸隨機森林作為一種機器學習和數據分析領域常用且有效的算法&#xff0c;對其原理和代碼實現過程的掌握是非常有必要的。為此&#xff0c;本文將著重介紹從零開始實現回歸隨機森林的過程&#xff0c;對于隨機森林和決策樹的相關理論原理將不做太深入的描述。本文的目…

openssl編程-基礎知識-回調函數

參考內容 OpenSSL編程 趙春平 回調函數 回調函數就是一個通過函數指針調用的函數。如果你把函數的指針&#xff08;地址&#xff09;作為參數傳遞給另一個函數&#xff0c;當這個指針被用來調用其所指向的函數時&#xff0c;我們就說這是回調函數把一段可執行的代碼像參數傳遞…

hive插件 ranger_Apache Ranger及Hive權限控制

一、Ranger概述1.Ranger簡介Apache Ranger提供一個集中式安全管理框架, 并解決授權和審計。它可以對Hadoop生態的組件如HDFS、Yarn、Hive、Hbase等進行細粒度的數據訪問控制。通過操作Ranger控制臺,管理員可以輕松的通過配置策略來控制用戶訪問權限。本文章介紹Ranger與Hive集成…

openssl編程-基礎知識-OpenSSL簡介

參考鏈接 在ubuntu環境下執行openssl編譯和安裝_MY CUP OF TEA的博客-CSDN博客_openssl ubuntuOpenSSL編程 趙春平 OpenSSL 簡介 它提供的主要功能有&#xff1a;SSL協議實現(包括SSLv2、SSLv3和TLSv1)、大量軟算法(對稱/非對稱/摘要)、大數運算、非對稱算法密鑰生成、ASN.1編…

linux修改文件句柄數生效_linux系統層面調優和常見的面試題

linux系統層面調優和常見的面試題?mp.weixin.qq.com無論對Spark集群&#xff0c;還是Hadoop集群等大數據相關的集群進行調優&#xff0c;對linux系統層面的調優都是必不可少的&#xff0c;這里主要介紹3種常用的調優&#xff1a;1.linux文件句柄linux在整個系統層面和單個進程…

openssl編程-基礎知識-OpenSSL堆棧

堆棧介紹 堆棧是一種先進后出的數據結構openssl 大量采用堆棧來存放數據。它實現了一 個通用的堆棧&#xff0c;可以方便的存儲任意數據它實現了許多基本的堆棧操作&#xff0c;主要有&#xff1a;堆棧拷貝(sk_dup)、構建新堆棧&#xff08;sk_new_null&#xff0c;sk_new&…