为网站配置HTTPS传输协议

2018-05-12更新

全站启用https访问,http的80端口转发到https的443端口,nginx配置可以这样写:

1
2
3
4
5
6
7
8
9
10
server {
listen 80;
return 301 https://$host$request_uri;
} #80端口的流量转发到https

server {
listen 443;
server_name domain.com;
...
}

————

  HTTPS已经成为一个正规网站必备的配置,因为它的安全性,使得浏览器和服务器之间的数据传输,不再能够轻易地被“抓包”,HTTP正在被打上“不安全”的标签。为自己的网站配置HTTPS,无论从用户体验上,搜索引擎优化(SEO)上,还是数据传输的安全性上来说,都已经成为了必不可少的操作。今天就来记录一下老亨利站点实现HTTPS的过程。

  之前(年初到现在4个月的样子)用过一段时间的宝塔面板,一键安装LNMP,一键建站,一键配置Let’s Encrypt提供的免费https证书服务并自动续订,还有更多免费功能,对小白来说简直不能太友好。现在为什么不用了呢,原因就在于它实在太友好,你只需懂一点服务器和建站的基本常识,这里点一点,那里点一点,环境就起来了,网站就搭好了,绑上域名就能通过https协议访问了,完全不用管它对你的服务器做了什么,修改了什么默认的配置。这对一个要时刻知道哪个路径下有什么文件,不允许有什么文件,对服务器的环境要尽量保持干净的轻微强迫症患者来说怎么能受得了呢。不过也多亏使用了宝塔面板,让我学到不少东西,从一个建站小白升级为建站大白。

  花260买了3年腾讯云服务器,败了个新域名,搞了备案,⬅️整个过程要从春节前开始算起了。这几天又学了下Docker,个人博客重新搭起来嘿!扯远了,这些东西详细记录起来,应该好好写写的。今天只记录一下用Docker和CertBot申请https证书的事吧。

**正文开始**

Let’s encrypt官网看看

letsencrypt

中文翻译来自Chrome的ImTranslator插件。

官网建议使用Shell访问的人使用CertBot ACME客户端,于是转到CertBot官网看看

certbot

选好Linux版本(Debian 9)和服务器端配置(Nginx)。

CertBot官方文档

看到可以使用Docker来运行CertBot。于是果断在服务器上~$ docker search CertBot一下,看到官方版本的image name。

~$ docker pull certbot/certbot,把certbot的官方image拉到本地。

~$ mkdir letsencrypt,在当前user的路径下,创建letsencrypt路径,用来映射docker容器的路径,之后申请的证书和私钥就存放在这里

1
2
3
4
5
6
7
8
~$ docker run \
> -it \
> --rm \
> -p 80:80 \
> -p 443:443 \
> -v $PWD/letsencrypt:/etc/letsencrypt \
> certbot/certbot \
> certonly

-it进入docker交互模式

--rm容器停止运行后自行销毁

-p 80:80把docker容器的80端口映射到服务器的80端口

-p 443:443把docker容器的443端口映射到服务器的443端口

-v $PWD/letsencrypt:/etc/letsencrypt把docker容器的/etc/letsencrypt路径映射到当前user的/letsencrypt(即 /home/username/letsencrypt)路径下

certbot/certbot根据使用certbot的image创建容器

certonlycertbot容器的交互指令

Enter回车后,就会创建CertBot容器并进入CertBot交互模式,按照提示输入自己的信息即可(创建方式,你的邮箱,你的域名等)。

docker

创建成功后,在/home/username/letsencrypt/live/路径下就可以找到证书和私钥。

letsencrypt目录结构如下:

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
root@debian:/home/username# tree letsencrypt/
letsencrypt/
├── accounts
│   └── acme-v01.api.letsencrypt.org
│   └── directory
│   └── b69a13595bb9e*************
│   ├── meta.json
│   ├── private_key.json
│   └── regr.json
├── archive
│   └── domainname
│   ├── cert1.pem
│   ├── chain1.pem
│   ├── fullchain1.pem
│   └── privkey1.pem
├── csr
│   └── 0000_csr-certbot.pem
├── keys
│   └── 0000_key-certbot.pem
├── live
│   └── domainname
│   ├── cert.pem -> ../../archive/domainname/cert1.pem
│   ├── chain.pem -> ../../archive/domainname/chain1.pem
│   ├── fullchain.pem -> ../../archive/domainname/fullchain1.pem
│   ├── privkey.pem -> ../../archive/domainname/privkey1.pem
│   └── README
├── renewal
│   └── domainname.conf
└── renewal-hooks
├── deploy
├── post
└── pre

修改nginx的配置文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
server {
listen 80 default_server;
listen 443 ssl http2;
server_name domainname;

root /usr/share/nginx/html;
index index.html index.htm;

#HTTP to HTTPS Start
if ($server_port !~ 443){
rewrite ^(/.*)$ https://$host$1 permanent;
}
#HTTP to HTTPS End

# ssl on;
ssl_certificate /etc/letsencrypt/live/domainname/fullchain.pem; #你的证书地址
ssl_certificate_key /etc/letsencrypt/live/domainname/privkey.pem; #你的私钥地址
ssl_session_timeout 5m;
ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_prefer_server_ciphers on;
}

这里我同样是用docker创建的nginx容器,来运行这个静态网站。命令如下:

1
2
3
4
5
6
7
8
9
~$ docker run \
> -d \
> -p 443:443 \
> -p 80:80 \
> -v $PWD/conf:/etc/nginx/ \
> -v $PWD/oxo.red:/usr/share/nginx/html \
> -v $PWD/letsencrypt:/etc/letsencrypt \
> --name oxo.red \
> nginx

-d后台运行

-p 443:443把docker容器的443端口映射到服务器的443端口

-p 80:80把docker容器的80端口映射到服务器的80端口

-v $PWD/conf:/etc/nginx/在/home/username/路径下创建了conf目录来把docker容器的nginx配置文件映射到这里

-v $PWD/oxo.red:/usr/share/nginx/html在/home/username/路径下创建了oxo.red目录来把docker容器的nginx html目录映射到这里

-v $PWD/letsencrypt:/etc/letsencrypt把本地的letsencrypt目录映射到docker容器中,使nginx容器能够找到letsencrypt中的证书和私钥

--name oxo.red容器的名字

nginx使用nginx的image创建容器。

配置完成,浏览器访问oxo.red,即可看到

为网站配置HTTPS传输协议

https://oxo.red/configure_https/

作者

Han

发布于

2018-04-19

更新于

2021-08-20

许可协议

评论