目录
前言
说实话关于apache配置SSL的教程网上已经一抓一大把了,但是它们都有两个共同的缺点,一是不指明操作系统和apache版本,也不指名是自签证书还是购买的证书;二是重复内容太多,往往找十个教程里面有五个甚至以上内容是一样的,垃圾信息满天飞。
准备SSL证书
对于https而言,我们可以准备两种SSL证书,一种是自签名证书,一种是向证书颁发机构(CA)购买的证书。
1 自签名证书与CA证书
自签名,顾名思义就是自己签名,自签名证书的证书颁发机构是服务端本身,而CA证书的证书颁发机构是可信的证书颁发机构。在文件传输的机密性上,自签名证书与CA证书的保护力是相同的,但是CA证书能够证明使用此证书的网站的可信性。
如果上述文字还不够形象的话,请想象客户端A与服务端B、证书颁发机构C为三个人,其中C在整个人类社会中享有一定的知名度(也就是说,AB都认识且新任C),而AB两人素不相识。当A想要访问B却没有关于B的其他信息时:
B掏出一份由C为证明人的证书,告诉A自己是B。(HTTPS+CA证书)
B掏出一份由自己为证明人的证书,告诉A自己是B。(HTTPS+自签名证书)
B不掏出证书,直接说自己是B。(HTTP)
在这三种情况下,A对B的信任度显而易见是逐步递减的。但是,如果在AB本身是认识的情况下(A见过B的签名,但是没有见过B本人,也就是说B作为CA是被A信任的),自签名证书的证明效力并不比CA证书的效力低。所以很多内部使用的网站可以使用自签名证书,这建立在双方原本就约定过的情况下。
2 准备自签名证书
我们使用OpenSSL来生成一个自签名证书(登陆其官网/index.html即可下载)。
安装成功之后,打开安装目录/bin/openssl.exe(请使用管理员权限打开,否则可能出现拒绝访问提示/生成正常但是找不到文件):
1.输入:genrsa -out 你的CAkey文件要存放的位置 2048 生成ca证书密钥。-out说明其为输出文件,2048是其密钥位数。
2.输入:req -new -x509 -days 365 -key 上一步生成文件的位置 -out 你的CAcrt文件要存放的位置 生成ca证书。-x509是其采用的标准,-days说明其生效时间,一般为一年(365)。在输入命令后,openssl会询问你的国家地区机构名等信息,其余信息不想填可以填.(缺省值),请填写你的真实情况(因为他们后期还会被使用),但是其中的CN(Common Name)必须填你颁发证书给的的域名。
3.输入:genrsa -out 你的网站key文件要存放的位置 2048 生成一份网站SSL证书密钥。
4.输入:req -new -key 上一步key文件的位置 -out 你的网站csr文件位置 生成网站证书请求文件CSR。填写信息的规则同上生成crt文件中填写信息的规则。
5.输入:x509 -req -days 365 -in 你的csr文件的位置 -CA 你的ca证书的位置 -CAkey 你的ca密钥的位置 -set_serial 01 -out 你的网站证书要存放的位置 用之前生成的CA证书和密钥给网站证书和密钥签名。
3 准备CA证书
请参照颁发机构的教程。如果你选择的是自己生成请求文件的方式,可以参照上文中准备自签名证书的步骤,但只需要生成一个csr文件。
apache2.4配置SSL证书
1 注意事项
在配置SSL证书的过程中请关闭windows服务下的apache(如果你已经将其作为服务安装),并使用命令行手动启动apache。这有助于你在apache无法启动的情况下发现错误(服务启动不能不会报错,只会报错误代码)。
如果报错Cannot define multiple Listeners on the same IP:port,请检查所有的conf文件(extra文件夹中的也要检查),查看它们是否监听了443端口。
2 SSL证书配置apache
打开apache的配置文件(根文件夹/conf/)httpd.conf,添加以下两行(也可以找到带有注释的这两行并且去除注释符号):
LoadModule ssl_module modules/mod_ssl.so
Include conf/extra/httpd-ssl.conf
打开(根文件夹/conf/extra/)httpd-ssl.conf,修改如下(懒人方法复制粘贴,或者找到这几行然后修改):
Listen 443
SSLPassPhraseDialog builtin
SSLSessionCache "shmcb:${SRVROOT}/logs/ssl_scache(512000)"
SSLSessionCacheTimeout 300
<VirtualHost *:443>
DocumentRoot "apache根目录\htdocs"
ServerName 你的域名:443
SSLEngine on
SSLCertificateFile “网站证书位置"
SSLCertificateKeyFile "网站密钥位置"
#SSLCertificateChainFile "证书链文件位置"
</VirtualHost>
3 CA证书配置apache
参照上一节,去掉注释行的注释。