本文搭建了两种goahead的方式,一种是goahead2.5,另一种是goahead5.2
两者的区别是非常的大的,毕竟迭代了这么多的版本,这两种对应的是两种不同的方案,因为以前的代码是用2.5搭建的,只是添加一个ssl的服务,但是ssl现在的浏览器支持的不是很好,比如chrome和firefox是不支持tls1.0的,那么ssl3.0就更加不用说了,而5.2是自带openssl是支持新的协议的,所以搭建的方式是goahead2.5+martixssl+openssl和goahead5.2这两种方式。
解压goahead2.5里面有project和webs2-5目录,参考手册解压matrixssl-3-1-3-open.tgz,在此目录下打开终端修改matrixssl的Makefile文件,添加交叉编译的选项
# CC = gcc
# STRIP = strip
# AR = ar
CROSS_COMPILE = /opt/toolchain/rtk-ms-2.0.0-linux-mips-3.18-4.8.5-u0.9.33-toolchain/bin/rtk-ms-2.0.0-linux-
CC = $(CROSS_COMPILE)gcc
AR = $(CROSS_COMPILE)ar
LD = $(CROSS_COMPILE)ld
NM = $(CROSS_COMPILE)nm
STRIP = $(CROSS_COMPILE)strip
如果是32位的处理器而且编译有问题在makefile中屏蔽掉-DPSTM_64BIT选项
此目录下会生成libmatrixssl.a的库文件
然后进入LINUX目录下按照上述的交叉编译的方式编译即可此目录下会生成应用程序webs还有原始的key和cert将这些文件复制到嵌入式设备中当然还要复制一下www这个文件到同一个目录中
goahead5.2的操作非常智能使用这个命令生成build目录
CC=/opt/toolchain/rtk-ms-2.0.0-linux-mips-3.18-4.8.5-u0.9.33-toolchain/bin/rtk-ms-2.0.0-linux-gcc AR=/opt/toolchain/rtk-ms-2.0.0-linux-mips-3.18-4.8.5-u0.9.33-toolchain/bin/rtk-ms-2.0.0-linux-ar make -j16
将libgo.so拷贝到lib目录下,goahead拷贝到bin目录下,把 src 目录下的auth.txt,self.crt,self.key,和 route.txt 拷贝到 /etc/goahead 目录下,网页文件拷贝到 /var/www 目录下如果出现 Cannot get host address for host的报错修改http.c的代码如下,重新编译并拷贝goahead和libgo.so文件到嵌入式设备中,如果显示access error那么将上述除了libgo.so的文件放到同一个目录下,新建一个名为web的目录并将index.html放到该目录下
#if 0
struct hostent *hp;
if ((hp = gethostbyname(host)) == NULL) {
error("Cannot get host address for host %s: errno %d", host, errno);
return -1;
}
memcpy((char*) &intaddr, (char *) hp->h_addr_list[0], (size_t) hp->h_length);
ipaddr = inet_ntoa(intaddr);
#else
int sockfd;
struct sockaddr_in sin;
struct ifreq ifr;
sockfd = socket(AF_INET, SOCK_DGRAM, 0);
if(sockfd == -1)
{
return -1;
}
strncpy(ifr.ifr_name, "eth0", IFNAMSIZ);
ifr.ifr_name[IFNAMSIZ-1] = 0;
if(ioctl(sockfd, SIOCGIFADDR, &ifr) < 0)
{
error("get eth0 ip error\n");
return -1;
}
memcpy(&sin, &ifr.ifr_addr, sizeof(sin));
ipaddr = inet_ntoa(sin.sin_addr);
#endif
openssl已经编译成功后续会更新操作方法
------------------------------------------------------------------分割线
终于是弄好了,用了不少的时间,上面的已经编译好的库,因为有问题虽然能用,但是又不是完全能用,因为将生成的库放到程序一直有问题,一堆千奇百怪的问题,后面扒了下openwrt的源码找到openssl的配置文件才解决的问题。
首先列出网上的错误做法:
1、mkdir build_linux
2、sudo ./config no-asm shared no-async --prefix=/home/xxx/openssl-1.0.2g/build_linux --cross-compile-prefix=/opt/toolchain/rtk-ms/bin/mips-linux-uclibc-
3、因为上面用make生成的时会报错-m64,网上的做法是删除makefile里面的-m64,然后
make && make install
我就是被上面的做法误导了,于是就出现了十分难搞的问题,用别人写的精简库可以随意使用ssl的api,而用openssl的必报错,而且还会挂掉,但是没有报系统不兼容,什么不是同一平台的错,非常的难找问题,而用openwrt编译的就能用。于是换了思路干脆把config文件换成是openwrt的改一下路径和交叉编译的路径不就ok了,于是我在复制的时候没有注意到开头的区别,openwrt是./Configure开头的而上述的代码是./config开头的,我只改了后面的参数,于是还是没有解决,幸好在最后我反复查找终于找到了,原来最开始使用配置的命令就不同,于是改成如下的配置方式他里面的参数也复制过来什么都整上
1、mkdir build_linux
2、./Configure linux-mips32 no-asm shared no-async --prefix=/home/xxx/openssl-1.0.2g/build_linux --cross-compile-prefix=/opt/toolchain/rtk-ms/bin/mips-linux-uclibc- -znow -zrelro -Wl,--gc-sections -ldl -DOPENSSL_SMALL_FOOTPRINT no-idea no-md2 no-mdc2 no-rc5 no-sha0 no-camellia no-krb5 no-whrlpool no-whirlpool no-seed no-jpake shared no-err no-sse2 no-ssl2 no-ssl2-method no-heartbeats no-engines no-ec2m no-ssl3 no-ssl3-method no-hw no-dtls no-comp no-sse2
3、make
4、make install
将编译好的库和头放到指定的位置,修改makefile链接上这几个位置,于是完美解决上述的问题