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安全协议主要用来提供对用户和服务器的认证:对传送的数据进行加密和隐藏:确保数 ...
随机推荐
- 个人网站(sysoft.net.cn)被k,公司名都搜索不出来了,怎么办?
今年上班后,好2019年3月初,上班后(年前大病一场 ,两个月没维护网站),发现公司网站所有收录都掉了,搜索公司名都不不到了,宝宝真是惊呆了. 有些人说是百度出了故障,有人说是百度算法. 说句 ...
- CentOS 7.6安装MySQL 5.7GA版
环境准备 卸载mariadb rpm -qa | grep mariadb rpm -e --nodeps mariadb-libs-5.5.60-1.el7_5.x86_64 centos7 内部集 ...
- jmeter性能分析
1.硬件要求:包括客户端和服务端的cpu,mem,network,disk等,这些硬件设备必须满足性能测试的前提下,才能进行性能测试,否则得到的各项指标不一定是正确的 2.场景分析: 测试前的准备工作 ...
- DirectX12 3D 游戏开发与实战第四章内容(下)
Direct3D的初始化(下) 学习目标 了解Direct3D在3D编程中相对于硬件所扮演的角色 理解组件对象模型COM在Direct3D中的作用 掌握基础的图像学概念,例如2D图像的存储方式,页面翻 ...
- Senparc.Weixin.MP SDK 微信公众平台开发教程(二十二):如何安装 Nuget(dll) 后使用项目源代码调试
最近碰到开发者问:我使用 nuget 安装了 Senparc.Weixin SDK,但是有一些已经封装好的过程想要调试,我又不想直接附加源代码项目,这样就没有办法同步更新了,我应该怎么办? 这其实是一 ...
- 公用的update
包结构: ===================================== jdbc.properties路径:/jdbc-1/src/jdbc.properties 内容: #连接MySQ ...
- 39 (OC) 瀑布流、不规则UI
39 (OC) 瀑布流.不规则UI
- Hbase入门(一)——初识Hbase
本文将介绍大数据的知识和Hbase的基本概念,作为大数据体系中重要的一员,Hbase弥补了Hadoop只能离线批处理的不足,支持存储小文件,随机检索.而这种特性使得Hbase对于实时计算体系的事件存储 ...
- aclocal-1.14: 未找到命令
WARNING: 'aclocal-1.14' is missing on your system. 一条命令解决 autoreconf -ivf
- HTTP协议的运行流程
1.HTTP协议的流程是什么样的呢? (1)http客户端发起请求,创建端口 (2)http服务器在端口监听客户端请求 (3)http服务器向客户端返回状态和内容 更详细的请参考大神:https:// ...