如何通过httpd来实现https?[这就要基于SSL]
https是监听在tcp的443端口
ssl是基于IP地址实现的,https虚拟主机仅能基于IP地址实现
httpd要想实现https的功能是基于模块mod_ssl来实现的
 
前提:实验使用httpd-2.2.3-63.el5
       
目前三个虚拟主机指向的是同一个IP地址172.16.16.3,所以我们只能为其中某一个提供SSL功能,所以以下选择为www.test.net提供ssl功能。(虚拟主机事先定义好的,具体怎么定义上一篇博客会有介绍)
 
一、为web服务器提供证书;(假设当前服务器就是CA)
 
1、建立CA

  1. [[email protected] /]#vim /etc/pki/tls/openssl.cnf 
  2.         编辑CA的配置文件,这个主要是为了颁发证书的时候,直接就可以enter一路向下了。
  3. 需找到以下的内容,然后更改主要是更改“_default”对于的值。
  4. (读者打开这个配置文件就可看到以下的内容) 
  5.         [ CA_default ] 
  6.   
  7.         dir             = /etc/pki/CA           # Where everything is kept 
  8.         certs           = $dir/certs            # Where the issued certs are kept 
  9.         crl_dir         = $dir/crl              # Where the issued crl are kept 
  10.         database        = $dir/index.txt        # database index file. 
  11.         [ req_distinguished_name ] 
  12.         countryName                     = Country Name (2 letter code) 
  13.         countryName_default             = CN 
  14.         countryName_min                 = 2 
  15.         countryName_max                 = 2 
  16.   
  17.         stateOrProvinceName             = State or Province Name (full name) 
  18.         stateOrProvinceName_default     = henan 
  19.   
  20.         localityName                    = Locality Name (eg, city) 
  21.         localityName_default            = zhengzhou 
  22.   
  23.         0.organizationName              = Organization Name (eg, company) 
  24.         0.organizationName_default      = magedu 
  25.   
  26.         # we can do this but it is not needed normally :-) 
  27.         #1.organizationName             = Second Organization Name (eg, company) 
  28.         #1.organizationName_default     = World Wide Web Pty Ltd 
  29.   
  30.         organizationalUnitName          = Organizational Unit Name (eg, section) 
  31.         #organizationalUnitName_default = 
  32.   
  33.         organizationalUnitName_default  =Tech 
  34.          
  35.         [[email protected] CA]#(umask 077; openssl genrsa 2048 > private/cakey.pem) 
  36.         此时生成的一大段密文,就是我们的私钥,保存至private目录下。 
  37.         [[email protected] private]# ls 
  38.         cakey.pem 
  39.         [[email protected] private]# pwd 
  40.         /etc/pki/CA/private 
  41.         [[email protected] private]# ll 
  42.         -rw------- 1 root root 1675 Oct 22 22:44 cakey.pem 
  43.         [[email protected] CA]# openssl req -new -x509 -days 3650 -key private/cakey.pem -out cacert.pem 
  44.         生成自签证书,x509这个选项就是给自己颁发证书的时候用到的 ,同时也会有以下信息输出。
  45.        (这个就是我们为什么要编辑CA的配置文件,减少工作量并且防止我们填错信息) 
  46.         CN [CN]: 
  47.         State or Province Name (full name) [henan]: 
  48.         Locality Name (eg, city) [zhengzhou]: 
  49.         Organization Name (eg, company) [magedu]: 
  50.         Organizational Unit Name (eg, section) [Tech]: 
  51.         以上信息一路按enter键即可 
  52.         Common Name (eg, your name or your server's hostname) []:ca.magedu.com  
  53.         这一项很关键我们现在时自签给CA自己颁发证书,所以我们这里记录为ca.magedu.com,这项
  54. 和下一项都要手动填写下 。
  55.         Email Address []:[email protected]  
  56.         [[email protected] CA]# ll 
  57.         -rw-r--r-- 1 root root 1651 Oct 22 22:46 cacert.pem 
  58.         drwx------ 2 root root 4096 Oct 22 22:34 private 
  59.         给CA创建运行环境 
  60.         [[email protected] CA]# mkdir certs newcerts crl 
  61.         [[email protected] CA]# ll 
  62.         -rw-r--r-- 1 root root 1651 Oct 22 22:46 cacert.pem 
  63.         drwxr-xr-x 2 root root 4096 Oct 22 22:47 certs 
  64.         drwxr-xr-x 2 root root 4096 Oct 22 22:47 crl 
  65.         drwxr-xr-x 2 root root 4096 Oct 22 22:53 newcerts 
  66.         drwx------ 2 root root 4096 Oct 22 22:34 private 
  67. [[email protected] CA]# touch insex.txt serial [[email protected] CA]# echo 01 > serial
2、给web服务器颁发证书
(注意这个证书可不是CA的自身的证书,CA的证书是客户端用来验正给web服务器发证书的CA)

  1. [[email protected] CA]# cd /etc/httpd/conf 
  2.         [[email protected] conf]# ls 
  3.         httpd.conf  httpd.conf.bak  magic 
  4.         [[email protected] conf]# mkdir ssl 
  5.         为了方便新建一个目录,把它的私钥,申请证书以及以后CA给它颁发的证书都放到此目录中。 
  6.         [[email protected] conf]# cd ssl 
  7.         [[email protected] ssl]# (umask 077; openssl genrsa 1024 > httpd.key) 
  8.         [[email protected] ssl]# openssl req -new -key httpd.key -out httpd.csr 
  9. 制作申请证书,再次证明为什么我们要编辑CA的配置文件,给CA颁证时为什么后面要手动填写。 
  10.         CN [CN]: 
  11.         State or Province Name (full name) [henan]: 
  12.         Locality Name (eg, city) [zhengzhou]: 
  13.         Organization Name (eg, company) [magedu]: 
  14.         Organizational Unit Name (eg, section) [Tech]: 
  15.         Common Name (eg, your name or your server's hostname) []:www.test.net
  16.   这项是非常关键的,这一项即是代表了在为谁申请这个证书,即在互联网上要访问的主机的名称。
  17.     Email Address []:[email protected] 
  18.         -rw-r--r-- 1 root root  708 Oct 22 22:53 httpd.csr 
  19.         -rw------- 1 root root  891 Oct 22 22:50 httpd.key 
  20.         我们的申请证书(httpd.csr)就做好了,现在拿个CA让CA签署我们的申请证书 
  21.         [[email protected] ssl]#openssl ca -in httpd.csr -out httpd.crt -days 365
  22.         [[email protected] ssl]# ll 
  23.         -rw-r--r-- 1 root root 3872 Oct 22 22:53 httpd.crt 
  24.         -rw-r--r-- 1 root root  708 Oct 22 22:53 httpd.csr 
  25.         -rw------- 1 root root  891 Oct 22 22:50 httpd.key 
  26.         我们的证书(httpd.crt)已经颁发下来了,这时候我们的申请证书(httpd.key)就没用了。 
 
二、安装mod_ssl,让httpd支持ssl功能;
 

  1. [[email protected] /]#yum install mod_ssl 
  2.         这个模块安装好,查看有哪些文件被安装了 
  3.         [[email protected] ~]# rpm -ql mod_ssl 
  4.         /etc/httpd/conf.d/ssl.conf 
  5.         生成一个新的配置文件作为主配置文件/etc/httpd/conf/httpd.conf的补充 
  6.         /usr/lib/httpd/modules/mod_ssl.so 
  7.         /var/cache/mod_ssl 
  8.         /var/cache/mod_ssl/scache.dir 
  9.         /var/cache/mod_ssl/scache.pag 
  10.         /var/cache/mod_ssl/scache.sem 
 
三、配置httpd使用前面提供的证书和私钥;
 

  1. [[email protected] /]#vim /etc/httpd/conf.d/ssl.conf 
  2.         找到以下两项,给出web证书以及它的**存放的位置然后我们要重新启动下服务 
  3.         SSLCertificateKeyFile /etc/httpd/conf/ssl/httpd.key 
  4.         SSLCertificateFile /etc/httpd/conf/ssl/httpd.crt 
  5.         [[email protected] /]#service httpd restart 
  6.         检查443端口是否已经打开 
  7.         [[email protected] /]#netstat -tnlp 
  8.         tcp        0      0 :::443         :::*      LISTEN      7008/httpd   
  9.         这条信息表示443端口已经打开了,ssl和httpd正常服务 
四、验正(客户端信任给web服务器发证书的CA);
 
这里是使用IE浏览器,浏览www.test.net,现在就是要把CA的证书(cacert.pem)导 入到我们的客户端让客户端信任我们的颁发者。(此时的证书名称要更改为cacert.crt)
 

如何通过httpd来实现https?(CA自签署证书的实现)

 

如何通过httpd来实现https?(CA自签署证书的实现)

五、测试(此处采用本地测试);


  1. [[email protected] ssl]# openssl s_client -host www.test.net -port 443 -CAfile /etc/pki/CA/cacert.pem 
  2. 此时会只要在显示的内容当中找到以下内容,就表示成功 
  3. SSL-Session: 
  4.     Protocol  : TLSv1 
  5.     Cipher    : DHE-RSA-AES256-SHA 
  6.     Session-ID: CAF837F0A8115730CAB4169CEA8029A9732321F60ACD3C7491B8FF6C15835769 
  7.     Session-ID-ctx:  
  8.     Master-Key: 26E0D0193CF6EEF3C7029FC5F181065E0B378051C2FC5D60C0151F59D9D1CCDFCC9493E74B5D2B26F00A2AFC6DDF157A 
  9.     Key-Arg   : None 
  10.     Krb5 Principal: None 
  11.     Start Time: 1351105702 
  12.     Timeout   : 300 (sec) 
  13.     Verify return code: 0 (ok) 

访问测试页面

  1. [[email protected] ssl]# elinks -dump www.test.net 
  2.                               welcome to testhome