最近给公司开发一个需要通过https登录的界面。搞了一个多月,从刚开始啥都不知道,到慢慢搞定了。期间看了很多文档,学了很多知识,现总结如下。
1、目的要求
在设备上搭建一个web服务器,并且能以https的方式登录,而且设备能自己生成相关的证书文件。
2、web服务器和ssl的搭建
2.1源码下载
公司原本是有web服务器的,但是不能支持matrixssl,这都是编译成静态库文件的,没法修改。没办法就只有自己再重新搭建服务器和matrixssl支持了。公司以前的代码是移植的goahead2.5的,现在都升级到3.3.6了,先到网上找到goahead2.5的代码。以及openssl的源代码,都是在官网去下载的。一定要找官网,官网才可靠。这里不多说,网上很多,一搜各个版本的都有下载。
2.2移植步奏
先说goahead的移植。
2.2.1、解压,我下载的是webs-2-5.tar.gz直接解压即可。
2.2.2、进入目录。cd webs-2-5/ cdLINUX/
2.2.3、修改Makefile。vimMakefile 网上有很多教程说咋改,我就把我改的贴出来。
这是按照网上教程改成我的编译器的。
图中ARCH是按照我们移植需要,更改的静态库名字。
这部分是支持matrixssl的。我的matrixssl版本是matrixssl-3-1-3-open ,所以图中的Dir写的是matrixsslDir:=$(shell ls -d ../matrixssl-3-1*/)。注意下载的matrixssl-3-1-3-open文件夹要放到webs-2-5/目录下。不然编译器会找不到。
Ok,基本上goahead就需要改这三部分。分别是修改交叉编译器;输出静态库名字;(其实也可以不用改,生成后修改也一样,这里为了方便);支持matrixssl。
2.2.4、接下来就是修改matrixssl的Makefile了。
进入目录cdmatrixssl-3-1-3-open/ 打开Makefile vim Makefile
修改编译器。和刚才差不多。
修改库名字。
做完了这两步就算把所有的都设置好了。
2.2.5、编译
先进入matrixssl目录,执行make clean make
就能生成两个库文件,就是刚才我们设置的名字。到移植的时候会用到。
图中高亮部分就是库文件。
再进入cd webs-2-5/ cd LINUX/ 一样执行 make clean make
生成的库文件。
到这里,我们需要的库文件都生成好了。接下来到我们自己的工程中设置makefile
lib下面添加
当然,我们得把这两个库文件拷贝到相应的库目录才行。
接下来,就把goahead和matrixssl的头文件包含到我们的工程里面,这样就可以调用goahead和matrixssl的函数搭建我们的带ssl的服务器了。这里要注意的是在编译库文件之前要对源码的定义做一些修改,不然移植过去可能无法使用。
2.3 源码修改
2.3.1 在wsIntrn.h文件中,修改如下:
这样就能读取比较大的HTML文档了。超过这个大小的文档就不能读取了。
2.3.2在matrixssllib.h做如下修改:
2.3.3在websSSL.h中修改默认证书文件的位置。
刚开始测试的时候也可以用matrixssl原来带的pem格式的证书文件。
我这里是默认放在/usr/目录下的。把相关的证书文件放到相应目录,运行我们的程序,就可以使用http和https登录了。
3、证书文件的生成
接下来说最难整的一部分了。Matrixssl要在服务器和浏览器间建立ssl通讯,就得在服务器有证书文件,这些网上也有很多教程的介绍。当然我们浏览器默认信任的证书颁发机构是固定的,我们的证书文件也可以拿给那些机构签名,不过是收费的。我们自己搭建的服务器就自己签名就是了,自己知道是可信任的就行了,虽然浏览器傻傻分不清楚。
3.1 openssl应用程序移植到ARM处理器平台
由于我们的matrixssl是支持openssl产生的证书文件的,实际上好多种ssl移植都支持openssl的证书文件。但是我们的matrixssl移植是没有应用程序能在ARM平台上运行的,但是它也有自己的优点,就是小。关于openssl和matrixssl的区别问题,可以百度科普一下。步入正题。
3.1.1下载源码
这里就不贴网址,百度—>官网—>随便下载。
3.1.2配置安装
这步就有点棘手了,因为我们是移植到ARM平台,不是在虚拟机上运行,所以很多东西得自己配置为自己的东西。主要包括编译器,目录,以及修改Makefile。具体步骤写下来。
a、复制到/usr 目录 # cpopenssl-1.0.1i.tar.gz /usr/
b、解压 # tar zxvf openssl-1.0.1i.tar.gz
c、配置 推荐下面的配置方式
./config no-asm no-dso no-hw --prefix=/https/ os/compiler:arm-hisiv100nptl-linux-gcc
因为我们移植到ARM平台,能不要的功能就不要,这样就能减少我们移植程序的大小。看网上很多教程,把配置写的麻烦死了,而且还不实用,多做无用功,还把人搞得一头雾水。其实上面这就是程序最小化,最简单的配置了。下面解释下这么配置的意思。
no-asm 这句表示不使用汇编编译。
no-dso 不调用其他静态库。
no-hw 不添加其他硬件支持。为了减小应用程序大小。
--prefix=/https/ openssl安装目录,我这里为了项目需要,特地安装在这个目录的。当然也可以自己随便改。
os/compiler:arm-hisiv100nptl-linux-gcc 指定编译器。按照自己的编译器名称改。
在这里,为什么说网上的教程写的麻烦呢,因为对于配置的默认选项,很多都是我们不需要改的,而网上都说的配置很长一大串,其实没必要。
no-ec_nistp_64_gcc_128 [default] OPENSSL_NO_EC_NISTP_64_GCC_128 (skip dir) no-gmp [default] OPENSSL_NO_GMP (skip dir)
no-jpake [experimental]OPENSSL_NO_JPAKE (skip dir)
no-krb5 [krb5-flavor notspecified] OPENSSL_NO_KRB5
no-md2 [default] OPENSSL_NO_MD2 (skip dir)
no-rc5 [default] OPENSSL_NO_RC5 (skip dir)
no-rfc3779 [default] OPENSSL_NO_RFC3779 (skip dir)
no-sctp [default] OPENSSL_NO_SCTP (skip dir)
no-shared [default]
no-store [experimental]OPENSSL_NO_STORE (skip dir)
no-unit-test [default] OPENSSL_NO_UNIT_TEST (skip dir)
no-zlib [default]
no-zlib-dynamic[default]
这就是什么都不配置时,config的默认配置,这可以看出来,网上很多人说的都在默认配置里面了,所以为了简单易懂,这些就不需要配置了。关于这些配置的意义,其实有一个很好的文档看,就在你的解压目录下有一个INSTALL文件,说的很详细,不过是英文的,但是英文不难,慢慢看就懂了,这是官方的文档,说的都很权威,尽量相信官方的文档。如果你实在不想看,可以百度这个:
这相当于翻译了那个官方文档。
d、修改Makefile
配置完了我就看网上的教程修改Makefile了。这里把我修改的地方贴出来,也方便以后查找。按照文档的先后顺序。
这些就是按照我们的配置自己生成的。
这个地方,我改了CFLAG 后面加上了-O3选项,这样生成的应用程序就可以很小了。
按照网上说的,改成自己的平台。
后面就没什么改的了,大家如果修改后不行,按照我这个流程,再配合自己的实际情况,多试几次,不要气馁,多参考网上的教程,多做就能搞定的。
好了,最麻烦的配置将完了,就是安装了。官方的安装步骤:
$./config
$make
$make test
$make install
我就没执行make test这步。直接配置了就 #make #makeinstall
安装完就可以到你的配置目录下面找到安装的openssl了。
这里,我只是用那个小的应用程序,如果大家平台空间比较大,也可以移植openssl到你的应用程序里,就把lib目录下的静态库添加到你自己的程序的Makefile里就是了,当然文件还得复制到对应的地方。网上说还得注意链接库的顺序,这个我没做就无从说起了。
3.2用openssl生成证书文件
其实这步也比较麻烦,因为不知道该怎么去生成,也没用一个官方的文档参考。网上大家说的都不怎么看的明白。最后我是按照一个教程生成的。网址如下:
http://blog.csdn.net/howeverpf/article/details/21622545然后我把自己的步骤贴出来,方便以后查看。
3.2.1生成证书准备
首先配置openssl.cnf文件
dir = /https/openssl这句是修改默认目录。其他都可以按照默认设置。关于这个的介绍,网上也有很多,我可能就没他们说的好了,先去看看,知道这些都是什么意思,就好改成自己的了。
这里改一句,default_md = md5 好像有些版本不识别默认的,我之前那个版本就是不识别,这个版本就没试了,反正如果怕有问题,就把这个改了。
接下来要在刚才设置的目录下创建两个文件:
#touch index.txt -----这个文件就为空就好。
#touch serial ------这个文件里面要写入序列号。
#echo "01" ->serial -----因为每一个证书文件都要序列号。
好了,上面就是准备工作。修改一个配置文档,创建两个文档。
3.2.2生成证书命令
//默认指代cnf文件正确,不需要添加config/ 生成顶级CA的公钥证书和私钥文件,有效期10年(RSA 1024bits,默认)
openssl req -new -x509 -days 3650 -keyout CARoot.key-out CARoot.crt -passout pass:abcd
// 为顶级CA的私钥文件去除保护口令
openssl rsa -in CARoot.key -out CARoot.key -passinpass:abcd
//为应用证书/中级证书生成私钥文件
openssl genrsa -out app.key 1024
//根据私钥文件,为应用证书/中级证书生成 csr 文件(证书请求文件)
openssl req -new -key app.key -out app.csr
// 使用CA的公私钥文件给 csr 文件签名,生成应用证书,有效期5年
Openssl ca -in app.csr -out app.crt -certCARoot.crt -keyfile CARoot.key -days 1826 -policy policy_anything –batch
到此,证书文件生成成功了,把这些证书文件放到webserver的默认目录下,开启ssl,就可以在服务器使用自己的证书文件了。可以用浏览器登录https看看自己的证书文件。