总结一下Linux(样例为 centos)上 apache 为多台虚拟主机启用 ssl 连接的设置。
生成 SSL 证书
我选择的是 Let’s Encrypt 的免费 ssl 证书。贴个Let’s Encrypt 的说明。
首先使用
wget https://raw.githubusercontent.com/xdtianyu/scripts/master/lets-encrypt/letsencrypt.conf wget https://raw.githubusercontent.com/xdtianyu/scripts/master/lets-encrypt/letsencrypt.sh chmod +x letsencrypt.sh
将两个文件下载到本地并设置执行权限。
修改 letsencrypt.conf 文件中的 DOMAIN_KEY、DOMAIN_DIR 和 DOMAINS 字段值为自己的域名和域名目录。修改完毕后执行 “./letsencrypt.sh letsencrypt.conf” 来生成证书文件,执行需要 python 的运行环境,如果有提示有包缺失的话升级 python 或直接复制一份放到 python 的 lib 目录即可。一般域名目录设置正确,且有权限访问域名子目录下的文件的话基本会成功生成证书。成功后得到下列文件:
- example.crt
- example.csr
- example.chained.crt
- example.com.key
- letsencrypt-account.key
- lets-encrypt-x3-cross-signed.pem
其中 example.crt example.chained.crt 和 example.com.key 是需要写到 apache 的配置中去的。
设置 Apache 配置
假设在主机上已经完成了 VirtualHost 的配置。
首先如果 apache 的 lib 中没有 mod_ssl.so 的话使用 “yum install mod_ssl” 进行下载。随后在配置文件 httpd.conf 中加入 “LoadModule ssl_module /usr/lib/httpd/modules/mod_ssl.so” 即可。
如果你的主机没有像 httpd-ssl.conf 这样的文件的话,在配置文件中加入如下的配置内容:
AddType application/x-x509-ca-cert .crt AddType application/x-pkcs7-crl .crl SSLCipherSuite HIGH:MEDIUM:!MD5:!RC4 SSLProxyCipherSuite HIGH:MEDIUM:!MD5:!RC4 SSLProtocol all -SSLv2 -SSLv3 SSLProxyProtocol all -SSLv2 -SSLv3 SSLSessionCache "shmcb:/path/to/apache/logs/ssl_scache(512000)" SSLSessionCacheTimeout 300 SSLPassPhraseDialog builtin SSLMutex default Listen 443 NameVirtualHost *:443 <VirtualHost *:443> ServerAdmin webmaster@example.com DocumentRoot “/path/to/example.com” ServerName example.com:443 <Directory “/path/to/example.com”> SetOutputFilter DEFLATE Options FollowSymLinks AllowOverride All Order allow,deny Allow from all DirectoryIndex index.html index.php </Directory> SSLEngine on SSLCertificateFile /path/to/example.crt SSLCertificateKeyFile /path/to/example.com.key SSLCertificateChainFile /path/to/example.chained.crt </VirtualHost>
以上路径自行替换成正确的路径,这样就完成了基本的 ssl 设置了。
如果你的主机存在上述文件(httpd-ssl.conf)的话,一般只要在主配置文件中去掉 “Include conf/extra/httpd-ssl.conf” 前的注释符号即可,同时也要去掉 “LoadModule ssl_module modules/mod_ssl.so” 前的注释。并将其中的默认虚拟主机配置修改为自己的配置,或者就这样将所有路径设为不可访问后留作默认响应的主机。
设置 .htaccess 转发
在 .htaccess 中添加转发规则
RewriteCond %{HTTPS} !=on RewriteRule ^(.*) https://%{SERVER_NAME}/$1 [R,L]
最后重启 apache 服务。
可以加个cron 定时任务,每个月自动更新一次证书,可以在脚本最后加入 /etc/init.d/httpd restart 等重新加载服务。
0 0 1 * * /etc/nginx/certs/letsencrypt.sh /etc/nginx/certs/letsencrypt.conf >> /var/log/lets-encrypt.log 2>&1
——————————-贴一个 apache 虚拟主机匹配的参考:深入研究虚拟主机的匹配