一、公钥/私钥/签名/验证签名/加密/解密/非对称加密

  对称加密:用同一个密码  加密/解密  文件。

  非对称加密:加密用的一个密码,解密用另外一组密码。

  加密解密:公钥加密数据,然后私钥解密。

公钥加密的数据只有它相对应的私钥可以解开,所以数据只有到了有私钥的你这里,才可以解开成有用的数据。

签名和验证签名:私钥加密数据,公钥解密。

  用私钥对数据进行签名,那这个数据就只有配对的公钥可以解开,有这个私钥的只有你,配对的公钥解开了数据,就说明这数据是你发的,这个被称为签名。

二、加密的算法: RSA/DSA/SHA/MD5

  RSA可以用于加/解密,也可以用于签名验签。

  DSA则只能用于签名。

  SHA和MD5:摘要算法

摘要算法:SHA和MD5:.就是通过一种算法,依据数据内容生成一种固定长度的摘要,这串摘要值与原数据存在对应关系。

实际应用过程中,因为需要加密的数据可能会很大,进行加密费时费力,所以一般都会把原数据先进行摘要,然后对这个摘要值进行加密,将原数据的明文和加密后的摘要值一起传给你.这样你解开加密后的摘要值,再和你得到的数据进行的摘要值对应一下就可以知道数据有没有被修改了。

实际应用中,一般都是和对方交换公钥,然后你要发给对方的数据,用他的公钥加密,他得到后用他的私钥解密,他要发给你的数据,用你的公钥加密,你得到后用你的私钥解密,这样最大程度保证了安全性.

三、公钥: CA/PEM/DER/X509/PKCS

四、生成证书

  1、创建私钥:openssl genrsa -out ca/ca-key.pem 1024

       

  2、创建证书请求:openssl req -new -out ca-req.csr -key ca-key.pem

  3、自签署证书:openssl x509 -req -in ca-req.csr -out ca-cert.pem -signkey ca-key.pem -days 3650

   

  4、将证书导出成浏览器支持的.p12格式 :openssl pkcs12 -export -clcerts -in ca-cert.pem -inkey ca-key.pem -out ca.p12

  

  

 // 服务端代码
int Test_openssl_server_v2()
{
OM_NetworkInit(); SSL_CTX *ctx;
SSL *ssl;
X509 *client_cert; char szBuffer[];
int nLen; struct sockaddr_in addr;
int len;
int nListenFd, nAcceptFd; // 初始化
SSLeay_add_ssl_algorithms();
OpenSSL_add_all_algorithms();
SSL_load_error_strings();
ERR_load_BIO_strings(); // 我们使用SSL V3,V2
EXIT_IF_TRUE((ctx = SSL_CTX_new(SSLv23_method())) == NULL); // 要求校验对方证书
SSL_CTX_set_verify(ctx, SSL_VERIFY_PEER, NULL); // 加载CA的证书
EXIT_IF_TRUE(!SSL_CTX_load_verify_locations(ctx, "cacert.cer", NULL)); // 加载自己的证书
EXIT_IF_TRUE(SSL_CTX_use_certificate_file(ctx, "server.cer", SSL_FILETYPE_PEM) <= ); // 加载自己的私钥
EXIT_IF_TRUE(SSL_CTX_use_PrivateKey_file(ctx, "server.key", SSL_FILETYPE_PEM) <= ); // 判定私钥是否正确
EXIT_IF_TRUE(!SSL_CTX_check_private_key(ctx)); // 创建并等待连接
nListenFd = socket(PF_INET, SOCK_STREAM, );
struct sockaddr_in my_addr;
memset(&my_addr, , sizeof(my_addr));
my_addr.sin_family = PF_INET;
my_addr.sin_port = htons();
my_addr.sin_addr.s_addr = inet_addr("127.0.0.1");// INADDR_ANY;
if (bind(nListenFd, (struct sockaddr *)&my_addr, sizeof(struct sockaddr)) == -) {
int a = ;
int b = a;
} //
listen(nListenFd, ); memset(&addr, , sizeof(addr));
len = sizeof(addr);
nAcceptFd = accept(nListenFd, (struct sockaddr *)&addr, (int *)&len);
CPosaLog::Printf(CPosaLog::L_DEBUG, "Accept a connect from [%s:%d]\n",
inet_ntoa(addr.sin_addr), ntohs(addr.sin_port)); // 将连接付给SSL
EXIT_IF_TRUE((ssl = SSL_new(ctx)) == NULL);
SSL_set_fd(ssl, nAcceptFd);
int n1 = SSL_accept(ssl);
if (n1 == -) {
const char* p1 = SSL_state_string_long(ssl);
int a = ;
int b = a;
}
// 进行操作
memset(szBuffer, , sizeof(szBuffer));
nLen = SSL_read(ssl, szBuffer, sizeof(szBuffer));
CPosaLog::Printf(CPosaLog::L_DEBUG, "Get Len %d %s ok\n", nLen, szBuffer); strcat(szBuffer, " this is from server");
SSL_write(ssl, szBuffer, strlen(szBuffer)); // 释放资源
SSL_free(ssl);
SSL_CTX_free(ctx);
closesocket(nAcceptFd); return ;
}

