openssl生成密钥/证书
一、公钥/私钥/签名/验证签名/加密/解密/非对称加密
对称加密:用同一个密码 加密/解密 文件。
非对称加密:加密用的一个密码,解密用另外一组密码。
加密解密:公钥加密数据,然后私钥解密。
公钥加密的数据只有它相对应的私钥可以解开,所以数据只有到了有私钥的你这里,才可以解开成有用的数据。
签名和验证签名:私钥加密数据,公钥解密。
用私钥对数据进行签名,那这个数据就只有配对的公钥可以解开,有这个私钥的只有你,配对的公钥解开了数据,就说明这数据是你发的,这个被称为签名。
二、加密的算法: 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生成密钥/证书的更多相关文章
- openssl生成ssl证书
openssl生成ssl证书 x509证书一般会用到三类文,key,csr,crt. Key 是私用密钥openssl格,通常是rsa算法. Csr 是证书请求文件,用于申请证书.在制作csr文件的时 ...
- 使用openssl生成SSL证书完全参考手册
一般来说,配置HTTPS/SSL的步骤为: 1.生成足够强度的私钥.需要考虑:算法,广泛采用的一般是RSA.键长度,RSA默认为512,一般应选择2048.密码,虽然私钥不一定要加密存储,但是加密存储 ...
- 使用openssl 生成免费证书
阅读目录 一:什么是openssl? 它的作用是?应用场景是什么? 二:使用openssl生成免费证书 回到顶部 一:什么是openssl? 它的作用是?应用场景是什么? 即百度百科说:openssl ...
- openssl 生成免费证书
原文链接:https://www.cnblogs.com/tugenhua0707/p/10927722.html 一:什么是openssl? 它的作用是?应用场景是什么? 即百度百科说:openss ...
- keytool和openssl生成的证书转换
keytool和openssl生成的证书转换 keytool生成证书示例 生成私钥+证书: keytool -genkey -alias client -keysize 2048 -validity ...
- openssl生成https证书
openssl生成https证书 分类: 其它2009-09-03 16:20 452人阅读 评论(0) 收藏 举报 includemoduleaccessapachessl服务器 openssl生成 ...
- OpenSSL 生成自定义证书
前言 本文用来记录通过OpenSSL生成自定义证书并在浏览器设置可信任 准备 Linux CentOS7 系统 nginx 1.12.2 Windows 10 IE 11 chrome 71 Open ...
- nginx反向代理cas-server之2:生成证书,centOS下使用openssl生成CA证书(根证书、server证书、client证书)
前些天搭好了cas系统,这几天一致再搞nginx和cas的反向代理,一直不成功,但是走http还是测试通过的,最终确定是ssl认证证书这一块的问题,原本我在cas服务端里的tomcat已经配置了证书, ...
- openssl生成SSL证书的流程
SSL证书通过在客户端浏览器和Web服务器之间建立一条SSL安全通道(Secure socketlayer(SSL),SSL安全协议主要用来提供对用户和服务器的认证:对传送的数据进行加密和隐藏:确保数 ...
随机推荐
- 装系统------- 了解常用的启动方式以及如何进入bios
1.从硬盘启动:这种方式提供了最简单的维护解决方案,其基本原理就是增加一个系统的开机启动项,每次开机的时候您都可以选择是进入本地系统还是进入PE. 安装程序并不将PE的启动项作为默认启动项,而是提供一 ...
- [VB.NET Tips]再谈字符串连接之内置池
CLR自动维护一个称为"内置池"(暂存池)(intern pool)的表,在编译时此表包含程序中声明的每个唯一的字符串常量的单个实例,以及以编程方式创建的String类的任何唯一实 ...
- [C++]类的设计(2)——拷贝控制(析构和三五法则)
1.析构函数:释放对象使用的资源,并销毁对象的非static数据成员:析构函数不接受参数,因此不能被重载.对于一个给定类,有且只有一个析构函数. 2.析构函数的组成:一个函数体+一个析构部分(im ...
- Mysql - 关于relay_log_recovery参数的测试
一.概述 官方文档中对relay_log_recovery参数的解释 Enables automatic relay log recovery immediately following server ...
- Docker下实战zabbix三部曲之二:监控其他机器
在上一章<Docker下实战zabbix三部曲之一:极速体验>中,我们快速安装了zabbix server,并登录管理页面查看了zabbix server所在机器的监控信息,但是在实际场景 ...
- java架构之路-(mysql底层原理)Mysql之让我们再深撸一次mysql
让我再深撸一次mysql吧,这次主要以应对面试来说说mysql,大概几个方向,索引结构,查询引擎,索引优化,explain的详解和trace工具的使用. 索引: 我们先来看一下mysql的B+tree ...
- (七十六)c#Winform自定义控件-表单验证组件
前提 入行已经7,8年了,一直想做一套漂亮点的自定义控件,于是就有了本系列文章. GitHub:https://github.com/kwwwvagaa/NetWinformControl 码云:ht ...
- Spring Security 梳理 - session
Spring Security默认的行为是每个登录成功的用户会新建一个Session.这也就是下面的配置的效果: <http create-session="ifRequired&qu ...
- 使用.net core3.0 正式版创建Winform程序
前阵子一直期待.net core3.0正式版本的出来,以为这个版本出来,Winform程序又迎来一次新生了,不过9.23日出来的马上下载更新VS,创建新的.net core Winform项目,发现并 ...
- dede tag标签静态化
看回那2个文件夹即可,txt说明书我已经修改过. 下面说一下tag标签静态化之后在内容页.列表页中如何使用. 内容页中沿用之前的方法即可: {dede:tag sort='new' getall='0 ...