Linux下使用openssl加密socket

本文详细介绍了在Linux系统中如何使用OpenSSL创建证书,包括创建证书的步骤、可能遇到的问题以及解决办法。同时,讲解了客户端和服务器端的配置,包括初始化SSL会话、设置验证方式、加载证书等,并提供了简单的测试方法来验证通信的正确性。
摘要由CSDN通过智能技术生成

1.创建证书

1.1步骤

1.首先我们需要将之前安装好的openssl文件中的openssl.cnf 拷贝到当前目录下,如图所示:

cp /usr/local/ssl/bin/openssl.cnf ./

2.接下来就是创建加密所需要的key和CSR文件,分别是:openssl genrsa -des3 -out server.key 1024openssl rsa -in server.key -out server.key,然后再交给CA签名生成服务器的证书openssl req -new -key server.key -out server.csr -config openssl.cnf
在这里插入图片描述
客户端重复相同的步骤
在这里插入图片描述
3.在继续下面操作前,将openssl.conf文件打开,查看其dir路径(这里可以使用pwd查看当前路径)将其修改为dir = /openssl/client/demoCA,(跟后面创建的路径一致)否则下面的步骤会提示路径无法找到。mkdir demoCAmkdir demoCA/newcerts创建空文件(文件必须是空的)touch demoCA/index.txt创建一个任意数据的文件vi demoCA/serial 写入0011,保存退出。
4.生成的CA证书进行签名

服务器端
在这里插入图片描述
客户端在这里插入图片描述

4.至此我们已经成功生成了所需要的文件
在这里插入图片描述

1.2可能碰到的问题

**1.**首先是我之前安装并没有出现的问题,在我生成key时,出现
在这里插入图片描述
原因是找不到相应的库文件。
假如你的libssl.so.1.1 文件在/usr/local/openssl/lib/下面,可以这样做建议软连接

ln -s /usr/local/lib/libssl.so.1.1 /usr//libssl.so.1.1
ln -s /usr/local/lib/libcrypto.so.1.1 /usr//libcrypto.so.1.1

如果不知道在哪里可以使用图中的find命令进行查找
在这里插入图片描述
2.第二个问题是在给服务器签名之后,继续给客户端进行签名遇到的问题,
在这里插入图片描述
这里是因为serial值造成的,我们可以去之前设置的0011,进行更改之后就可以正常签名使用。

2.客户端和服务器

1.客户端

在进行编程之前我们要了解openssl编程的顺序:
a,Openssl的头文件:

#include <openssl/ssl.h>
#include <openssl/err.h>

b,Openssl的初始化,在使用之前必须进行的步骤

int SSL_library_int(void);

c,选择会话的协议
目前能够使用的协议包括TLSv1.0、SSLv2、SSLv3、SSLv2/v3。
需要注意的是,客户端和服务器必须使用相互兼容的协议,否则SSL会话将无法正常进行。

d, 创建会话环境
申请SSL会话环境的OpenSSL函数是:
SSL_CTX SSL_CTX_new(SSL_METHOD method);
当SSL会话环境申请成功后,还要根据实际的需要设置CTX的属性,通常的设置是指定SSL握手阶段证书的验证方式和加载自己的证书。制定证书验证方式的函数是:
int SSL_CTX_set_verify(SSL_CTx
ctx,int mode,int(*verify_callback),int(X509_STORE_CTX *));
为SSL会话环境加载CA证书的函数是:
SSL_CTX_load_verify_location(SSL_CTX *ctx,const char *Cafile,const char *Capath);
为SSL会话加载用户证书的函数是:
SSL_CTX_use_certificate_file(SSL_CTX *ctx, const char *file,int type);
为SSL会话加载用户私钥的函数是:
SSL_CTX_use_PrivateKey_file(SSL_CTX ctx,const char file,int type);
在将证书和私钥加载到SSL会话环境之后,就可以调用下面的函数来验证私钥和证书是否相符:
int SSL_CTX_check_private_key(SSL_CTX *ctx);

e,建立SSL的套子节
f,后面就是SSL的握手以及数据传输,最后结束SSL通信。

下面贴出我的代码:

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <errno.h>
#include <netdb.h>
#include <resolv.h>
#include <fcntl.h>
#include <unistd.h>
#include <signal.h>
#include <getopt.h>

#include <openssl/bio.h>
#include <openssl/ssl.h>
#include <openssl/err.h>
#include <openssl/crypto.h>

int get_stop = 0;//结束标志

#define MAXSIZE 1024
#define CA_CERT_FILE "ca.crt"
#define CLIENT_CERT_FILE "client.crt"
#define CLIENT_KEY_FILE "client.key"

void print_usage(char *order)
{
   
        printf("usages: %s\n",order);
        printf("-I(IP):server IP\n");
        printf("-p(port):server port\n");
        printf("-h(help):help information\n");
        exit(0);
}
/*证书信息*/
void ShowCerts (SSL* ssl)
{
   
    X509 *cert;
    char *line;

    cert=SSL_get_peer_certificate(ssl);
    if(cert !=NULL)
    {
   
        printf("数字证书信息:\n");
        line=X509_NAME_oneline(X509_get_subject_name(cert),0,0);
        printf("证书:%s\n",line);
        free(line);
        line=X509_NAME_oneline(X509_get_issuer_name(cert),0,0);
        printf("颁发者:%s\n",line);
        free(line);
        X509_free(cert);
     }
     else
     {
   
          printf("无证书信息!\n");
     }
  }
    
      int main(int argc,char **argv)
     {
   
        int                    opt = -1;
        int                    on = 1;
        int                    sockfd = -1;
        int                    len;
        int                    rv;
        int                    port = 0;
        char                   send_buffer[MAXSIZE];
        char                   rec_buffer[MAXSIZE];
        char                   *ip = NULL;
        
        SSL_CTX                *ctx;
        SSL                    
  • 0
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值