通过httpd实现https(CA自签署证书详解)

如何通过httpd来实现https?[这就要基于SSL]
https是监听在tcp的443端口
ssl是基于IP地址实现的,https虚拟主机仅能基于IP地址实现
httpd要想实现https的功能是基于模块mod_ssl来实现的

前提:目前三个虚拟主机指向的是同一个IP地址172.16.16.3,所以我们只能为其中某一个提供SSL功能,所以以下选择为www.test.net提供ssl功能。(虚拟主机事先定义好的,具体怎么定义上一篇博客会有介绍)

一、为web服务器提供证书;(假设当前服务器就是CA)
1、建立CA
[root@ns1 /]#vim /etc/pki/tls/openssl.cnf
编辑CA的配置文件,这个主要是为了颁发证书的时候,直接就可以enter一路向下了。需找到以下的内容,然后更改主要是更改“_default”对于的值。(读者打开这个配置文件就可看到以下的内容)
[ CA_default ]

dir = /etc/pki/CA # Where everything is kept
certs = $dir/certs # Where the issued certs are kept
crl_dir = $dir/crl # Where the issued crl are kept
database = $dir/index.txt # database index file.
[ req_distinguished_name ]
countryName = Country Name (2 letter code)
countryName_default = CN
countryName_min = 2
countryName_max = 2

stateOrProvinceName = State or Province Name (full name)
stateOrProvinceName_default = henan

localityName = Locality Name (eg, city)
localityName_default = zhengzhou

0.organizationName = Organization Name (eg, company)
0.organizationName_default = magedu

# we can do this but it is not needed normally :-)
#1.organizationName = Second Organization Name (eg, company)
#1.organizationName_default = World Wide Web Pty Ltd

organizationalUnitName = Organizational Unit Name (eg, section)
#organizationalUnitName_default =

organizationalUnitName_default =Tech

