本站已正式添加DNS CAA

DNS Certification Authority Authorization (DNS CAA)是通过为域名添加一条DNS CAA记录,来限制特定CA为该域名签发证书的一种方法,从而实现防止攻击者使用其他CA错误签发的证书进行中间人攻击。

现在支持DNS CAA的DNS服务供应商还不多,但从2017年9月8日起,所有CA将被要求检查并遵守域的CAA记录,到那个时候DNS CAA应该会快速普及。另一方面,SSL Labs早在今年年初就开始检测DNS CAA记录,虽然暂时还没有影响到评级,但没有添加CAA记录的域名会被标记为橙色警告。

本站现在添加的CAA记录有两条,分别为

prinice.org. IN CAA 0 issue “letsencrypt.org”
prinice.org. IN CAA 0 issue “comodoca.com”

也就是只允许Let’s Encrypt和COMODO两家CA为本域名签发证书。要了解更多DNS CAA的内容,可以参见本站另一篇文章:DNS Certification Authority Authorization (DNS CAA)简介和部署教程

DNS Certification Authority Authorization (DNS CAA)简介和部署教程

可能很多人对HTTP Public Key Pinning (HPKP)已经有所了解,也有少数网站已经开始部署HPKP用来防止攻击者使用CA错误签发的证书进行中间人攻击。但HPKP由于部署难度非常大,而且不合适的部署会影响网站的访问甚至弄垮一家公司,所以,HPKP的使用率一直不理想。DNS Certification Authority Authorization (DNS CAA)则用另一种实现方法解决了这个问题。

DNS CAA通过添加一条DNS CAA记录,限制可签发该域名证书的CA,从而实现防止攻击者使用其他CA错误签发的证书进行中间人攻击。相比HPKP,DNS CAA的实现更加简单方便,但缺点也很明显。HPKP可以根据需要,固定不同级别的证书,比如可以固定网站现有的证书来实现最高的安全性,也可以固定CA的中间证书,从而保证网站的可访问性,如果你高度信任CA的根证书,甚至还可以固定根证书。而DNS CAA却只能选择一家或几家信任的CA为其签发证书,效果类似于HPKP固定CA的证书。所以,相比HPKP的高部署难度,DNS CAA是一种非常好的折衷方案,并且,它可以和HPKP同时部署。

接下来讲讲如何部署DNS CAA。如果DNS服务提供商有提供CAA记录,那么非常简单,设置一条CAA记录即可,例如Let’s Encrypt的CAA记录。

example.org. CAA 0 issue "letsencrypt.org"

也可以增加以下内容,在发现攻击者使用CA错误签发的证书进行中间人攻击时发送邮件告知。

example.org. CAA 0 iodef "mailto:caa@example.org"

但是,现在支持CAA记录的DNS服务提供商还很少,我知道的只有Google Cloud DNS、DNSimple,不过随着Qualys SSL Labs增加对DNS CAA的检测,相信很快会有更多的DNS服务提供商会增加对CAA记录的支持。

如果要自己部署DNS服务来实现DNS CAA,目前BIND ≥9.9.6, PowerDNS ≥4.0.0, NSD ≥4.0.1, Knot DNS ≥2.2.0都已经对其提供较好的支持。

本站已开始使用ECC证书

Let’s Encrypt开始签发ECC证书已经有一段时间了,而且很多网站都开始换用ECC证书了,本站也在最近换用了Let’s Encrypt的ECC证书。这里简单就写个介绍和教程。

ECC证书也就是内置了ECDSA公钥的证书,而传统的RSA证书内置的是RSA公钥。ECC证书公钥长度短,256 bits的ECC Key安全性等效于3072 bits的RSA Key,运算速度更快。因此,ECDHE密钥交换+ECDSA数字签名无疑是目前更好的选择。ECC证书并不支持老旧的Windows XP和Android 2.x,但考虑到本站的客户群根本不是这些用古老客户端的人群,所以就无视了。

比较遗憾的是,现在Let’s Encrypt的中间证书依然是RSA证书,所以从整个证书链来讲也没有缩短多少,期待明年Let’s Encrypt开始采用ECC中间证书。ECDSA Intermediates (ETA: Before March 31, 2017)

这里推荐使用acme.sh来获取ECC证书,使用起来非常简单,而且还支持DNS验证域名,更灵活。

先是安装。

wget -O -  https://get.acme.sh | sh

acme.sh支持多种验证方式,并且支持Apache配置,非常方便,详见GitHub页面

