主要介绍在linux下怎么搭建一个包含mod_ssl模块的apache服务器,并且如何根据不同的要求配置SSL 一 下载 1,从openssl.org下载openssl到/usr/local 2.从apache.org下载apache到/usr/local 3.从modssl.org下载mod_ssl到/usr/local 二 解压缩 cd /usr/local tar zxvf openssl-0.9.7e.tar.gz tar zxvf mod_ssl-2.8.22-1.3.33.tar.gz tar zxvf apache-1.3.33.tar.gz 三 更改一下名字 mv openssl-0.9.7e openssl mv mod_ssl-2.8.22-1.3.33 mod_ssl mv apache-1.3.33 apache 四 编译openssl cd openssl ./config --prefix=/usr/local/openssl make make install 五 编译mod_ssl cd ../mod_ssl ./configure --with-apache=../apache 六 编译apache SSL_BASE=../openssl ./configure --enable-module=SSL make make install 到这里为止,已经把准备工作做好了,假如按照前面的步骤来的话应该是没有问题的.但是有几次我出现了openssl不能用,apache出怪毛病的问题,呵呵最好的办法就是删除了重新安装(呵呵是不是很没追求!) 七 建立自己的CA cd / mkdir CAroot 建立自己的CA目录,我不知道这样为CA建一个目录好不好 cd CAroot cp /usr/local/openssl/ssl/openssl.cnf ./openssl.cnf 将CA配置文件拷过来 vi openssl.cnf 修改配置文件中的dir,将./demoCA修改为/CAroot mkdir newcerts mkdir certs mkdir crl mkdir private vi index.txt 可以不写数据,直接:wq vi serial 写入00,然后:wq vi ./private/.rand 写入两行随机数,然后:wq #呵呵,上面所作的这些全是根据openssl.cnf来的 openssl req -new -newkey -x509 rsa:1024 -keyout ./private/cakey.pem -out cacert.pem 为CA生成密钥和证书 八 为apache生成密钥和证书 cd /usr/local/apache/conf/ssl.crt openssl req -new -newkey rsa:1024 -keyout ../ssl.key/server.key -out ../ssl.csr/server.csr 生成证书请求和密钥 openssl ca -in ../ssl.csr/server.csr -out server.crt -config /CAroot/openssl.cnf 用CA私钥签名证书请求 #现在已经得到了服务器的证书和私钥 九 修改httpd.conf cd .. vi httpd.conf 将ServerName 更改为sage 不设也可以,不过会出现警告 将SSLCertificateFile修改为/usr/local/apache/conf/ssl.crt/server.crt 将SSLCertificateKeyFile修改为/usr/local/apache/conf/ssl.key/server.key #这是最基本的设置了,先用用试试看吧. 十 启动服务 /sbin/service iptables stop 这是要关掉防火墙了,呵呵我也不知道这样安全不安全,不过要是不关掉的话客户端将无法访问 /usr/local/apache/bin/apachectl startssl 十一 从客户端测试 从局域网找个windows电脑(LINUX也行)输入https://192.168.10.10 记住是https,要使http就直接不验证就通过了 此时将会出现一个对话框,一般第二个是对,毕竟时间都是有效的嘛.第三个是叹号那是因为访问站点与证书通用名不匹配,这需要在用openssl生成apache服务器证书时将通用名设定为192.168.10.10,第一个叹号是因为没有安装CA根证书,这时将/CAroot/cacert.pem拷到客户机安装就可以了,重新打开浏览器输入https://192.168.10.10,怎么什么反应也没有就进去了呢,呵呵,其实已经对服务器进行认真了,这和http://192.168.10.10有本质区别. 十二 配置更多的SSL应用(这个在/usr/local/apache/htdocs/manual/mod/mod_ssl有详细文档) 1,实现对客户端的认证 修改httpd.conf SSLVerifyClient require SSLVerifyDepth 1 SSLCACertificateFile /CAroot/cacert.pem 现在在客户端输入https://192.168.10.10 ,将要求出示证书,那现在就生成一个客户PKCS格式证书吧 cd /usr/local/apache/conf/ssl.crt openssl req -new -newkey rsa:1024 -keyout ../ssl.key/client.key -out ../ssl.csr/client.csr 生成证书请求和密钥 openssl ca -in ../ssl.csr/client.csr -out client.crt -config /CAroot/openssl.cnf 用CA私钥签名证书请求 openssl pkcs12 -export -clclient -inkey ../ssl.key/client.key -in client.crt -out /home/share/client.p12 #/home/share目录是samba服务器的共享目录,一般是将client.p12放在USBkey中,为了方便所以直接共享了. 在客户端上安装client.p12,呵呵这样就可以实现双方的认证了,双方通信也实现了SSL.(to be continuing) 2:某些页面只允许持有证书的客户访问,其他页面允许所有人访问 修改httpd.conf,当然需要先作一些页面的准备,/usr/local/apache/htdocs/secure是我们放只允许有证书访问的目录 SSLVerifyClient none SSLCACertificateFile conf/ssl.crt/ca.crt <Location /secure> SSLVerifyClient require SSLVerifyDepth 1 </Location> 3.某些页面只允许持有某种特定证书内容的客户访问,其它页面允许所有人访问 在这里我假设允许我们局域网的人访问 SSLVerifyClient none <Directory /usr/local/apache/htdocs/secure/area> SSLVerifyClient require SSLVerifyDepth 5 SSLCACertificateFile conf/ssl.crt/ca.crt SSLCACertificatePath conf/ssl.crt SSLOptions +FakeBasicAuth SSLRequireSSL SSLRequire %{SSL_CLIENT_S_DN_O} eq "ATR" and \ %{SSL_CLIENT_S_DN_OU} in {"305", "307", "309","313"} </Directory> 4.允许局域网用户使用http访问局域网站点,但是需要外网用户使用强加密的https访问. 假设局域网用户ip为192.160.1.0-24. 下面的修改要放在HTTPS虚拟主机的外面,这样就可以同时适用于http和https访问 SSLCACertificateFile conf/ssl.crt/company-ca.crt <Directory /usr/local/apache/htdocs> # Outside the subarea only Intranet access is granted Order deny,allow Deny from all Allow from 192.168.1.0/24 </Directory> <Directory /usr/local/apache/htdocs/subarea> # Inside the subarea any Intranet access is allowed # but from the Internet only HTTPS + Strong-Cipher + Password # or the alternative HTTPS + Strong-Cipher + Client-Certificate # If HTTPS is used, make sure a strong cipher is used. # Additionally allow client certs as alternative to basic auth. SSLVerifyClient optional SSLVerifyDepth 1 SSLOptions +FakeBasicAuth +StrictRequire SSLRequire %{SSL_CIPHER_USEKEYSIZE} >= 128 # Force clients from the Internet to use HTTPS RewriteEngine on RewriteCond %{REMOTE_ADDR} !^192\.168\.1\.[0-9]+$ RewriteCond %{HTTPS} !=on RewriteRule .* - [F] # Allow Network Access and/or Basic Auth Satisfy any # Network Access Control Order deny,allow Deny from all Allow 192.168.1.0/24 # HTTP Basic Authentication AuthType basic AuthName "Protected Intranet Area" AuthUserFile conf/protected.passwd Require valid-user </Directory> 有关SSL配置apache的指令(呵呵,在/usr/local/apache/htdocs/manual/mod/mod_ssl中有更详细的解释) 1.SSLCACertificatePath 语 法:SSLCACertificatePath /to/CA/certificates 应用环境:server config ,virtual host 默认设置:none 该指令为Certificate Authority证书文件指定一个目录 2.SSLCACertificatefile 语 法:SSLCACertificatefile CA_certificate_filename 应用环境:server config ,virtual host 默认设置:none 该指令为指定一个包含Certificate Authority证书的文件 3.SSLBanCipher 语 法:SSLBanCipher Cipher 应用环境:pre-directory config(.htaccess) 使用该指令可以禁止那些想使用cipher的用户对Apache进行配置 4.SSLCacheServerPort 语 法:SSLCacheServerPort port│filename 应用环境:server config ,virtual host 该指令为全程的SSL会话缓存服务器处理过程配置TCP/IP端口或UNIX domain socket 5.SSLCacheServerPort 语 法:SSLCacheServerPath filename 应用环境:server config ,virtual host 该指令为全程的SSL会话缓存服务器的执行指令设置路径.如果你已经使用APACI配置脚本将Apache安装好了,那么缓存执行指令的文件就保存在Apache安装目录的sbin子目录中 6.SSLCertificateFile 语 法:SSLCertificateFile certificate_filename 应用环境:server config ,virtual host 该指令为一个WEB站点上的主机指定证书文件名.如果为某个虚拟主机提供SSL连通性,就需要为该虚拟主机指定一个单独的证书. 7.SSLCertificateKeyFile 语 法:SSLCertificateFile certificate_key_filename 应用环境:server config ,virtual host 该指令为证书指定一个对应的私钥文件 8 SSLEnable 语 法:SSLEnable 应用环境:server config ,virtual host 该指令用来启动SSL,该指令的使用无需参数 9 SSLDisable 语 法:SSLDisable 应用环境:server config ,virtual host 该指令用来禁止SSL,该指令的使用无需参数 10 SSLFakeBasicAuth 语 法:SSLFakeBasicAuth 应用环境:server config ,virtual host 该指令主要将用户的X509证书翻译成一个用户名,转换的用户名可用于验证 11 SSLRequireCipher 语 法:SSLRequireCipher 应用环境:pre-directory config(.htaccess) 该指令为请求密码的pre-directory列表添加一个cipher. 12 SSLogFile 语 法:SSLogFile log_filename 应用环境:server config ,virtual host 该指令使得SSL连接信息写入日志文件中. 13 SSLRequireSSL 语 法:SSLRequireSSL 应用环境:pre-directory config file ,directory 对于一个未使用的SSL连接,该命令能够禁用该连接,该指令的使用无需参数 14 SSLRequiredCiphers 语 法:SSLRequiredCiphers cipher1:cipher2:... 应用环境:server config ,virtual host,pre-directory config(.htaccess) 该指令指定一系列由冒号分隔的密码 15 SSLSessionCacheTimeout 语 法:SSLSessionCacheTimeout seconds 应用环境:server config ,virtual host 该指令为SSL会话设置缓存过期时间 16 SSLVerifyDepth 语 法:SSLVerifyDepth number 应用环境:server config ,virtual host 因为一个CA证书能够被另一个CA证书验证,所以可以形成一个CA证书链.使用该指令可指定服务器验证用户证书时可以查找多少个CA证明. 17 SSLVerifyClient 语 法:SSLVerifyClient numeric-option 应用环境:server config ,virtual host 该指令可以用来决定服务器是否需要用户证书.如果不需要用户证书,将该指令设为0,如果需要用户证书,将该指令设为2;如果用户证书需要与否可选择,则设置为1. THE END------------------------------------------------ 我想要是按照上面的步骤应该可以的,要是出错了,呵呵,那我也不知道哪里错了,我的建议是把他们三个全删了,从第二步开始重新来.当然apache功能强大,我刚刚学,先写到这吧. 本文的更多讨论在http://www.infosecurity.org.cn/forum/read.php?fid=10&tid=31&page=1

|