昨晚又吃饱了撑的,又买了个 SSL 证书,给博客配置上了 HTTPS。

对于博客而言,上 HTTPS 其实并没有什么卵用,纯粹是为了信仰。

准备

PositiveSSL

首先你得买个证书。

namecheap 上 PositiveSSL 证书一年只要 9 美元,人民币不到 60。先别急着激活。

域名邮箱

namecheap 的 SSL 证书需要使用你的域名邮箱进行认证。比如域名是example.com,你就需要有一个[email protected]的邮箱。

这里可以去申请免费的 QQ 企业邮箱。按照里面说的,去你的域名托管商那里修改 MX 记录。比较例外的是,我的 .io 域名,不被 QQ 企业邮箱支持。所以我换了网易企业邮箱。网易的比较坑,MX 记录过了好几个小时才生效。

服务器

接下来在你的服务器端生成你的 key。

openssl req -new -newkey rsa:2048 -nodes -keyout example_com.key -out example_com.csr

上面的名字自己看喜好替换。

这时你会有两个文件:example_com.key是你的私钥,一会配置 Nginx 要用;example_com.csr是给 namecheap 的。

激活

复制example_com.csr里面的内容,到 namecheap 的网站上,到你的管理后台,点击 activate。

图1

写域名的话就是你想保护的域名。然后把刚才的 csr 内容贴到框里。服务器类型选 nginx。

下一步之后选择你刚才开通的[email protected]邮箱。

然后就等着收激活邮件,点击激活链接,把邮件里的 token 提交上去。然后这个证书就激活了。

激活之后,namecheap 会给你域名的管理邮箱,有可能是你自己的邮箱,也有可能是刚才的 admin 的邮箱,看你的选择,发送一封邮件,附件是一个证书 .zip 文件。

配置

把上面的 .zip 文件弄到你的服务器上。unzip 解压之后,把这些文件聚合到一个文件里。

cat www_example_com.crt COMODORSADomainValidationSecureServerCA.crt COMODORSAAddTrustCA.crt AddTrustExternalCARoot.crt > ssl-bundle.crt

这儿顺序不能错。相应文件的名字自己替换一下。

接下来我们配置 Nginx。

先把证书什么的丢进去。

1
2
3
mkdir -p /etc/nginx/ssl/example_com/
mv ssl-bundle.crt /etc/nginx/ssl/example_com/
mv example_com.key /etc/nginx/ssl/example_com/

修改博客的 nginx 配置,如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
server {
listen 443;
server_name 0x01.io;

ssl on;
ssl_certificate /etc/nginx/ssl/0x01_io/ssl-bundle.crt;
ssl_certificate_key /etc/nginx/ssl/0x01_io/0x01_io.key;

# side note: only use TLS since SSLv2 and SSLv3 have had recent vulnerabilities
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
# let the browsers know that we only accept HTTPS
add_header Strict-Transport-Security max-age=2592000;

root /home/maemual/public;
access_log /var/log/nginx/blog_access.log;
error_log /var/log/nginx/blog_error.log;
location ~* \.(?:ico|css|js|gif|jpe?g|png)$ {
expires 1d;
add_header Pragma public;
add_header Cache-Control "public";
}

location / {
try_files $uri $uri/ /index.html;
}
}

server {
listen 80;
server_name www.0x01.io 0x01.io;
return 301 https://0x01.io$request_uri;
}

然后重新加载配置sudo nginx -s reload

注意你的 443 端口开没开啊。

后续

然后你的网站应该就有了 HTTPS。

注意检查一下是否引用了一些 http 的资源。