Bootstrap

Ubuntu 安装openssl环境

如题,本来以为很简单的一件事,然而却费了我半天的功夫。openssl确实是个好东西。 而且好像Ubuntu里面本来就有,那我为什么还要装呢?
原来是出现啦一个问题。我在运行一段程序的时候,出现了一个bug。
代码如下:

#include <openssl/sha.h"
#include <string.h>
#include <stdio.h>

int main()
{
    SHA_CTX stx;
    unsigned char outmd[20];//注意这里的字符个数为20
    char buffer[1024];
    char filename[32];
    int len=0;
    int i;
    FILE * fp=NULL;
    memset(outmd,0,sizeof(outmd));
    memset(filename,0,sizeof(filename));
    memset(buffer,0,sizeof(buffer));
    printf("请输入文件名,用于计算SHA1值:");
    scanf("%s",filename);
    fp=fopen(filename,"rb");
    if(fp==NULL)
    {
        printf("Can't open file\n");
        return 0;
    }

    SHA1_Init(&stx);
    while((len=fread(buffer,1,1024,fp))>0)
    {
        SHA1_Update(&stx,buffer,len);
        memset(buffer,0,sizeof(buffer));
    }
    SHA1_Final(outmd,&stx);

    for(i=0;i<20;i<i++)
    {
        printf("%02X",outmd[i]);
    }
    printf("\n");
    return 0;
}

问题如下:
这里写图片描述

undefined reference to SHA1!!!! 可我明明已经装过了openssl,怎么可能会undefined???
于是,我就在网上查。一个帖子引起了我的注意: Linux 坑爹的undefined to SHA

帖子说,不要用-lssl。要用-lcrypto。为什么?帖子并没有说太清楚。

兴致勃勃的赶紧试过,然并卵。崩溃的我又想寻求其他解释,然而,都无所进展。可能是openssl的问题吧,于是我无奈地选择了重新安装openssl这条不归路。

安装的过程,如同人生一样,充满着痛苦与折磨。一开始,我单纯的以为,这只要简单的apt-get就行啦。
于是乎, 敲上两行代码:

sudo apt-get install openssl
sudo apt-get install libssl-dev

然而发现,并没有什么变化。于是乎,我采用啦另外一种方法,安装源码。
openssl官网上download一个1.0.2的版本,解压安装。。。
等了几分钟,装完啦。我又兴致勃勃的试,依旧无果。折腾半天才发现,原来本应在/usr/local应该有个ssl文件。这是openssl安装的目标文件。然而并没有。。。再仔细一看,最后,make install时,出现啦error。。。
Makefile:284: recipe for target ‘build_crypto’ failed

这下,我深陷于绝望的泥沼,然而将死而非死。网上一堆又一堆的说法,然而我感觉没有一种适合我的。我决定冷静一下。

然后想,或许这个安装包有问题?于是我又下啦个1.0.1的版本。顺便一瞥,下载链接的下面有个提示,建议在安装前先看readme文件。于是乎,与直接按网上的安装方法按部就班不同,这次我选择直接看readme文件。里面有很多废话,重要的就是安装前要看INSTALL文件(For Linux or Unix)。里面的安装过程很简单,但却很有效。方法如下:

  $ ./config
  $ make
  $ make test
  $ make install

然后, /usr/local/下终于出现啦期待的ssl文件夹。兴奋之情,溢于言表。
我再去编译,却提示没有这个头文件。原来,我之前把老的include里面的openssl文件删啦,新装的都是在/usr/local/ssl下,系统路径无法直接识别。这个好解决。参照如何升级ubuntu的openssl库,利用软链接将/usr/local/ssl链接上去。

ln -s /usr/local/ssl/include/openssl /usr/include/openssl
ln -s /usr/local/ssl/bin/openssl /usr/bin/openssl
echo "/usr/local/ssl/lib" >> /etc/ld.so.conf
ldconfig -v

到此基本完成,然而还要注意的是,编译时,参数为-lcrypto,不是-lssl。

这里写图片描述

终于,大功告成!!!虽然,过程很痛苦,但最终的结果还是可以接受的。当然,同样也存在一些问题,比如-lcrypto和-lssl有什么区别?下一步就可以学习这个。

;