总结一下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 虚拟主机匹配的参考:深入研究虚拟主机的匹配