基于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,结果如下图:

posted @ 2021-10-31 16:11  张灯结彩,潇潇暮雨  阅读(711)  评论(0编辑  收藏  举报