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

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

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

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

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

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

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

二、加密的算法: 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. React + TypeScript 默认 Props 的处理

    React 中的默认 Props 通过组件的 defaultProps 属性可为其 Props 指定默认值. 以下示例来自 React 官方文档 - Default Prop Values: clas ...

  2. Redis专题(3):锁的基本概念到Redis分布式锁实现

    拓展阅读:Redis闲谈(1):构建知识图谱 Redis专题(2):Redis数据结构底层探秘 近来,分布式的问题被广泛提及,比如分布式事务.分布式框架.ZooKeeper.SpringCloud等等 ...

  3. Python 之父的解析器系列之七:PEG 解析器的元语法

    原题 | A Meta-Grammar for PEG Parsers 作者 | Guido van Rossum(Python之父) 译者 | 豌豆花下猫("Python猫"公众 ...

  4. 隐藏select下拉框的三角按钮

    修改select标签的appearance属性,改成inherit,而不是none. -moz-appearance:inherit;/*?Firefox?*/ -webkit-appearance: ...

  5. redis-分片(转)

    转:https://www.cnblogs.com/houziwty/p/5167075.html 分片(partitioning)就是将你的数据拆分到多个 Redis 实例的过程,这样每个实例将只包 ...

  6. springboot启动后自动退出

    有时新建的springboot启动后自动退出运行,如图所示: 此种情况大都数是因为pom文件加入了tomcat的依赖,与springboot内嵌的tomcat冲突导致,所以只需将pom文件中的tomc ...

  7. 原创电子书《菜鸟程序员成长之路:从技术小白到阿里巴巴Java工程师》

    <菜鸟程序员成长之路:从技术小白到阿里巴巴Java工程师> 国庆节快乐!一年一度长度排第二的假期终于来了. 难得有十一长假,作者也想要休息几天啦. 不管你是选择出门玩,还是在公司加班,在学 ...

  8. 使用 chart 部署 skywalking

    使用 chart 部署 skywalking 本文主要讲述的是如何使用 Helm Charts 将 SkyWalking 部署到 Kubernetes 集群中,相关文档可以参考skywalking-k ...

  9. Docker 本地私有仓库搭建:

    Docker 本地私有仓库搭建: 创建数据卷目录: mkdir /home/sky/registry 用registry镜像启动容器: docker run -d -p 5000:5000 -v /h ...

  10. MySQL-时区导致的时间前后端不一致

    背景 今天早上刚上班,就被同事提示,程序的日期处理有问题.数据库里日期为:2019-05-21 11:00:00 而前端显示的日期为:2019-05-21 16:00:00 分析 那肯定是和时区相关了 ...