申请Let’s Encrypt泛域名https证书及Nginx证书配置

热门标签

, , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , ,
admin

发表文章数:3253

安装Certbot

1、下载安装文件

 wget https://dl.eff.org/certbot-auto

chmod a+x ./certbot-auto

2、初始化

./certbot-auto

3、获取证书

因为目前大多数国内的DNS服务商不在API支持的列表里,所以以下使用手动方式进行DNS认证,只要将下方命令中的*.minirplus.com替换为自己的域名即可

1
./certbot-auto certonly --manual -d *.minirplus.com --agree-tos --no-bootstrap --manual-public-ip-logging-ok --preferred-challenges dns-01 --server https://acme-v02.api.letsencrypt.org/directory

注意!域名的 minirplus.com 解析记录必须以 A记录 方式指向当前运行命令的服务器IP,而不能使用CNAME记录。否则会报错,报错信息如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
IMPORTANT NOTES:
 - The following errors were reported by the server:
 
   Domain: minirplus.com
   Type:   connection
   Detail: DNS problem: SERVFAIL looking up TXT for
   _acme-challenge.minirplus.com
 
   To fix these errors, please make sure that your domain name was
   entered correctly and the DNS A/AAAA record(s) for that domain
   contain(s) the right IP address. Additionally, please check that
   your computer has a publicly routable IP address and that no
   firewalls are preventing the server from communicating with the
   client. If you're using the webroot plugin, you should also verify
   that you are serving files from the webroot path you provided.

运行该命令后,会要求 输入邮箱,用于接收证书过期通知

1
2
Enter email address (used for urgent renewal and security notices) (Enter 'c' to
cancel):

接着会出现一段广告,大意是收集客户邮箱给赞助商,Y 或 N 均可

1
2
3
4
5
6
7
-------------------------------------------------------------------------------
Would you be willing to share your email address with the Electronic Frontier
Foundation, a founding partner of the Let's Encrypt project and the non-profit
organization that develops Certbot? We'd like to send you email about EFF and
our work to encrypt the web, protect its users and defend digital rights.
-------------------------------------------------------------------------------
(Y)es/(N)o:

接着重要的部分来了,在DNS记录中添加一个 _acme-challenge 前缀的域名 TXT记录,记录的内容为中间显示的随机码xVloe7V1kMEd2ZlOLlUxv-HltYfTDaMhrrwKjFU47DU

1
2
3
4
5
6
7
8
9
-------------------------------------------------------------------------------
Please deploy a DNS TXT record under the name
_acme-challenge.minirplus.com with the following value:
 
xVloe7V1kMEd2ZlOLlUxv-HltYfTDaMhrrwKjFU47DU
 
Before continuing, verify the record is deployed.
-------------------------------------------------------------------------------
Press Enter to Continue

接着确保当前域名的根记录 minirplus.com 为 A记录 并且指向当前服务器IP(这条原本不成问题,因为国外的服务商的DNS根域名只能添加A记录,但是国内的DNSPOD则更加灵活,可以添加CNAME记录,所以会在认证的时候出现问题)

按回车,进行认证

等待片刻,出现如下信息,说明认证成功

申请操作成功后, 会在界面中输出证书的存放路径, 以及证书的到期时间 (90天)

1
2
3
4
5
6
7
8
9
10
11
12
13
IMPORTANT NOTES:
 - Congratulations! Your certificate and chain have been saved at:
   /etc/letsencrypt/live/minirplus.com/fullchain.pem
   Your key file has been saved at:
   /etc/letsencrypt/live/minirplus.com/privkey.pem
   Your cert will expire on 2018-06-19. To obtain a new or tweaked
   version of this certificate in the future, simply run certbot-auto
   again. To non-interactively renew *all* of your certificates, run
   "certbot-auto renew"
 - If you like Certbot, please consider supporting our work by:
 
   Donating to ISRG / Let's Encrypt:   https://letsencrypt.org/donate
   Donating to EFF:                    https://eff.org/donate-le

4、证书的存放路径

这里以example.com为例 )

