基于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.mzph.cn/news/445899.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

openssl 密码套件相关内容(OID|密码套件)

参考链接 SSL通信双方如何判断对方采用了国密 - Bigben - 博客园滑动验证页面 OpenSSL TLS1.2密码套件推荐安全的TLS协议 | Hexo OID OID是由ISO/IEC、ITU-T国际标准化组织上世纪80年代联合提出的标识机制&#xff0c;其野心很大&#xff0c;为任何类型的对象&#xff08;包…

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;升级…

使用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;因为这些图标并不是同时更新的而存在分批分次推送情况。如下图多数组件已经可以看到…

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;我们就说这是回调函数把一段可执行的代码像参数传递…

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;所以这些通信的信息能够被校验…

天线下倾角示意图_常用天线和无源器件技术参数汇总

原标题&#xff1a;常用天线和无源器件技术参数汇总一、天线原理天线的定义&#xff1a; 能够有效地向空间某特定方向辐射电磁波或能够有效的接收空间某特定方向来的电磁波的装置。天线的功能&#xff1a; 能量转换-导行波和自由空间波的转换; 定向辐射(接收)-具有一定的方向性…

制作作品图片_不懂人文后期制作流程?来,大师手把手教你

制作前1、处理一张照片思路决定步骤 想要了解学习的老师可以私聊小编fzhdyx222制作后2、2020年最新Camera Raw局部影调和色调的控制想要了解学习的老师可以私聊小编fzhdyx222制作前3、2020年最新Camera Raw基础工具细节性运用想要了解学习的老师可以私聊小编fzhdyx222制作后4、…