如果你已经在服务器上运行了Apache,并且正确配置了DNS解析、hostname、fully-qualified domain name (FQDN)、ServerName和ServerAlias,那可以直接使用Apache模式,很简单的命令。

acme.sh --issue --apache -d aa.com -d www.aa.com -d user.aa.com --keylength ec-256

这样就获得了ECC证书,并且acme.sh支持自动续期,只要你不更改上面所说的配置,每隔80天会自动续期。ec-256是ECC Key长度,可选ec-384,但其实选用ec-256已经足够安全。

接下来,OpenSSL版本是1.0.2或更高,可以尝试部署ECC+RSA双证书以保证向后兼容性,你也许还需要获取一个RSA证书,只要输入以下命令就行。

acme.sh --issue --apache -d aa.com -d www.aa.com -d user.aa.com

接下来这里讲讲DNS验证,其实也很简单,先输入以下命令。

acme.sh --issue --dns -d aa.com -d www.aa.com -d user.aa.com --keylength  ec-256

然后会看到一串字符串。

Add the following txt record:
Domain:_acme-challenge.aa.com
Txt value:9ihDbjYfTExAYeDs4DBUeuTo18KBzwvTEjUnSwd32-c

Add the following txt record:
Domain:_acme-challenge.www.aa.com
Txt value:9ihDbjxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx

Please add those txt records to the domains. Waiting for the dns to take effect.

去你的DNS服务提供商处添加相应的TXT记录,等DNS记录生效后,再运行以下命令。

acme.sh --renew -d aa.com --ecc

这样就获得了ECC证书。

接下来,你也许还需要获取一个RSA证书,只要输入以下命令就行。

acme.sh --issue --dns -d aa.com -d www.aa.com -d user.aa.com

这时会看到域名已经验证的提示,直接获得对应的RSA证书。更改Apache或者其他要用证书的服务器端软件的配置,也许还要更改一下Cipher Suite等安全配置,参考这里,这样就大功告成了。

HTTP Public Key Pinning (HPKP)简介和部署教程(Apache)

HTTP Public Key Pinning (HPKP),中文一般译作“HTTP公钥固定”或者“HTTP公钥钉”,它是一种HTTPS网站防止攻击者使用CA错误签发的证书进行中间人攻击的安全机制,例如有时攻击者可以入侵CA然后偷偷签发证书,现在也有一些还在被浏览器信任的CA频频被曝出签发伪造证书。启用HPKP的网站,由HTTPS网站服务器提供一个公钥哈希列表并使客户端在后续的链接中只接受在列表上的一个或多个公钥。

服务器通过Public-Key-Pins HTTP头向浏览器指定公钥,退一步,也可以通过Public-Key-Pins-Report-Only HTTP头向浏览器报告非法公钥,而非直接拒绝访问。当然,最追求安全的做法就是强制固定公钥。

如今配置了HPKP的网站还不到1%,其原因在于,HPKP的部署是需要深思熟虑的,不恰当的配置会引来诸多麻烦,错误的配置会导致网站长期无法访问,这可以直接毁掉一家大型的公司。

关于HPKP更多的介绍建议直接搜索专业的文档,这里接下来就以Apache服务器端为例讲讲如何在一个网站上使用HPKP。

首先,最关键的一点,确定需要固定的公钥,HPKP一般可以固定三种公钥,一是网站当前的证书公钥,二是包含CA和中级证书的公钥,三是备份公钥,而备份公钥可以是已经签发的网站有效证书公钥,也可以是CA和中级证书的公钥,这里就要考虑哪种部署方案适合该网站。直接固定网站当前的证书公钥无疑是最安全的,但如果哪天更换该证书,而HPKP规则过期时间还没有到,这时候如果没有固定其他有效的公钥,会直接导致网站无法访问。如果固定的是CA和中级证书的公钥,万一这家CA被攻破或者恶意签发了网站证书,你的网站将面临中间人攻击风险,但好处就是,你只要不换CA,且CA的公钥还在继续签发证书,这个固定就是有效的,无论你换了多少该CA的证书。所以,绑定一个备用公钥是很有必要的。

本站目前的选择是,首先固定了Let’s Encrypt Authority X3的公钥,这是本站目前的CA所使用的公钥,是非常安全可靠的。然后固定了另一个大家所熟知但不太靠谱的免费CA为本站签发的有效证书公钥作为备份公钥,因为我不太信任那家CA,所以并没有选择直接固定那家CA的公钥。