生成证书中会创建 /etc/letsencrypt 文件夹, 证书文件默认存放在 /etc/letsencrypt/live/example.com 文件夹中, 其中 example.com 取自第一个域名
在 example.com 文件夹中包含 4 个文件 ./cert.pem ./chain.pem ./fullchain.pem ./privkey.pem

  • cert.pem 域名证书
  • chain.pem 根证书及中间证书
  • fullchain.pem 由 cert.pem 和 chain.pem 合并而成
  • privkey.pem 证书私钥

创建一个 2048 位的 Diffie-Hellman 文件\
(nginx 默认使用 1024 位的 Diffie–Hellman 进行密钥交换, 安全性太低)

1
openssl dhparam -out /etc/letsencrypt/live/dhparams.pem 2048

Nginx https 相关配置

这里以example.com为例 )

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
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
#user  nobody;
worker_processes  1;

#error_log  logs/error.log;
#error_log  logs/error.log  notice;
#error_log  logs/error.log  info;

#pid        logs/nginx.pid;


events {
    worker_connections  1024;
}


http {
    include       mime.types;
    default_type  application/octet-stream;

    #log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
    #                  '$status $body_bytes_sent "$http_referer" '
    #                  '"$http_user_agent" "$http_x_forwarded_for"';

    #access_log  logs/access.log  main;

    sendfile        on;
    #tcp_nopush     on;

    #keepalive_timeout  0;
    keepalive_timeout  65;
    gzip on;
    gzip_min_length 5k;
    gzip_comp_level 3;
    gzip_types application/javascript image/jpeg image/svg+xml;
    gzip_buffers 4 32k;
    gzip_vary on;
    #gzip  on;
client_max_body_size 20m;
	 upstream apiserver {
        server 127.0.0.1:8080;
    }
    server {
        listen       80;
        server_name example.com www.example.com;
		 rewrite ^/(.*)$  https://$server_name$request_uri? permanent;

        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
        }
 
    }

 

    # HTTPS server
    #
    server {
        listen       443 ssl;
        server_name  example.com www.example.com;
        ssl_certificate  /etc/letsencrypt/live/example.com/fullchain.pem;
        ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;
		# 配置 Diffie-Hellman 交换算法文件地址
		ssl_dhparam /etc/letsencrypt/live/dhparams.pem;
        # 配置服务器可使用的加密算法
    ssl_ciphers 'ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4:!DH:!DHE';
    # 指定服务器密码算法在优先于客户端密码算法时,使用 SSLv3 和 TLS 协议
    ssl_prefer_server_ciphers  on;

    # ssl 版本 可用 SSLv2,SSLv3,TLSv1,TLSv1.1,TLSv1.2
    # ie6 只支持 SSLv2,SSLv3 但是存在安全问题, 故不支持
    ssl_protocols        TLSv1 TLSv1.1 TLSv1.2;

    # 配置 TLS 握手后生成的 session 缓存空间大小 1m 大约能存储 4000 个 session
    ssl_session_cache  shared:SSL:50m;
    # session 超时时间
    ssl_session_timeout 5m;

    # 负载均衡时使用 此处暂时关闭 详情见 https://imququ.com/post/optimize-tls-handshake.html
    # 1.5.9 及以上支持
    ssl_session_tickets off;

    # 浏览器可能会在建立 TLS 连接时在线验证证书有效性,从而阻塞 TLS 握手,拖慢整体速度。OCSP stapling是一种优化措施,服务端通过它可以在证书链中封装证书颁发机构的 OCSP(Online Certificate Status Protocol)响应,从而让浏览器跳过在线查询。服务端获取 OCSP一方面更快(因为服务端一般有更好的网络环境),另一方面可以更好地缓存 以上内容来自https://imququ.com/post/my-nginx-conf-for-wpo.html
    # 1.3.7 及以上支持
    ssl_stapling               on;
    ssl_stapling_verify        on;
    # 根证书 + 中间证书
    ssl_trusted_certificate    /etc/letsencrypt/live/example.com/fullchain.pem;

    # HSTS 可以告诉浏览器,在指定的 max-age 内,始终通过 HTTPS 访问该域名。即使用户自己输入 HTTP 的地址,或者点击了 HTTP 链接,浏览器也会在本地替换为 HTTPS 再发送请求 相关配置见 https://imququ.com/post/sth-about-switch-to-https.html
    add_header Strict-Transport-Security max-age=60;
				#这里使用的是 转发到http的地址 如果指向本地服务器文件 使用如下配置
        #  location / { 
        #root 项目本地文件夹根路径
        #}
        location / {
        
           proxy_pass http://apiserver;
	proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header REMOTE-HOST $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        }
    }

}

