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安全协议主要用来提供对用户和服务器的认证:对传送的数据进行加密和隐藏:确保数 ...
随机推荐
- ElasticSearch实战系列二: ElasticSearch的DSL语句使用教程---图文详解
前言 在上一篇中介绍了ElasticSearch集群和kinaba的安装教程,本篇文章就来讲解下 ElasticSearch的DSL语句使用. ElasticSearch DSL 介绍 Elastic ...
- Asp.Net Core2.2 源码阅读系列——控制台日志源码解析
为了让我们第一时间知道程序的运行状态,Asp.Net Core 添加了默认的日志输出服务.这看起来并没有什么问题,对于开发人员也相当友好,但如果不了解日志输出的细节,也有可能因为错误的日志级别配置 ...
- 安全性测试:OWASP ZAP 2.8 使用指南(三):ZAP代理设置
ZAP本地代理设置 如前文所言,ZAP的工作机制,是通过“中间代理”的形式实现. ZAP的代理设置可以从菜单中的:工具 - 选项 - Local Proxies加载. 在这里可以设置ZAP用来接受接入 ...
- SpringBoot和Hibernate整合
1.先使用idea创建maven项目(这个就不详细讲了,很简单的操作) 2.创建完maven项目之后添加springboot依赖,pom.xml文件如下: <?xml version=" ...
- Android手机QQ文件夹解析
注:切勿修改手机QQ文件夹,以免造成不必要的使用问题及无法修复的数据丢失] 安卓手机QQ tencent文件夹解析 QQ下载的聊天背景:tencent→MobileQQ→system_backgrou ...
- 【linux】【jenkins】自动化运维二 安装插件
gitlab安装教程参考:https://www.cnblogs.com/jxd283465/p/11525629.html 1.Maven Integration Plugins Jenkins安装 ...
- WordPress 文章插入的超链接访问不了
这两天学习WordPress的时候,想着插入超链接直接访问地址,但是没成功.比如添加一个百度的超链接点击之后,就会变成 https://网站域名/go/?url=http://www.baidu.co ...
- Linux版本号的数值含义
Linux内核版本有两种:稳定版和开发版 ,Linux内核版本号由3组数字组成:第一个组数字.第二组数字.第三组数字.第一个组数字:目前发布的内核主版本.第二个组数字:偶数表示稳定版本:奇数表示开发中 ...
- js 指定分隔符连接数组元素join()
示例:<script type="text/javascript"> var myarr = new Array(3); myarr[0] = "I" ...
- linux常用开发命令总结
linux常用命令 文件操作命令 1. cd 目录名/目录名 切换目录 cd .. 切换到上一级目录 (change dictionary) Ctrl+C强制退出命令行,回到上一级 2.ls ...