选择好了要固定的公钥,接下来一个困难的选择就是HPKP规则过期时间,因为一旦固定的公钥不能用,而HPKP规则过期时间还没到,那网站就无法访问了。时间设置越久,越能有效保护访问的用户,但证书不能用的风险就越大,而时间设置越短,越容易在HPKP规则过期后用户第一次访问时遭遇中间人攻击。本站并不是特别重要的站点,也没有被中间人攻击的价值,所以目前仅仅设置了一周的时间,一些注重安全又走在技术前沿的著名站点往往会设置一个月以上的时间。

接下来,其实设置的过程非常简单。首先,为需要绑定的证书公钥生成SPKI指纹。

openssl x509 -noout -in certificate.pem -pubkey | \
openssl asn1parse -noout -inform pem -out public.key;
openssl dgst -sha256 -binary public.key | openssl enc -base64

输出结果。

YLh1dUR9y6Kja30RrAn7JKnbQG/uEtLMkBgFF2Fuihg=

其他要绑定哪些密钥也用同样的方法生成SPKI指纹,然后打开Apache的HTTPS站点配置文件,加入HPKP头。

Header always set Public-Key-Pins "pin-sha256=\"YLh1dUR9y6Kja30RrAn7JKnbQG/uEtLMkBgFF2Fuihg=\"; max-age=604800; includeSubDomains"

其中,pin-sha256可以设置多个,max-age为规则过期时间,includeSubDomains是指包含子域名。

然后重启Apache,规则就生效了,很简单,最关键的,还是选择合适的固定公钥以及合适的过期时间。

本站已被加入HSTS Preload List

大概一个多月前,本站启用了HSTS,并且配置了HSTS Preload,然后向https://hstspreload.appspot.com/提交了申请,虽然审核比较慢,但前几天终于在HSTS preload list中找到了本站的域名。通过Qualys SSL Labs,可以看到最先是Chrome的preload list中收录了本站,之后没过几天,几个主流的浏览器都陆续收录了本站的域名,HSTS完美了,从此以后不用担心任何劫持了。

关于HSTS的详细设置,请参见另一篇文章:Apache开启HSTS (HTTP Strict Transport Security)

Apache开启HSTS (HTTP Strict Transport Security)

重定向HTTP至HTTPS并不能解决劫持问题,而且现在很多运营商劫持行为很普遍、WIFI热点劫持也非常多,在HTTP跳转至HTTPS之前就会劫持用户,这些都存在着很大的安全风险。因此,HSTS (HTTP Strict Transport Security,即HTTP严格传输安全) 就显得很重要了。

设置很简单,这里以Apache默认的SSL站点为例。首先启用Mod_Headers模块。

a2enmod headers

然后打开HTTPS站点的配置文件。

vi /etc/apache2/sites-available/default-ssl.conf

在<VirtualHost *:443>中添加如下内容。

# HSTS (mod_headers is required) (15768000 seconds = 6 months)
Header always set Strict-Transport-Security "max-age=15768000; includeSubDomains; preload"

max-age为HSTS过期时间,一般建议不小于18周(10886400秒),这里设置为6个月,includeSubDomains是指包含子域名,为了最大程度地保护该域名下地所有站点,建议加上,而如果某个子域名不强制使用HTTPS,就不要在根域名加。preload代表启用HSTS Preload (HSTS预加载),只有被浏览器预加载的HSTS,才能够保证在任何情况下都不被劫持,否则在第一次访问该站点时还是有被劫持的可能。

最后再重启一下Apache使配置生效。

service apache2 restart

好了,HSTS已经可以使用了。再也不用担心用户访问自己的网站时被劫持了。当然,如果不启用HSTS Preload,第一次访问或者上面设置的半年时间失效后的第一次访问,还是有可能被劫持的。如果要启用HSTS Preload,在设置好上面的内容之后,还要去下面这个网址提交你的域名。方法很简单,照着提示做就好。

https://hstspreload.appspot.com/

需要注意的是,按照提交的要求,preload必须和includeSubDomains一起使用,并且保证max-age不小于18周,当然,使用有效并且可信的SSL证书,设置HTTP重定向到HTTPS这类常规要求肯定是要的。

有人觉得HSTS配置也可以写在.htaccess中,但其实Apache和HSTS规范中都是不建议这样做的,因为这会导致访问HTTP站点时也会收到HSTS Header。当然,这其实不是个问题,因为HSTS本身就是为强制使用HTTPS访问设计的,但规范中是不建议的。