以上配置完成后, 重启 nginx 即可完成对 https 的切换

安装Cron设置证书更新

1、检查 Cron 服务状态

1
service crond status

现实如下信息就说明已经安装

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
crond.service - Command Scheduler
   Loaded: loaded (/usr/lib/systemd/system/crond.service; enabled; vendor preset: enabled)
   Active: active (running) since 三 2019-11-20 22:02:36 CST; 3min 3s ago
 Main PID: 16835 (crond)
   CGroup: /system.slice/crond.service
           └─16835 /usr/sbin/crond -n

11月 20 22:02:36 iZ8vbepvjvx725nlz8icsoZ systemd[1]: Started Command Scheduler.
11月 20 22:02:36 iZ8vbepvjvx725nlz8icsoZ crond[16835]: (CRON) INFO (RANDOM_D...
11月 20 22:02:36 iZ8vbepvjvx725nlz8icsoZ crond[16835]: ((null)) Unauthorized...
11月 20 22:02:36 iZ8vbepvjvx725nlz8icsoZ crond[16835]: ((null)) SELinux in p...
11月 20 22:02:36 iZ8vbepvjvx725nlz8icsoZ crond[16835]: ((null)) Unauthorized...
11月 20 22:02:36 iZ8vbepvjvx725nlz8icsoZ crond[16835]: ((null)) SELinux in p...
11月 20 22:02:36 iZ8vbepvjvx725nlz8icsoZ crond[16835]: ((null)) Unauthorized...
11月 20 22:02:36 iZ8vbepvjvx725nlz8icsoZ crond[16835]: ((null)) SELinux in p...
11月 20 22:02:37 iZ8vbepvjvx725nlz8icsoZ crond[16835]: (CRON) INFO (running ...
11月 20 22:02:37 iZ8vbepvjvx725nlz8icsoZ crond[16835]: (CRON) INFO (@reboot ...
Hint: Some lines were ellipsized, use -l to show in full.

2、安装 cron 服务

依次输入以下 2 条命令并回车执行

1
2
3
yum -y install vixie-cron

yum -y install crontabs

成功安装 Cron 之后,启动 cron 服务。

3、启动 Cron 服务

1
service crond start

执行后会出现:Starting crond: [ OK ] 的提示,表明启动成功。

继续执行开机启动服务命令,把 Cron 加入开机启动的服务列表中:

1
chkconfig --level 345 crond on

安装完检查一下 Cron 服务状态

1
service crond status

如果提示:crond (pid xxxxx) is running… 代表正常运行中。

4、创建 Cron 文件并添加编辑 Certbot 的自动续期命令

输入以下命令:

1
crontab -e

相当于在/var/spool/cron 下创建了一个root文件

在root中文件输入

1
0 3 */7 * * /bin/certbot renew --renew-hook "/etc/init.d/nginx reload"

以上含义是:每隔 7 天,夜里 3 点整自动执行检查续期命令一次。续期完成后,重启 nginx 服务。

5、重启 Cron 服务,使之生效

1
service crond restart

未经允许不得转载:作者:admin, 转载或复制请以 超链接形式 并注明出处 夜河资源网
原文地址:《申请Let’s Encrypt泛域名https证书及Nginx证书配置》 发布于2019-12-26

分享到:
赞(0) 打赏

评论 抢沙发

8 + 7 =


撰写不易~如果您觉得文章对您有帮助的话可以打赏我哦~谢谢亲亲~

支付宝扫一扫打赏

微信扫一扫打赏

外服网游加速器破解版
包含腾讯网游加速器、海豚网游加速器等八款知名加速器,可加速外服游戏,永久包售后包更新,不定时添加新款破解版加速器!
切换注册

登录

忘记密码 ?

切换登录

注册