五、server证书

  1、生成server证书:openssl genrsa -out server-key.pem 1024

  

   2、创建证书请求:openssl req -new -out server-req.csr -key server-key.pem

  3、自签署证书:openssl x509 -req -in server-req.csr -out server-cert.pem -signkey server-key.pem -CA ca-cert.pem -CAkey ca-key.pem -CAcreateserial -days 3650

  4、将证书导出成浏览器支持的.p12格式:openssl pkcs12 -export -clcerts -in server-cert.pem -inkey server-key.pem -out server.p12

   

 

  5、完成

   

六、Client证书

  生成server证书:openssl genrsa -out client-key.pem 1024 
  创建证书请求:openssl req -new -out client-req.csr -key client-key.pem
  自签署证书:openssl x509 -req -in client-req.csr -out client-cert.pem -signkey client-key.pem -CA ca-cert.pem -CAkey ca-key.pem -CAcreateserial -days 3650
  将证书导出成浏览器支持的.p12格式:openssl pkcs12 -export -clcerts -in client-cert.pem -inkey client-key.pem -out client.p12

  

七、即:使用相同的ca生成两个证书,一个是server.cer,一个是client.cer,注意生成server.cer的时候必须指明证书可以用于服务端的。

八、代码:

// 服务端代码
int Test_openssl_server_v2()
{
OM_NetworkInit(); SSL_CTX *ctx;
SSL *ssl;
X509 *client_cert; char szBuffer[];
int nLen; struct sockaddr_in addr;
int len;
int nListenFd, nAcceptFd; // 初始化
SSLeay_add_ssl_algorithms();
OpenSSL_add_all_algorithms();
SSL_load_error_strings();
ERR_load_BIO_strings(); // 我们使用SSL V3,V2
EXIT_IF_TRUE((ctx = SSL_CTX_new(SSLv23_method())) == NULL); // 要求校验对方证书
SSL_CTX_set_verify(ctx, SSL_VERIFY_PEER, NULL); // 加载CA的证书
EXIT_IF_TRUE(!SSL_CTX_load_verify_locations(ctx, "cacert.cer", NULL)); // 加载自己的证书
EXIT_IF_TRUE(SSL_CTX_use_certificate_file(ctx, "server.cer", SSL_FILETYPE_PEM) <= ); // 加载自己的私钥
EXIT_IF_TRUE(SSL_CTX_use_PrivateKey_file(ctx, "server.key", SSL_FILETYPE_PEM) <= ); // 判定私钥是否正确
EXIT_IF_TRUE(!SSL_CTX_check_private_key(ctx)); // 创建并等待连接
nListenFd = socket(PF_INET, SOCK_STREAM, );
struct sockaddr_in my_addr;
memset(&my_addr, , sizeof(my_addr));
my_addr.sin_family = PF_INET;
my_addr.sin_port = htons();
my_addr.sin_addr.s_addr = inet_addr("127.0.0.1");// INADDR_ANY;
if (bind(nListenFd, (struct sockaddr *)&my_addr, sizeof(struct sockaddr)) == -) {
int a = ;
int b = a;
} //
listen(nListenFd, ); memset(&addr, , sizeof(addr));
len = sizeof(addr);
nAcceptFd = accept(nListenFd, (struct sockaddr *)&addr, (int *)&len);
CPosaLog::Printf(CPosaLog::L_DEBUG, "Accept a connect from [%s:%d]\n",
inet_ntoa(addr.sin_addr), ntohs(addr.sin_port)); // 将连接付给SSL
EXIT_IF_TRUE((ssl = SSL_new(ctx)) == NULL);
SSL_set_fd(ssl, nAcceptFd);
int n1 = SSL_accept(ssl);
if (n1 == -) {
const char* p1 = SSL_state_string_long(ssl);
int a = ;
int b = a;
}
// 进行操作
memset(szBuffer, , sizeof(szBuffer));
nLen = SSL_read(ssl, szBuffer, sizeof(szBuffer));
CPosaLog::Printf(CPosaLog::L_DEBUG, "Get Len %d %s ok\n", nLen, szBuffer); strcat(szBuffer, " this is from server");
SSL_write(ssl, szBuffer, strlen(szBuffer)); // 释放资源
SSL_free(ssl);
SSL_CTX_free(ctx);
closesocket(nAcceptFd); return ;
}
 // 客户端代码