Apache开启重定向HTTP至HTTPS

网站启用了SSL之后,需要使用HTTPS才能加密访问,默认还是可以通过明文的HTTP访问。但只要简单设置,就可以把HTTP请求重定向至HTTPS。

Apache开启重定向HTTP至HTTPS的方法有很多种,现在比较流行的是通过Mod_Rewrite实现。

首先启用Mod_Rewrite模块。

a2enmod rewrite

一种方法是修改HTTP虚拟站点配置文件。

打开HTTP虚拟站点配置文件,默认的话,Apache 2.4是/etc/apache2/sites-available/000-default.conf,而Apache 2.2是/etc/apache2/sites-available/default,在其中写入以下代码,把其他的内容都注释掉,就行了。

<VirtualHost *:80>
 RewriteEngine on
 RewriteCond %{HTTPS} !=on [NC]
 RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L]
</VirtualHost>

另一种方法是修改.htaccess文件。

首先要启用Override使.htaccess文件配置生效。

如果是Apache 2.4,修改Apache的配置文件。

vi /etc/apache2/apache2.conf

找到以下内容,修改其中的AllowOverride为All。

<Directory /var/www/>
 Options Indexes FollowSymLinks
 AllowOverride All
 Require all granted
</Directory>

如果是Apache 2.2,修改Apache的网站配置文件,这里以默认的网站配置文件为例,先修改HTTP虚拟站点的配置文件。

vi /etc/apache2/sites-available/default

找到以下内容,修改其中的AllowOverride为All。

<Directory /var/www/>
 Options Indexes FollowSymLinks MultiViews
 AllowOverride All
 Order allow,deny
 allow from all
</Directory>

再修改HTTPS虚拟站点的配置文件。

vi /etc/apache2/sites-available/default-ssl

作同样修改。

<Directory /var/www/>
                Options Indexes FollowSymLinks MultiViews
                AllowOverride All
                Order allow,deny
                allow from all
</Directory>

之后就可以配置.htaccess文件了。

在网站根目录创建.htaccess文件,注意如果有子网站的话,子网站根目录也要创建。

vi /var/www/html/.htaccess

添加如下配置。

<IfModule mod_rewrite.c>
 RewriteEngine on
 RewriteCond %{HTTPS} !=on [NC]
 RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L]
</IfModule>

更改.htaccess的所有者和组为www-data。

chown www-data:www-data /var/www/html/.htaccess

最后再重启一下Apache。

service apache2 restart

好了,去浏览器直接输入域名看看是不是可以自动跳转到HTTPS了。

其实,如果你是为WordPress开启重定向HTTP到HTTPS的话,还可以借助一款叫做Really Simple SSL的插件,根据提示做就行,非常方便,不过原理基本上是一样的。

最后,再说一说这两种方法的区别,第一种修改HTTP虚拟站点配置文件的方法,是针对该虚拟站点生效,访问该虚拟站点的HTTP请求都会被重定向到HTTPS。第二种修改.htaccess文件的方法,是针对.htaccess文件所在文件夹生效,访问该文件夹的HTTP请求会被重定向到HTTPS。具体还是要看需求而定,我两种方法都试过,现在比较偏向于修改HTTP虚拟站点配置。

Apache禁用SSLv3和RC4并启用Forward Secrecy

Apache默认是启用SSLv3和RC4的,但其实SSLv3和RC4都已经不够安全,应当禁用。而启用Forward Secrecy能够增强主流浏览器访问的前向安全性。方法很简单,首先修改网站的配置文件,下面以默认站点配置文件为例。

如果是Apache 2.4,编辑以下文件。

vi /etc/apache2/sites-available/default-ssl.conf

在文件最下方增加以下几行,第一行禁用SSLv3,同时也禁用了RC4等不安全的Cipher,第二行选择优先的Cipher,并为支持的浏览器启用Forward Secrecy,并保持向后兼容,第三行由服务器选择Cipher而不是客户端,第四行关闭SSL压缩,第五行关闭SSL Session Tickets。

SSLProtocol             all -SSLv3
SSLCipherSuite          ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES256-SHA384:ECDHE-RSA-AES128-SHA:ECDHE-ECDSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA:ECDHE-RSA-AES256-SHA:DHE-RSA-AES128-SHA256:DHE-RSA-AES128-SHA:DHE-RSA-AES256-SHA256:DHE-RSA-AES256-SHA:ECDHE-ECDSA-DES-CBC3-SHA:ECDHE-RSA-DES-CBC3-SHA:EDH-RSA-DES-CBC3-SHA:AES128-GCM-SHA256:AES256-GCM-SHA384:AES128-SHA256:AES256-SHA256:AES128-SHA:AES256-SHA:DES-CBC3-SHA:!DSS
SSLHonorCipherOrder     on
SSLCompression          off
SSLSessionTickets       off

如果是Apache 2.2,有些地方有些变化,编辑以下文件。

vi /etc/apache2/sites-available/default-ssl

在文件最下方增加以下几行,第一行禁用SSLv3和SSLv2,同时也禁用了RC4等不安全的Cipher,第二行选择优先的Cipher,并为支持的浏览器启用Forward Secrecy,并保持向后兼容,第三行由服务器选择Cipher而不是客户端。

SSLProtocol             all -SSLv2 -SSLv3
SSLCipherSuite          ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES256-SHA384:ECDHE-RSA-AES128-SHA:ECDHE-ECDSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA:ECDHE-RSA-AES256-SHA:DHE-RSA-AES128-SHA256:DHE-RSA-AES128-SHA:DHE-RSA-AES256-SHA256:DHE-RSA-AES256-SHA:ECDHE-ECDSA-DES-CBC3-SHA:ECDHE-RSA-DES-CBC3-SHA:EDH-RSA-DES-CBC3-SHA:AES128-GCM-SHA256:AES256-GCM-SHA384:AES128-SHA256:AES256-SHA256:AES128-SHA:AES256-SHA:DES-CBC3-SHA:!DSS
SSLHonorCipherOrder     on

重新启动Apache。

service apache2 restart

测试一下吧,应该这样就OK了。

这里选用的是一种较为常用的Cipher Suite,可以根据自己需要做进一步的优化。

写给像我这样的新手的FTPS (FTP over SSL)教程 (Debian)

虽然WordPress已经可以不依赖FTP,但FTP作为一个简单而常用的基本服务,还是有必要写一个教程。但是呢,FTP不安全!FTP不安全!FTP不安全!重要的事情说三遍。WordPress是支持FTPS的,其他也有很多支持FTPS的客户端,其实FTP over SSL的名称有很多,FTPS (FTPES, FTP-SSL, S-FTP, FTP Secure),各种叫法,都是指的这东西,知道是一回事儿就行。

FTPS的服务器端似乎有不少,不过还是推荐大名鼎鼎的vsftpd,首先是安装。

apt-get install vsftpd

然后进行配置,我还是用vi,你们文本编辑器随意,自己习惯就好。

vi /etc/vsftpd.conf

找到以下几行,改成如下所示,有几行去掉备注就好。

anonymous_enable=NO
local_enable=YES
write_enable=YES
chroot_local_user=YES

保存并退出。然后创建FTP用户,用户名随意,这里用的ftpuser1,改成自己设定的

adduser ftpuser1

按照要求输入用户的密码,不要留空。

这个时候要设置FTP的主目录。首先更改FTP主目录所有者为root。

chown root:root /home/ftpuser

在主目录下为ftpuser1创建一个文件目录,并将该目录的所有者设置为ftpuser1

mkdir /home/ftpuser/files
chown ftpuser1:ftpuser /home/ftpuser/ftpuser1

虽然不是必须,但有些人可能会为WordPress创建一个FTP用于更新、下载插件和主题等,我以前也是这样做的。如果你是为WordPress配置FTP,需要在wp-config.php里面加如下代码,但不推荐

if( is_admin() ) {

 add_filter( 'filesystem_method', create_function( '$a', 'return "direct";' ) );

 define( 'FS_CHMOD_DIR', 0751 );

}

这时,实际上已经可以用FTP了,但是,FTP不安全!FTP不安全!FTP不安全!重要的事情再说三遍。下面为FTP设置SSL。这里默认你已经申请到了可以用的证书,具体如何申请证书改天再写一篇吧。为了方便管理证书,先创建一个放置证书的文件夹。

mkdir /etc/ssl/private/

可能有些系统上已经有这个文件夹了,那就直接下一步。创建一个证书文件,这里还是用vi。

vi /etc/ssl/private/vsftpd.pem

把申请到的证书连同CA的中间证书先后贴进去做成证书链,有些CA会给你做好打包证书,那就直接贴就行了。

然后创建私钥文件ssl.key,把申请证书用的私钥贴进去。

vi /etc/ssl/private/ssl.key

