基于openEuler的OpenSSL编译安装和编程基础
基于openEuler的OpenSSL编译安装和编程基础
远程登录openEuler,我们看一下openEuler默认有没有安装OpenSSL,如下图所示,openEuler默认已经安装好了OpenSSL:
当前openEuler系统安装的OpenSSL版本是1.0.2g,现在(2021.04)OpenSSL最新的版本是1.1.1k,还有一个问题,openEuler中没有变成开发需要的头文件。我们需要自己下载OpenSSL的源码编译安装。
OpenSSL编译安装
1.我们去OpenSSL官网下载最新版本OpenSSL 1.1.1k的源码openssl-1.1.1k.tar.gz,然后把代码上传到openEuler云服务器中。
2.建立两个文件夹,分别放置OpenSSL的源码和安装路径,记住pwd
运行的结果/root/rocopenssl
:
mkdir rocopensslsrc rocopenssl cd rocopenssl pwd
3.解压源代码到rocopensslsrc
文件夹:
tar -zxvf openssl-1.1.1k.tar.gz -C rocopensslsrc
4.配置编译安装路径(/root/rocopenssl),和openEuler系统默认的不同。
cd rocopensslsrc/openssl-1.1.1k ./config --prefix=/root/rocopenssl
注意:这里有些人可能会出现权限不够的问题,这时只需在./config前面加入bash 即可,亲测有效。
5.编译(make时间稍长,耐心等待),测试、安装,其中测试步骤可选:
make make test make install
6.查看安装后的版本,确定是最新安装的1.1.1k版:
对于用到的库还是旧版本的这个问题,我通过编译运行老师给我的.sh文件后发现竟然解决了,但是具体为什么会解决还不是特别清楚:(.sh文件如下)
#! /bin/sh ### openssl CUROPENSSL=openssl-1.1.1k cd ROCHOME=$(pwd) if [ ! -d rocopenssl ]; then mkdir rocopenssl mkdir rocopensslsrc mkdir rocopenssldir fi if [ ! -f ~/${CUROPENSSL}.tar.gz ]; then wget https://www.openssl.org/source/${CUROPENSSL}.tar.gz tar -zxvf ~/${CUROPENSSL}.tar.gz -C ~/rocopensslsrc cd ~/rocopensslsrc/${CUROPENSSL} ./config --prefix=${ROCHOME}/rocopenssl --openssldir=${ROCHOME}/rocopenssldir make # make test sudo make install UNAME=$(uname -a) result=$(echo ${UNAME} | grep "raspberrypi") if [ "$result" != "" ]; then sudo mv -f /usr/lib/arm-linux-gnueabihf/libcrypto.so.1.1 /usr/lib/arm-linux-gnueabihf/libcrypto.so.1.1.rocbaknewopenssl sudo mv -f /usr/lib/arm-linux-gnueabihf/libssl.so.1.1 /usr/lib/arm-linux-gnueabihf/libssl.so.1.1.rocbaknewopenssl sudo ln -sf ${ROCHOME}/rocopenssl/lib/libcrypto.so.1.1 /usr/lib/arm-linux-gnueabihf/libcrypto.so.1.1 sudo ln -sf ${ROCHOME}/rocopenssl/lib/libssl.so.1.1 /usr/lib/arm-linux-gnueabihf/libssl.so.1.1 sudo mv -f /usr/bin/openssl /usr/bin/opensslbak sudo ln -sf /home/pi/rocopenssl/bin/openssl /usr/bin/openssl fi UNAME=$(uname -a) result=$(echo ${UNAME} | grep "ubuntu") if [ "$result" != "" ]; then sudo mv -f /usr/lib/x86_64-linux-gnu/libcrypto.so.1.1 /usr/lib/x86_64-linux-gnu/libcrypto.so.1.1.rocbaknewopenssl sudo mv -f /usr/lib/x86_64-linux-gnu/libssl.so.1.1 /usr/lib/x86_64-linux-gnu/libssl.so.1.1.rocbaknewopenssl sudo ln -sf ${ROCHOME}/rocopenssl/lib/libcrypto.so.1.1 /usr/lib/x86_64-linux-gnu/libcrypto.so.1.1 sudo ln -sf ${ROCHOME}/rocopenssl/lib/libssl.so.1.1 /usr/lib/x86_64-linux-gnu/libssl.so.1.1 sudo mv -f /usr/bin/openssl /usr/bin/opensslbak sudo ln -sf ${ROCHOME}/rocopenssl/bin/openssl /usr/bin/openssl wget --no-check-certificate https://github.com/curl/curl/raw/master/lib/mk-ca-bundle.pl perl mk-ca-bundle.pl && rm certdata.txt mkdir -p ~/.ssl/ && mv ca-bundle.crt mk-ca-bundle.pl ~/.ssl echo "ca_certificate = ~/.ssl/ca-bundle.crt" >> ~/.wgetrc fi UNAME=$(uname -a) result=$(echo ${UNAME} | grep "openEuler") if [ "$result" != "" ]; then echo "welcome openEuler" # sudo mv -f /usr/lib/x86_64-linux-gnu/libcrypto.so.1.1 /usr/lib/x86_64-linux-gnu/libcrypto.so.1.1.rocbaknewopenssl # sudo mv -f /usr/lib/x86_64-linux-gnu/libssl.so.1.1 /usr/lib/x86_64-linux-gnu/libssl.so.1.1.rocbaknewopenssl # sudo ln -sf ${ROCHOME}/rocopenssl/lib/libcrypto.so.1.1 /usr/lib/x86_64-linux-gnu/libcrypto.so.1.1 # sudo ln -sf ${ROCHOME}/rocopenssl/lib/libssl.so.1.1 /usr/lib/x86_64-linux-gnu/libssl.so.1.1 # # sudo mv -f /usr/bin/openssl /usr/bin/opensslbak # sudo ln -sf ${ROCHOME}/rocopenssl/bin/openssl /usr/bin/openssl fi openssl version rm ~/${CUROPENSSL}.tar.gz fi
OpenSSL命令的使用
OpenSSL命令的帮助使用openssl help
查看:
OpenSSL命令下面有很多子命令分为三类:标准命令,消息摘要命令和密码命令。这些命令我们有两种用法,以最简单的产看版本命令为例,我们可以先输入openssl
进入OpenSSL的功能界面后输入version
,也可以直接在openEuler终端中直接输入openssl version
进行查看,在实际应用中我们多采用后一种方法。
对于子命令的使用帮助,我们可以有两种方式查看openssl help xxsubcmd
或 openssl xxsubcmd --help
,比如用这两种方法查看消息摘要子命令的用法:
OpenSSL编程
简单测试
编写一个测试代码test_openssl.c:
#include <stdio.h> #include <openssl/evp.h> int main(){ OpenSSL_add_all_algorithms(); return 0; }
编译运行结果截图如下:
编译指令:
gcc -o to test_openssl.c -I /root/rocopenssl/include -L /root/rocopenssl/lib -lcrypto -lpthread
运行结果为0:
BASE64算法
编写一个BASE64的测试代码testbase64.c:
#include <stdio.h> #include <string.h> #include <openssl/evp.h> #include <openssl/x509.h> //Base64编码 void tEVP_Encode() { EVP_ENCODE_CTX *ctx; ctx = EVP_ENCODE_CTX_new(); //EVP编码结构体 unsigned char in[1024]; //输入数据缓冲区 int inl; //输入数据长度 char out[2048]={0}; //输出数据缓冲区 int outl; //输出数据长度 FILE *infp; //输入文件句柄 FILE *outfp; //输出文件句柄 infp = fopen("test.dat","rb");//打开待编码的文件 if(infp == NULL) { printf("Open File \"Test.dat\" for Read Err.\n"); return; } outfp = fopen("test.txt","w");//打开编码后保存的文件 if(outfp == NULL) { printf("Open File \"test.txt\" For Write Err.\n"); return; } EVP_EncodeInit(ctx);//Base64编码初始化 printf("文件\"Test.dat\" Base64编码后为:\n"); //循环读取原文,并调用EVP_EncodeUpdate计算Base64编码 while(1) { inl = fread(in,1,1024,infp); if(inl <= 0) break; EVP_EncodeUpdate(ctx,out,&outl,in,inl);//编码 fwrite(out,1,outl,outfp);//输出编码结果到文件 printf("%s",out); } EVP_EncodeFinal(ctx,out,&outl);//完成编码,输出最后的数据。 fwrite(out,1,outl,outfp); printf("%s",out); fclose(infp); fclose(outfp); printf("对文件\"Test.dat\" Base64编码完成,保存到\"test.txt\"文件.\n\n\n"); } //Base64解码 void tEVP_Decode() { EVP_ENCODE_CTX *ctx; ctx = EVP_ENCODE_CTX_new(); //EVP编码结构体 char in[1024]; //输入数据缓冲区 int inl; //输入数据长度 unsigned char out[1024]; //输出数据缓冲区 int outl; //输出数据长度 FILE *infp; //输入文件句柄 FILE *outfp; //输出文件句柄 infp = fopen("test.txt","r");//打开待解码的文件 if(infp == NULL) { printf("Open File \"Test.txt\" for Read Err.\n"); return; } outfp = fopen("test-1.dat","wb");//打开解码后保存的文件 if(outfp == NULL) { printf("Open File \"test-1.txt\" For Write Err.\n"); return; } EVP_DecodeInit(ctx);//Base64解码初始化 printf("开始对文件\"Test.txt\" Base64解码...\n\n"); //循环读取原文,并调用EVP_DecodeUpdate进行Base64解码 while(1) { inl = fread(in,1,1024,infp); if(inl <= 0) break; EVP_DecodeUpdate(ctx,out,&outl,in,inl);//Base64解码 fwrite(out,1,outl,outfp);//输出到文件 } EVP_DecodeFinal(ctx,out,&outl);//完成解码,输出最后的数据。 fwrite(out,1,outl,outfp); fclose(infp); fclose(outfp); printf("对文件\"Test.txt\" Base64解码完成,保存为\"test-1.dat\"\n\n\n"); } int main() { tEVP_Encode(); tEVP_Decode(); return 0; }
编译代码的命令:
gcc -o testbase64 testbase64.c -I /root/rocopenssl/include -L /root/rocopenssl/lib -lcrypto -lpthread -finput-charset=GBK -fexec-charset=UTF-8
运行截图如下:
测试中的用到一个test.dat 是个二进制文件,可以用echo命令生成,或者用二进制编辑工具生成。
执行./testbase64
,结果如下图: