• 2017-2018-1 20155318 《信息安全系统设计基础》 实验五 通讯协议设计


    2017-2018-1 20155318 《信息安全系统设计基础》 实验五 通讯协议设计

    Linux下OpenSSL的安装与测试

    OpenSSL简介

    OpenSSL是一个SSL协议的开源实现,采用C语言作为开发语言,具备了跨平台的能力,支持Unix/Linux、Windows、Mac OS等多种平台。

    • OpenSSL整个软件包大概可以分成三个主要的功能部分:
      • 密码算法库(其他两个功能部分SSL协议和应用程序都是基于这个库开发的)
      • SSL协议库(SSL服务器和SSL客户端)
      • 应用程序
    实验步骤
    • 前往OpenSSL官网,下载OpenSSL源码,下载压缩包“openssl-master.zip
    • 在Linux下使用unzip openssl-master.zip命令解压
    • 进入源代码目录cd openssl-1.1.0-pre1
    • 使用如下命令进行安装:
    $ ./config
    $ make
    $ make test
    $ make install
    
    • 编写一个测试代码test_openssl.c:
    #include <stdio.h>
    #include <openssl/evp.h>
    int main(){
        OpenSSL_add_all_algorithms();
        return 0;
    }
    
    • 使用gcc -o test_openssl test_openssl.c -L/usr/local/ssl/lib -lcrypto -ldl -lpthread命令编译,生成“test_openssl”可执行文件,运行程序,并执行echo $?,结果打印0,测试结果表明安装成功。

    • 其中编译命令中:-L指定链接库的文件夹地址;-lcrypto导入OpenSSL所需包;-ldl加载动态库;-lpthread链接POSIX thread库

    出现的问题及解决方案
    • 问题1:编译时出现openssl/evpp.h:错误提示

    • 原因是在运行make install命令时没有使用root权限,在运行命令时加上sudo后,重新编译即可

    • 问题2:编译时出现test_openssl.c:(.text+0xf):对‘OPENSSL_init_crypto’未定义的引用报错

    • 解决方案:参考狄惟佳同学的博客,将“openssl-master”文件夹下的“libcrypto.a”和“libssl.a”放在/usr/local/ssl/lib目录下(注意使用sudo权限),注意链接的顺序。

    作业
    1. 两人一组
    2. 基于Socket实现TCP通信,一人实现服务器,一人实现客户端
    3. 研究OpenSSL算法,测试对称算法中的AES,非对称算法中的RSA,Hash算法中的MD5
    4. 选用合适的算法,基于混合密码系统实现对TCP通信进行机密性、完整性保护。
    5. 学有余力者,对系统进行安全性分析和改进。
    • 基于Socket实现tcp通信
    函数
    • socket():建立一个socket连接,可指定socket类型等信息。在建立socket连接之后,可对sockaddr或sockaddr_in结构进行初始化,以保存所建立的socket地址信息。

    • bind():将本地IP地址绑定到端口号,若绑定其他IP地址则不能成功

    • listen():在服务端程序成功建立套接字和与地址进行绑定之后,用listen()函数来创建一个等待队列,在其中存放未处理的客户端连接请求

    • connect():在TCP中是用于bind()的之后的客户端,用于与服务器端建立连接

    • accept():创建等待队列之后,调用此函数等待并接收客户端的连接请求

    • read()/write()

    • send()/recv()

    • close():完成了写操作后关闭相应的socket描述字

    • 服务器代码

    • 客户端代码

    • 使用对称加密指令作为enc指令的参数调用对称加密指令

    • AES

    • 利用RSA对hello文件进行加密

    • MD5

    出现的问题及解决方案
    • 问题1:

    • 编译运行时出现libcrypto.so.1.1:cannot open share object file:No such file or directory的错误提示,检查后并未发现输入、配置的错误,重新启动虚拟机后正常

    • 问题2:

    • 输入错误

    混合密码系统

    任务要求:在Ubuntu中实现对实验二中的“wc服务器”通过混合密码系统进行防护

    OpenSSL函数
    • 头文件:
    #include <openssl/ssl.h>
    #include <openssl/err.h>
    
    • OpenSSL初始化:int SSL_library_int(void);
    • 选择会话协议:目前能够使用的协议包括TLSv1.0、SSLv2、SSLv3、SSLv2/v3,客户端和服务器必须使用相互兼容的协议
    • 创建会话环境:(CTX)使用不同的协议会话,其环境也不一样的。
    • 申请SSL会话环境的OpenSSL函数是:
    SSL_CTX *SSL_CTX_new(SSL_METHOD * method);
    
    • 制定证书验证方式的函数是:
    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);
    
    • 验证私钥和证书是否相符:
    int SSL_CTX_check_private_key(SSL_CTX *ctx);
    
    • 建立SSL套接字
    SSL *SSl_new(SSL_CTX *ctx);//申请一个SSL套接字
    
    int SSL_set_fd(SSL *ssl,int fd);)//绑定读写套接字
    
    int SSL_set_rfd(SSL *ssl,int fd);//绑定只读套接字
    
    int SSL_set_wfd(SSL *ssl,int fd);//绑定只写套接字
    
    • 完成SSL握手

    • 进行数据传输

    • 结束SSL通信

    int SSL_shutdown(SSL *ssl);//关闭SSL套接字
    void SSl_free(SSL *ssl);//释放SSL套接字
    void SSL_CTX_free(SSL_CTX *ctx); //释放SSL会话环境
    
    实验步骤
    • 编译server.c
    gcc -o server server.c -I /usr/local/ssl/include -L/usr/local/ssl/lib -lssl -lcrypto -ldl -lpthread
    
    • 编译telent.c
    gcc -o telent telent.c -I /usr/local/ssl/include -L/usr/local/ssl/lib -lssl -lcrypto -ldl -lpthread
    
    • 生产私钥和证书
    openssl genrsa -out privkey.pem 1024
    openssl req -new -x509 -key privkey.pem -out CAcert.pem -days 1095
    
    • 运行
    ./server 7838 1 CAcert.pem privkey.pem
    ./telent 127.0.0.1 7838
    

    码云链接

    实验体会

    本次实验让我对OpenSSL的使用有了更为深入的了解,在安装过程中出现了很多错误的原因都是没有使用root权限,在实验过程中上网查询了许多资料,今后的学习中会更加重视网络上丰富实践资源的使用。

  • 相关阅读:
    playbook的复用
    playbook 任务标签
    playbook handlers 触发器
    playbook循环语句
    playbook条件语句
    Ansible变量
    每日总结4.13
    每日总结4.12
    每日总结4.9
    每日总结4.8
  • 原文地址:https://www.cnblogs.com/lxy1997/p/8035611.html
Copyright © 2020-2023  润新知