前提概要
很多时候我们需要在网站上启用HTTPS协议,比如我们要开发微信小程序的服务端,微信小程序的请求域名只支持https协议的,或者是我们希望使用nginx做端口转发,比如https的域名转发到http的一个公网ip地址,需要配置ssl证书。
泛域名证书申请和配置
目前常用的 Let’s Encrypt 证书生成工具有 certbot
、acme.sh
、acme-tiny
,本文使用的是 acme.sh
。acme.sh
申请和安装泛域名 SSL 证书相对来说是比较方便的。
环境准备
这里你准备一个云服务器实例,以及备案好的域名。以及使用xshell工具以及xftp工具远程,当然也可以用宝塔或者云服务器自带的终端,根据个人的一个开发习惯选择。
使用acme.sh配置泛域名
1.安装acme.sh
安装过程需要服务器已安装 socat
模块,它是一个多功能的网络小工具。
dnf install socat -y
通过下面命令安装 acme.sh
,Email 用来接收重要重要通知,如证书快到期未更新会收到通知。
curl https://get.acme.sh | sh -s email=my@example.com
安装后,理论上会自动添加一个 acme.sh
全局应用别名,但有时候会 command not found
,需要手动执行以下命令:source ~/.bashrc
或 source ~/.bash_profile
,或关掉终端重新打开,然后再继续下一步。
2.生成证书
acme.sh
实现了 acme 协议支持的所有验证协议,一般有三种验证方式:HTTP 方式、手动 DNS 方式和 DNS API 方式。推荐使用 DNS API 方式。
这里根据我们选择的一个云服务器来,如果腾讯云,阿里云,或者其他云的话就在他们对应的控制台里面操作,一般这类云厂商都是有提供DNS API的方式
我这里使用的是阿里云的,在右上角头像下拉中选择“AccessKey 管理”,创建密钥:
创建完成秘钥之后把秘钥信息进行保存然后配置到环境变量中
# 腾讯云
export DP_Id="YourId"
export DP_Key="YourToken"
# 阿里云
export Ali_Key="YourAccessKeyId"
export Ali_Secret="YourAccessKeySecret"
再通过下面命令生成证书:
# 腾讯云
acme.sh --issue --dns dns_dp -d example.com -d *.example.com
# 阿里云
acme.sh --issue --dns dns_ali -d example.com -d *.example.com
2024.6.28 补充更新:
这里腾讯云的方式以及失效了,会存在问题,阿里云的还可以这样使用,腾讯云的DNS API具体可以查看:https://zhuanlan.zhihu.com/p/705407934
注意:这里第一个域名为顶级域名,后面一个为泛域名。这种方式将自动为你的域名添加一条 TXT 解析,验证成功后,这条解析记录会被删除,对你来说是无感的。
证书生成成功后,默认保存在 ~/.acme.sh/example.com/
目录中。请不要直接使用 ~/.acme.sh/
目录下的文件,这里面的文件都是内部使用的,而且目录结构可能会变化,我们需要把证书复制到需要用的地方去。
3. 安装证书
在 ~/.acme.sh/example.com/
目录生成的证书文件中,我们主要需要用到两个文件:fullchain.cer
和 example.com.key
。下面以 Nginx 为例,来看看如何安装证书。
一般来说生成了证书之后,证书文件的位置会在
安装nginx
如果你的云服务器第一次安装的话可以查看我的nginx安装的教程:https://blog.csdn.net/weixin_42770320/article/details/139756281?spm=1001.2014.3001.5501
为nginx安装ssl证书
在nginx目录下新建文件夹ssl
在服务器终端执行命令
这里的话会生成证书,将证书的key-file放到我们指定的目录,fullchain-file也是同理
acme.sh --install-cert -d *.yicode.net \
--key-file /usr/local/nginx/ssl/*.yicode.net.key \
--fullchain-file /usr/local/nginx/ssl/*.yicode.net.pem
域名解析
这里需要在你使用的云服务器厂商去配置对应的dns解析
配置nginx文件
#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;
server {
#当 http 协议被请求时,统一转发到https协议上
listen 80;
server_name chai.yicode.net;
return 301 https://$server_name;
}
server {
listen 443 ssl;
ssl_certificate "/usr/local/nginx/ssl/*.yicode.net.pem";
ssl_certificate_key "/usr/local/nginx/ssl/*.yicode.net.key";
server_name chai.yicode.net;
location / {
root /usr/local/test/;
try_files $uri $uri/ /index.html;
index index.html index.htm;
}
}
}
上面的nginx的意思
监听80端口和443端口,80是http协议的默认端口,443是https协议默认端口,
如果访问chai.yicode.net,不带https协议的会自动转发到https协议,如果访问这个路径,会去访问服务器的/usr/local/test/路径,默认去找对应的index.html文件,如果不存在会去找index.htm
启动nginx
这个在我们启动nginx的时候可能会遇到一个问题
这个问题其实是安装nginx的时候,没有去安装相关的ssl模块,所以我们需要重新的安装nginx
这里需要进入到我们之前安装的nginx的源目录,我这里的源目录是/usr/local/nginx-1.27.0,然后进入到这个目录
依次执行下面命令
./configure --with-http_ssl_module
make && make install
nginx配置API
http {
#...
server {
listen 443 ssl;
ssl_certificate "/usr/local/nginx/ssl/*.yicode.net.pem";
ssl_certificate_key "/usr/local/nginx/ssl/*.yicode.net.key";
server_name chai.yicode.net;
location / {
root /usr/local/test/;
try_files $uri $uri/ /index.html;
index index.html index.htm;
}
location /api/ {
proxy_pass http://43.139.142.183:7001/;
}
}
}
这里可以配置多个location,当我们访问chai.yicode.net/api的时候,就会自动转发代理到43.139.142.183:7001这个地址