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

參考鏈接

  • Ubuntu配置gmssl和openssl,且均使用動態庫,使用時根據需要進行動態切換_MY CUP OF TEA的博客-CSDN博客? 編譯gmssl動態庫并關閉openssl配置,開啟gmssl配置
  • 基于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 "-Wno-error=deprecated-declarations -Wno-deprecated-declarations ")# 指定lib目錄
link_directories(/usr/local/gmssl/lib)# 指定頭文件搜索策略
include_directories(/usr/local/gmssl/include)# 使用指定的源文件來生成目標可執行文件
add_executable(${PROJECT_NAME} ssl_server.cpp)# 將庫鏈接到項目中
target_link_libraries(${PROJECT_NAME} ssl crypto pthread dl)

?代碼

#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;
}

配置

注意事項

ca md too weak:ssl/ssl_rsa.c:301:

  • 如果不指定lib目錄,即刪去link_directories(/usr/local/gmssl/lib)這句話,就會導致一個錯誤
  • 錯誤如下? ?140690036335040:error:140AB18E:SSL routines:SSL_CTX_use_certificate:ca md too weak:ssl/ssl_rsa.c:301:
  • 這個原因是由于/etc/profile文件中,關閉openssl開啟gmssl,并且使用source /etc/profile更新了環境變量,使得gmssl的bin和lib被所有用戶了解,但是編譯器卻沒有識別到,仍然使用的是openssl的動態庫產生的問題
  • 如果指定了lib路徑就不會出問題
  • # 指定lib目錄? link_directories(/usr/local/gmssl/lib)
  • https://blog.csdn.net/CHYabc123456hh/article/details/125773799
  • 出現ca md too weak:ssl/ssl_rsa.c:301的原因是openssl調整了安全級別,要求ca具備更高等級的安全,因此先前發布的證書,如果采用了不安全的算法,比如MD5,就會顯示上述這個錯誤
  • 最簡單的方式就是設置安全級別? SSL_CTX_set_security_level(ctx,1);

SSL_CTX_set_security_level(ctx,1)

  • SSL_CTX_set_security_level函數需要放在SSL_CTX_new生成ssl之后
        //使用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_CTX_set_security_level(ctx,0);
  • ? ? SSL_CTX *ctx = nullptr; /* SSL會話環境 */ ? ? SSL_CTX_set_security_level(ctx,0); 剛創建ctx就設置級別,會導致如下錯誤
  • Process finished with exit code 139 (interrupted by signal 11: SIGSEGV)

客戶端 Client

?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(/usr/local/gmssl/lib)# 指定頭文件搜索策略
include_directories(/usr/local/gmssl/include)# 使用指定的源文件來生成目標可執行文件
add_executable(${PROJECT_NAME} ssl_client.cpp)# 將庫鏈接到項目中
target_link_libraries(${PROJECT_NAME} ssl crypto pthread dl)

代碼

#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;
}

配置

執行結果

?server

?client

?

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

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

相關文章

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&…

小米用戶畫像_企鵝智庫:高學歷用蘋果中老年用華為 男性用小米女性用OV

不同手機品牌都有著自己不同的定位人群&#xff0c;在國內市場目前幾大非常有名的手機品牌分別被三星、蘋果、華為、小米、OV占據&#xff0c;而這些手機品牌的主要購買人群到底是什么樣的呢&#xff1f;企鵝智庫近日發布了一份手機消費者的調研報告&#xff0c;并且根據消費者…

國密gmtls協議-雙證書體系的服務端和客戶端通信代碼

內容介紹 國密的雙證書體系&#xff0c;將證書按照使用目的的不同劃分為加密證書和簽名證書兩種&#xff0c;也就是兩對公私鑰&#xff0c;二者本質一致&#xff0c;均為SM2密鑰對&#xff0c;區別僅體現在用法國密CA體系中&#xff0c;加密密鑰對由CA產生&#xff0c;簽名密鑰…

jwt 私鑰_什么是 JSON Web Token(JWT)

有關本文檔的快速鏈接&#xff0c;請參考頁面提示。什么是 JSON Web Token(JWT)?JSON Web Token (JWT) 作為一個開放的標準 (RFC 7519) 定義了一種簡潔自包含的方法用于通信雙方之間以 JSON 對象的形式安全的傳遞信息。因為有數字簽名&#xff0c;所以這些通信的信息能夠被校驗…

server和client之間進行Socket通信,進行數據切片

參考鏈接 send函數和recv函數 – gudakos memo 注意事項 代碼很low&#xff0c;主要看封裝的Send函數所體現的切片思想即可 server代碼 //udp服務端 #include <stdio.h> #include <stdlib.h> #include <string.h> #include <sys/types.h> #include …

天線下傾角示意圖_常用天線和無源器件技術參數匯總

原標題&#xff1a;常用天線和無源器件技術參數匯總一、天線原理天線的定義&#xff1a; 能夠有效地向空間某特定方向輻射電磁波或能夠有效的接收空間某特定方向來的電磁波的裝置。天線的功能&#xff1a; 能量轉換-導行波和自由空間波的轉換; 定向輻射(接收)-具有一定的方向性…

制作作品圖片_不懂人文后期制作流程?來,大師手把手教你

制作前1、處理一張照片思路決定步驟 想要了解學習的老師可以私聊小編fzhdyx222制作后2、2020年最新Camera Raw局部影調和色調的控制想要了解學習的老師可以私聊小編fzhdyx222制作前3、2020年最新Camera Raw基礎工具細節性運用想要了解學習的老師可以私聊小編fzhdyx222制作后4、…