[root@ns1 CA]#(umask 077; openssl genrsa 2048 > private/cakey.pem)
此时生成的一大段密文,就是我们的私钥,保存至private目录下。
[root@ns1 private]# ls
cakey.pem
[root@ns1 private]# pwd
/etc/pki/CA/private
[root@ns1 private]# ll
-rw------- 1 root root 1675 Oct 22 22:44 cakey.pem
[root@ns1 CA]# openssl req -new -x509 -days 3650 -key private/cakey.pem -out cacert.pem
生成自签证书,x509这个选项就是给自己颁发证书的时候用到的
这个时候就会有以下的信息输出(这个就是我们为什么要编辑CA的配置文件,减少工作量并且防止我们填错信息)
CN [CN]:
State or Province Name (full name) [henan]:
Locality Name (eg, city) [zhengzhou]:
Organization Name (eg, company) [magedu]:
Organizational Unit Name (eg, section) [Tech]:
以上信息一路按enter键即可
Common Name (eg, your name or your server's hostname) []:ca.magedu.com
这一项很关键我们现在时自签给CA自己颁发证书,所以我们这里记录为ca.magedu.com,这项和下一项都要手动填写下
Email Address []:caadmin@magecu.com
[root@ns1 CA]# ll
-rw-r--r-- 1 root root 1651 Oct 22 22:46 cacert.pem
drwx------ 2 root root 4096 Oct 22 22:34 private
给CA创建运行环境
[root@ns1 CA]# mkdir certs newcerts crl
[root@ns1 CA]# ll
-rw-r--r-- 1 root root 1651 Oct 22 22:46 cacert.pem
drwxr-xr-x 2 root root 4096 Oct 22 22:47 certs
drwxr-xr-x 2 root root 4096 Oct 22 22:47 crl
drwxr-xr-x 2 root root 4096 Oct 22 22:53 newcerts
drwx------ 2 root root 4096 Oct 22 22:34 private
2、给web服务器颁发证书(注意这个证书可不是CA的自身的证书,CA的证书是客户端用来验正给web服务器发证书的CA)
[root@ns1 CA]# cd /etc/httpd/conf
[root@ns1 conf]# ls
httpd.conf httpd.conf.bak magic
[root@ns1 conf]# mkdir ssl
为了方便我们新建一个目录,把
[root@ns1 conf]# cd ssl
[root@ns1 ssl]# (umask 077; openssl genrsa 1024 > httpd.key)
[root@ns1 ssl]# openssl req -new -key httpd.key -out httpd.csr
生成申请证书,这时候同样会有内容输出我们是私有CA所以有几条一定要和CA证书上面的一摸一样,再次证明为什么我们要编辑CA的配置文件,给CA颁证的时候为什么后面要手动填写。
CN [CN]:
State or Province Name (full name) [henan]:
Locality Name (eg, city) [zhengzhou]:
Organization Name (eg, company) [magedu]:
Organizational Unit Name (eg, section) [Tech]:
Common Name (eg, your name or your server's hostname) []:www.test.net
这个非常非常非常的关键,这一项就是代表了你为谁申请这个证书,即是你在互联网上要访问的主机名称,在一开始我就决定为虚拟主机www.test.net申请证书,所以你懂得。
Email Address []:webmaster@test.net
这项就没有严格要求了,我这里是为web发证(我的虚拟主机www.test.net是台web服务器),为见明知意,写成了webmaster@test.net
[root@ns1 ssl]# ll
-rw-r--r-- 1 root root 708 Oct 22 22:53 httpd.csr
-rw------- 1 root root 891 Oct 22 22:50 httpd.key
我们的申请证书(httpd.csr)就做好了,现在拿个CA让CA签署我们的申请证书
[root@ns1 ssl]#openssl ca -in httpd.csr -out httpd.crt -days 365
[root@ns1 ssl]# ll
-rw-r--r-- 1 root root 3872 Oct 22 22:53 httpd.crt
-rw-r--r-- 1 root root 708 Oct 22 22:53 httpd.csr
-rw------- 1 root root 891 Oct 22 22:50 httpd.key
我们的证书(httpd.crt)已经颁发下来了,这时候我们的申请证书(httpd.key)就没用了,不用管它。


二、安装mod_ssl,让httpd支持ssl功能;


[root@ns1 /]#yum install mod_ssl
这个模块安装好,查看有哪些文件被安装了
[root@ns1 ~]# rpm -ql mod_ssl
/etc/httpd/conf.d/ssl.conf
从这条可以看出它自己又生成了个新的配置文件作为主配置文件/etc/httpd/conf/httpd.conf的补充
/usr/lib/httpd/modules/mod_ssl.so
/var/cache/mod_ssl
/var/cache/mod_ssl/scache.dir
/var/cache/mod_ssl/scache.pag
/var/cache/mod_ssl/scache.sem
[root@ns1 /]#vim /etc/httpd/conf.d/ssl.conf
找到以下两项,给出web证书以及它的密钥存放的位置然后我们要重新启动下服务
SSLCertificateKeyFile /etc/httpd/conf/ssl/httpd.key
SSLCertificateFile /etc/httpd/conf/ssl/httpd.crt
[root@ns1 /]#service httpd restart
检查443端口是否已经打开
[root@ns1 /]#netstat -tnlp
tcp 0 0 :::443 :::* LISTEN 7008/httpd
这条信息表示443端口已经打开了,ssl和httpd正常服务


三、配置httpd使用前面提供的证书和私钥;

[root@ns1 /]#vim /etc/httpd/conf.d/ssl.conf
找到以下两项,给出web证书以及它的密钥存放的位置然后我们要重新启动下服务
SSLCertificateKeyFile /etc/httpd/conf/ssl/httpd.key
SSLCertificateFile /etc/httpd/conf/ssl/httpd.crt
[root@ns1 /]#service httpd restart
检查443端口是否已经打开
[root@ns1 /]#netstat -tnlp
tcp 0 0 :::443 :::* LISTEN 7008/httpd
这条信息表示443端口已经打开了,ssl和httpd正常服务

四、验正(客户端信任给web服务器发证书的CA);


这里是使用IE浏览器,浏览www.test.net,现在就是要把CA的证书(cacert.pem)导入到我们的客户端让客户端信任我们的颁发者。(此时的证书名称要更改为cacert.crt

后感:细致细心可以避免很多不必要的麻烦!

posted on 2012-10-24 13:54  猫学历险记  阅读(1313)  评论(1编辑  收藏  举报

导航