Apache移植及openssl实现SSL单/双向认证

来源:互联网 发布:淘宝客户端 编辑:程序博客网 时间:2024/05/16 05:45
Apache 移植及 openssl 实现 SSL 单向(双向)通信
一.准备工作
1.从 Apache 官方网站 http://www.apache.org/下载最新的 Apache 源码.本文移植的是
httpd_2.4.3.tar.bz2,下载地址 http://apache.etoak.com/httpd/.
2.下载编译Apache所需库APR及APR-UTIL,此源码包含在 httpd_2.4.3-
deps.tar.bz2 文件中.下载地址 http://apache.etoak.com/httpd/.
3.然后在pcre网站下载最新pcre源码 pcre-8.32.tar.bz2.下载地址
http://sourceforge.net/projects/pcre/files/pcre/8.32/.
4.在openssl官网下载最新的openssl.本文下载的是 openssl-1.0.1c.tar.gz
,下载地址 http://www.openssl.org/source/.
5.上述就是我们移植所需要的所有源码文件.本文假设读者已经在自己电脑上安装好linux操作
系统,并且已安装基本的开发环境比如gcc ,g++编译器等等....
注:本次移植使用的交叉编译器版本为 arm-linux-gcc-4.3.2,并假设已经配置好交叉编译环境,此
项工作不在本文范围.
二.开始移植
1.在任何目录建立 apache_host 及 apache_target 目录,笔者是在家目录下建的,所以下文都
以笔者的目录为准.将apache源码分别解压到这两个目录下,并将其他源码分别解压到家目录下.现
在我们共有 apache_host,apache_target,httpd_2.4.3,pcre-8.32,openssl-1.0.1c 目录.
将 httpd_2.4.3 目录下的 srclib 目录合并到 apache_host 目录下的 srclib 目录.
2.首先编译能在本机上执行的程序 gen_test_char,此程序为交叉编译时所使用的工具.进入
pcre-8.32 目录,执行命令 ./configure --prefix=/home/zhang/tools/pcre.如果出现为找到
xx工具错误或缺少编译器,请按错误提示自行安装.sudo apt-get install xxx_xxxxx.然后执行命
令 make -j2,等带编译完成.最后执行 make install 命令,这样在/home/zhang/tools/pcre 目录
下就得到了我们所需的pcre库.
3.进入 apache_host 目录,执行命令
./configure --with-pcre=/home/zhang/tools/pcre.
make -j2.
到这里会出现一个错误/home/zhang/apache_host/support/ab.c:2243: undefined
reference to `SSLv2_client_method',不用去管这个错误,只要
看/home/zhang/apache_hsot/server 目录下是否有 gen_test_char 可执行文件,如果有,本机
编译到此结束.
4.现在开始真正的移植工作.首先要编译APR库,进入 httpd_2.4.3/srclib/apr 目录,执行命令:
./configure CC=arm-linux-gcc --host=arm-linux
--prefix=/home/zhang/tools/apr_arm ac_cv_file__dev_zero=yes
ac_cv_func_setpgrp_void=yes apr_cv_process_shared_works=yes
apr_cv_mutex_robust_shared=yes apr_cv_tcp_nodelay_with_cork=yes
ap_void_ptr_lt_long=no
没有出现错误后执行命令: make -j2.编译的时候会出现一个错误:./include/apr_want.h:95:
error: redefinition of 'struct iovec',用 vi 编辑器打开./include/apr_want.h 文件,找到 95
行,将 struct iovec 这个结构体整个注释掉,因为重定义了.保存退出后从新执行 make -j2.没有再出现
错误,最后执行命令 make install 就OK了.
5.编译APR-UTIL库,进入 httpd_2.4.3/srclib/apr-util 目录,执行命令:
./configure CC=arm-linux-gcc --host=arm-linux
--prefix=/home/zhang/tools/apr-util_arm --with-
apr=/home/zhang/tools/apr_arm
没有错误后执行命令:make -j2.最后没有出现错误,执行 make install.
6.在一次编译pcre库,进入 pcre-8.32 目录,首先执行命令:make distclean,清除刚才编译
的结果.然后在执行命令:./configure CC=arm-linux-gcc --host=arm-linux
--prefix=/home/zhang/tools/pcre_arm,没有出现错误后,执行 make -j2 ,编译完成后执行
make install 命令.
7.然后编译 openssl 库,进入 openssl-1.01c 目录,执行命令:
./config no-asm shared --prefix=/home/zhang/tools/openssl_arm
然后修改该目录下的 Makefile 文件:
将 62 行的 CC=gcc 改为 CC=arm-linux-gcc;
将 63 行的 CFLAG = .....中的 -march=pentium 去掉;
将 69 行 AR=ar $(ARFLAGS) r 改为 AR=arm-linux-ar $(ARFLAGS) r;
将 70 行的 RANLIB=/usr/bin/ranlib 改为 RANLIB=arm-linux-ranlib;
将 71 行的 NM=nm 改为 NM=arm-linux-nm;
将 140 行的 DIRS = ....中的 apps test tools 去掉;
最后保存退出.然后执行命令 make -j2,编译完成后 make install 就OK了.
8.经过以上的准备工作就可以进行 apache 的移植了.进入 apache_target 目录,执行命令:
./configure CC=arm-linux-gcc --host=arm-linux --target=arm
--sysconfdir=/etc/apache --enable-so --enable-ssl --with-
apr=/home/zhang/tools/apr_arm --with-apr-util=/home/zhang/tools/apr-
util_arm --with-pcre=/home/zhang/tools/pcre_arm --with-
ssl=/home/zhang/tools/openssl_arm --with-mpm=prefork
ap_cv_void_ptr_lt_long=no
没有错误出现.然后执行 make -j2.此时会出现一个错误:/bin/bash: ./gen_test_char: 无法执行
二进制文件.这时上述编译的本机程序 gen_test_char 就有用处了,用 vi 编辑器打开
apche_target/server/Makefile 文件,将第 35 行./gen_test_char > test_char.h 改为
/home/zhang/apache_host/server/gen_test_char > test_char.h.(注意/home 前面没
有那个”.”)然后保存退出.执行一次 make clean 后在次执行 make -j2.经过一段时间的等待,没有出
现新的错误.最后执行命令 su 进入 root 用户,添加环境变量 export
PATH=$PATH:/opt/4.3.2/bin(交叉编译器路径),然后执行 make install.这样就在/usr/local
下生成了 apache2 文件夹和在/etc 目录下生成 apache 目录.
9.将步骤 8 生成的两个目录和家目录下的 tools 目录都拷贝到/nfsroot 目录下,通过网络挂载方式
下载到开发板.当然编译出来的文件并不全是我们所需要的.下面我们就要对各个目录进行”瘦身”.将
tools 目录下的 pcre 目录完全删除,然后在将其他目录下的除 lib 目录外的所有文件删除.然后将所以
lib 目录下的东西拷贝到开发板的 lib 目录下.将 apache2 目录下的除 bin 和 modules 目录以外的文
件全部删除.并将 apache2 目录拷贝到开发板的/usr/local 目录下.最后将 apache 目录拷贝到开发
板的/etc 目录下.
10.最后一步就是配置文件的修改了.进入开发板的/etc/apache 目录,用 vi 编辑器编辑
httpd.conf 文件.需要修改的内容如下:(注:如何板子的 vi 不好用,可以先在 PC 机上修改,修改完之后
在拷贝回板子上)
在 187 行添加:ServerName www.example.com;
将 210 的 DocumentRoot “/usr/local/apache2/htdocs”改为 DocumentRoot
“/wwww”,同时将 211 行的路径也改为”/wwww”;
将 262 行的 ErrorLog “logs/error_log” 改为 ErrorLog “/var/log/apache/error_log”;
将 291 行的 CustomLog “logs/access_log” 改为 CustomLog
“/var/log/apache/access_log”;
将 327 行的 ScriptAlias /cgi-bin/ "/usr/local/apache2/cgi-bin/" 改为 ScriptAlias /cgi-
bin/ "/wwww/cgi-bin/",将 343 行的路径也改为”/wwww/cgi-bin”;
修改完后保存退出.将/usr/local/apache2 加入到环境变量中.重启开发板后就可以执行命令:
apachectl start.最后这里出错了.查看错误日志发现在/usr/local/apache2 目录下没有 logs 目
录,那么我们就新见一个 logs 目录.mkdir -p /usr/local/apache2/logs ,然后在次执行
apachectl start .到此运行成功.如果在开发板根目录的 wwww 目录中有 index.html 文件,那么
就可以在 PC 机的浏览器中输入开发板的 IP 地址进行查看了.
上面上完整的 apache 移植过程.下面开始用 openssl 生成证书并实现 SSL 的单/双向认证.
1.首先修改 apache 的配置文件使其支持 ssl.打开开发板上/etc/apache/httpd.conf 文件,修改如
下:
将 87 行前面的#去掉;
将 125 行前面的#去掉.ssl_module;
将 477 行前面的#去掉 httpd-ssl.conf;
然后保存退出.最后修改/etc/apache/extra/httpd-ssl.conf,修改如下:
修改 86 行为 DocumentRoot “/wwww”;
修改 89 行为 ErrorLog “/var/log/apache/error_log”;
修改 90 行为 TransferLog “/var/log/apache/access_log”;
修改 106 行为 SSLCertificateFile “/etc/apache/ssl/server.crt”;
修改 116 行为 SSLCertificateKeyFile “/etc/apache/ssl/server.key”;
修改 137 行为 SSLCACertificateFile “/etc/apache/ssl/ca.crt”;
将 206 行的路径修改为”/wwww/cgi-bin”;
然后保存退出,重启 apache 服务.
注:上述修改大多为路径的修改,读者可以根据自己的需要和自己的开发板的实际情况进行修改.
2.用我给的脚本生成证书,脚本的内容如下:
#! /bin/sh
DEMOCA=demoCA
CLIENT=$1
if [ ! -f $DEMOCA ]; then
mkdir -p ./$DEMOCA/newcerts
touch index.txt
touch serial
echo "01" > serial
mv serial index.txt ./$DEMOCA
echo "Directory is OK!!!"
fi
echo "++++++++++++++++++++++++++++++++++++++++++++
+++++++++++++++++++++++++++++++++++++++++++++++
+++++"
echo "Now generate CA..................."
echo "++++++++++++++++++++++++++++++++++++++++++++
+++++++++++++++++++++++++++++++++++++++++++++++
++++++"
echo ""
echo ""
openssl req -new -x509 -keyout ca.key -out ca.crt
if [ ! -f ca.key -o ! -f ca.crt ]; then
echo "You must have CA key generated first!!!"
exit 1
fi
echo "++++++++++++++++++++++++++++++++++++++++++++
+++++++++++++++++++++++++++++++++++++++++++++++
+++++"
echo "Now generate Server..................."
echo "++++++++++++++++++++++++++++++++++++++++++++
+++++++++++++++++++++++++++++++++++++++++++++++
++++++"
echo ""
echo ""
openssl genrsa -out server.key 1024
openssl req -new -key server.key -out server.req
if [ ! -f server.req ]; then
echo "Generate server.req error!!!"
rm server.key -rf
exit 1
fi
openssl ca -keyfile ca.key -cert ca.crt -in server.req -out server.crt
if [ ! -f server.crt ]; then
echo "Generate server.crt error!!!"
rm server.key server.req -rf
exit 1
fi
rm server.req -rf
if [ $# -eq 1 ]; then
echo "++++++++++++++++++++++++++++++++++++++++++
+++++++++++++++++++++++++++++++++++++++++++++++
+++++++"
echo "Now generate Client..................."
echo "++++++++++++++++++++++++++++++++++++++++++
+++++++++++++++++++++++++++++++++++++++++++++++
++++++++"
echo ""
echo ""
openssl genrsa -out $CLIENT.key 1024
openssl req -new -key $CLIENT.key -out $CLIENT.req
if [ ! -f $CLIENT.req ]; then
echo "Generate server.req error!!!"
rm $CLIENT.key -rf
exit 1
fi
openssl ca -keyfile ca.key -cert ca.crt -in $CLIENT.req -out $CLIENT.crt
if [ ! -f $CLIENT.crt ]; then
echo "Generate server.crt error!!!"
rm $CLIENT.key $CLIENT.req -rf
exit 1
fi
echo "Generate ps12 file............."
openssl pkcs12 -export -clcerts -in $CLIENT.crt -inkey $CLIENT.key -out
$CLIENT.p12
fi
rm $CLIENT.req -rf
将上述内容保存为一个本地文件并加上可执行权限.这个脚本的用法为如果只执行脚本不带参数则只生成
CA 证书和 server 证书.如果带一个参数则还可以生成 client 证书.多于一个参数无效.
将这个脚本生成的 ca.crt,server.crt 和 server.key 下载到开发板的/etc/apache/ssl 目录下.重
启 apache 服务后,在 PC 浏览器里输入 https:// + 开发板的 IP 地址.此时会出现一个警告,但是仍然
可以访问.去除警告的办法是将 ca.crt 导入到浏览器的证书库中.(受信任的颁发机构中).
---------------------------------------------华丽的分割线-------------------------------------------------------
上面的是单向认证过程,双向认证过程如下:
修改 httpd-ssl.conf 文件将 157,158 行前的#去掉为:
SSLVerifyClient require
SSLVerifyDepth 10
保存退出.然后在将上述脚本生成的客户端证书导入浏览器的个人证书中就 OK 了.注意这个证书格式
是.P12 格式的.
到此整篇文档结束..............
原创粉丝点击