int Test_openssl_client_v2()
{
OM_NetworkInit(); SSL_METHOD *meth;
SSL_CTX *ctx;
SSL *ssl; int nFd;
int nLen;
char szBuffer[]; // 初始化
SSLeay_add_ssl_algorithms();
OpenSSL_add_all_algorithms();
SSL_load_error_strings();
ERR_load_BIO_strings(); // 我们使用SSL V3,V2
EXIT_IF_TRUE((ctx = SSL_CTX_new(SSLv23_method())) == NULL); // 要求校验对方证书
SSL_CTX_set_verify(ctx, SSL_VERIFY_PEER, NULL); // 加载CA的证书
EXIT_IF_TRUE(!SSL_CTX_load_verify_locations(ctx, "cacert.cer", NULL)); // 加载自己的证书
EXIT_IF_TRUE(SSL_CTX_use_certificate_file(ctx, "client.cer", SSL_FILETYPE_PEM) <= ); // 加载自己的私钥
EXIT_IF_TRUE(SSL_CTX_use_PrivateKey_file(ctx, "client.key", SSL_FILETYPE_PEM) <= ); // 判定私钥是否正确
EXIT_IF_TRUE(!SSL_CTX_check_private_key(ctx)); // new
// 创建连接
nFd = socket(PF_INET, SOCK_STREAM, );
struct sockaddr_in dest;
memset(&dest, , sizeof(dest));
dest.sin_family = AF_INET;
dest.sin_port = htons();
dest.sin_addr.s_addr = inet_addr("127.0.0.1");
if (connect(nFd, (struct sockaddr *) &dest, sizeof(dest)) != ) {
perror("Connect ");
exit(errno);
} // 将连接付给SSL
EXIT_IF_TRUE((ssl = SSL_new(ctx)) == NULL);
SSL_set_fd(ssl, nFd);
int n1 = SSL_connect(ssl);
if (n1 == -) {
int n2 = SSL_get_error(ssl, n1); const char* p1 = SSL_state_string(ssl);
} // 进行操作
sprintf(szBuffer, "this is from client %d", getpid());
int nWriten = SSL_write(ssl, szBuffer, strlen(szBuffer)); // 释放资源
memset(szBuffer, , sizeof(szBuffer));
nLen = SSL_read(ssl, szBuffer, sizeof(szBuffer));
CPosaLog::Printf(CPosaLog::L_DEBUG, "Get Len %d %s ok\n", nLen, szBuffer); SSL_free(ssl);
SSL_CTX_free(ctx);
closesocket(nFd); return ;
}