注意如果私钥是被加密过的,这里要解密,解密后命名为vsftpd.key,当然,这两个文件名都可以任意,只要后面配置的路径和文件名对就行。

openssl rsa -in /etc/ssl/private/ssl.key -out /etc/ssl/private/vsftpd.key

接下来编辑vsftpd的配置文件。

vi /etc/vsftpd.conf

在文件的最后那里找到下面这行,改成如下所示。

rsa_cert_file=/etc/ssl/private/vsftpd.pem

然后再在文件最后添加这些内容。

rsa_private_key_file=/etc/ssl/private/vsftpd.key
ssl_enable=YES
allow_anon_ssl=NO
force_local_data_ssl=YES
force_local_logins_ssl=YES
ssl_tlsv1=YES
ssl_sslv2=NO
ssl_sslv3=NO
require_ssl_reuse=NO
ssl_ciphers=HIGH

最后重启一下vsftpd服务。

service vsftpd restart

到这里FTPS就可以用了,你可以用支持SSL的FTP客户端连接你的FTP。

而对于WordPress,如果你选择使用FTP来管理文件,接下来要做的就是去网站后台把刚才设置的FTP的地址、用户名和密码维护进去,然后就可以直接在页面上进行更新,安装插件、主题等操作了。

为网站启用HTTPS (Apache)

现在通过SSL证书加密的HTTPS网站非常流行,免费的有大名鼎鼎的Let’s encrypt,还有以前就有的StartCom,WoSign之类的,而且谷歌也更优待启用了HTTPS的网站。所以,自己的WordPress何不也弄一个SSL证书来加密呢。

本站暂时用的StartCom的证书,不过基于某个很多人都知道的原因,我准备过段时间换成Let’s encrypt试试。废话不多说,开始写教程。

首先为Apache启用SSL支持。

a2enmod ssl

重启一下服务。

service apache2 restart

为了方便管理,在Apache的配置目录下创建一个放置证书的文件夹。

mkdir /etc/apache2/ssl.crt

这里默认你已经申请到了可以用的证书,具体如何申请证书改天再写一篇吧,而且我准备改天再写一篇关于Let’s encrypt的,这里就不废话了。

在刚刚创建的文件夹下创建一个证书文件example.com.crt。我喜欢用vi命令,你们随意,任意自己习惯的文本编辑器都行。

vi /etc/apache2/ssl.crt/example.com.crt

将申请到的证书文件文本贴进去。

然后创建私钥文件example.com.key,把申请证书用的私钥贴进去。

vi /etc/apache2/ssl.crt/example.com.key

注意如果私钥是被加密过的,这里要解密,如果加密的私钥为/path/to/example.key解密运行以下命令。

openssl rsa -in /path/to/example.key -out /etc/apache2/ssl.crt/example.com.key

这还没完,还要创建一个证书链文件ca.crt。

vi /etc/apache2/ssl.crt/ca.crt

如果是Apache 2.4,建议把证书文件example.com.crt和ca.crt做成证书链文件fullchain.crt。

cd /etc/apache2/ssl.crt
cat example.com.crt ca.crt > fullchain.crt

下一步,修改Apache的网站配置文件,如果是Apache 2.4,运行以下命令。

vi /etc/apache2/sites-available/default-ssl.conf

找到<VirtualHost *:443>,在其中的Server Admin email:下面增加以下两行,其中example.com是你的域名。

ServerName www.example.com:443
ServerAlias example.com www.example.com

继续往下,找到以下几行,改成如下所示。

SSLEngine on
SSLCertificateFile /etc/apache2/ssl.crt/fullchain.crt
SSLCertificateKeyFile /etc/apache2/ssl.crt/example.com.key

如果是Apache 2.2,运行以下命令。

vi /etc/apache2/sites-available/default-ssl

找到<VirtualHost *:443>,在其中的Server Admin email:下面增加以下两行,其中example.com是你的域名。

ServerName www.example.com:443
ServerAlias example.com www.example.com

继续往下,找到以下几行,改成如下所示。

SSLEngine on
SSLCertificateFile /etc/apache2/ssl.crt/example.com.crt
SSLCertificateKeyFile /etc/apache2/ssl.crt/example.com.key
SSLCertificateChainFile /etc/apache2/ssl.crt/ca.crt

启用刚刚设置好的虚拟服务器。

a2ensite default-ssl

再重载一下Apache。

service apache2 reload

好了,已经可以通过HTTP S访问你的WordPress了。如果要强制所有访问都通过HTTPS,还需要进一步设置,下次再写了。