openssl生成密钥/证书的更多相关文章

  1. openssl生成ssl证书

    openssl生成ssl证书 x509证书一般会用到三类文,key,csr,crt. Key 是私用密钥openssl格,通常是rsa算法. Csr 是证书请求文件,用于申请证书.在制作csr文件的时 ...

  2. 使用openssl生成SSL证书完全参考手册

    一般来说,配置HTTPS/SSL的步骤为: 1.生成足够强度的私钥.需要考虑:算法,广泛采用的一般是RSA.键长度,RSA默认为512,一般应选择2048.密码,虽然私钥不一定要加密存储,但是加密存储 ...

  3. 使用openssl 生成免费证书

    阅读目录 一:什么是openssl? 它的作用是?应用场景是什么? 二:使用openssl生成免费证书 回到顶部 一:什么是openssl? 它的作用是?应用场景是什么? 即百度百科说:openssl ...

  4. openssl 生成免费证书

    原文链接:https://www.cnblogs.com/tugenhua0707/p/10927722.html 一:什么是openssl? 它的作用是?应用场景是什么? 即百度百科说:openss ...

  5. keytool和openssl生成的证书转换

    keytool和openssl生成的证书转换 keytool生成证书示例 生成私钥+证书: keytool -genkey -alias client -keysize 2048 -validity ...

  6. openssl生成https证书

    openssl生成https证书 分类: 其它2009-09-03 16:20 452人阅读 评论(0) 收藏 举报 includemoduleaccessapachessl服务器 openssl生成 ...

  7. OpenSSL 生成自定义证书

    前言 本文用来记录通过OpenSSL生成自定义证书并在浏览器设置可信任 准备 Linux CentOS7 系统 nginx 1.12.2 Windows 10 IE 11 chrome 71 Open ...

  8. nginx反向代理cas-server之2:生成证书,centOS下使用openssl生成CA证书(根证书、server证书、client证书)

    前些天搭好了cas系统,这几天一致再搞nginx和cas的反向代理,一直不成功,但是走http还是测试通过的,最终确定是ssl认证证书这一块的问题,原本我在cas服务端里的tomcat已经配置了证书, ...

  9. openssl生成SSL证书的流程

    SSL证书通过在客户端浏览器和Web服务器之间建立一条SSL安全通道(Secure socketlayer(SSL),SSL安全协议主要用来提供对用户和服务器的认证:对传送的数据进行加密和隐藏:确保数 ...

随机推荐

  1. ubuntu16.4 环境移植ubuntu到zynqMp_zcu102

    安装petalinux 下载petalinux https://www.xilinx.com/support/download 下载 zcu102 ZCU102 BSP 安装petaLinux 把sh ...

  2. 各种浏览器UA值

    UA  User-Agent:用户代理,它是一个特殊字符串头,使得服务器能够识别客户使用的操作系统及版本.CPU 类型.浏览器及版本.浏览器引擎.浏览器语言.浏览器插件等. 标准格式为: 浏览器标识 ...

  3. jmeter 遍历数据库

  4. [Leetcode] 第337题 打家劫舍III

    一.题目描述 在上次打劫完一条街道之后和一圈房屋后,小偷又发现了一个新的可行窃的地区.这个地区只有一个入口,我们称之为“根”. 除了“根”之外,每栋房子有且只有一个“父“房子与之相连.一番侦察之后,聪 ...

  5. [Linux] Vmware 15安装CentOs后显示网络不可用

    转载自:https://blog.csdn.net/chenjin_chenjin/article/details/83617186 在虚拟机上安装好centos7后,ping www.baidu.c ...

  6. linux双网卡绑定为逻辑网卡

    网卡bond是通过多张网卡绑定为一个逻辑网卡,实现本地网卡的冗余,带宽扩容和负载均衡,在生产场景中是一种常用的技术. 生产环境服务器为:DELL 网卡为:光纤 bond需要修改涉及的网卡配置文件 /e ...

  7. java -PDF添加文本水印与图片水印

    java pdf添加水印文本及图片文本 PDF文件添加文本水印: private static int interval = 30; public static void waterMark(Stri ...

  8. 基于操作系统原理的Linux的内存管理

    一.实验目的 1.理解虚拟内存.磁盘缓存的概念. 2.掌握基本的内存管理知识. 3.掌握查看实时查看内存.内存回收的方法 二.实验内容 1. 监控内存使用情况 2. 检查和回收内容 三.实验平台 1. ...

  9. 基于Docker搭建大数据集群(一)Docker环境部署

    本篇文章是基于Docker搭建大数据集群系列的开篇之作 主要内容 docker搭建 docker部署CentOS 容器免密钥通信 容器保存成镜像 docker镜像发布 环境 Linux 7.6 一.D ...

  10. idea设置方法或常量字段上浮显示对应的注释内容

    1.进入idea中,如下图进入设置 如图勾选并设置显示延迟时间 打开文件进行鼠标移动测试 可以看到鼠标移动到字段常量或方法上时显示了对应的注释类容