企业🤖AI智能体构建引擎,智能编排和调试,一键部署,支持私有化部署方案 广告
# 16. 使用 acme.sh 安装 Let’ s Encrypt 提供的免费 SSL 证书 #### 1. 介绍 Let’ s Encrypt已有免费的证书可用,以后的网站估计都要上https的吧,所以把我的网站上的证书换了一下,这节主要是参考[使用 acme.sh 给 Nginx 安装 Let’ s Encrypt 提供的免费 SSL 证书](https://ruby-china.org/topics/31983)这篇文章,并结合自己的情况,把我的经验记录下来。 #### 2. 安装 我们使用[acme.sh](https://github.com/Neilpang/acme.sh)来申请和管理证书,它很简单用,还能够利用crontab自动更新证书,而且是默认就有的功能。 首先安装。 ``` $ wget -O - https://get.acme.sh | sh ``` 安装完之后,可以退出登录,再重新登录,或者执行一下`source ~/.bashrc`。 之后就可以使用`acme.sh`命令了。 #### 3. 申请证书 首先申请和下载证书。 ``` $ acme.sh --issue -d boat.rails365.net -w /home/hfpp2012/boat_manager/current/public ``` 我要使用的域名是`boat.rails365.net`,我有一个项目是用rails写的,根目录为`/home/hfpp2012/boat_manager/current/public`,一定要保证这个目录是可写,可访问的,因为`acme.sh`会去检测它,其实就是为了验证,这个网站是不是你的。 这样申请成功之后,证书也会被保存下来,比如保存在下面这个位置: ``` /home/hfpp2012/.acme.sh/boat.rails365.net ``` 你可以进去看看的,接下来我们要把证书安装到你的应用中。 ``` $ acme.sh --installcert -d boat.rails365.net \ --keypath /home/hfpp2012/boat_manager/ssl/boat.rails365.net.key \ --fullchainpath /home/hfpp2012/boat_manager/ssl/boat.rails365.net.key.pem \ --reloadcmd "sudo nginx -s reload" ``` 值得注意的是: 1. 会复制一些文件到`--keypath`和`--fullchainpath`参数所指定的地方,所以要保证目录是通的,是可写的,一般放到网站根目录相关的地方,如果你的`/home/hfpp2012/boat_manager`目录,没有`ssl`这个目录,要先新建一个。 2. 证书更新之后,会让nginx也更新的,因为这些证书是要由nginx使用的,所以要更新,那`acme.sh`会自动去触发那个更新的命令,所以你得告诉`acme.sh`如何去更新nginx的配置。所以这也是`--reloadcmd`发挥的作用,里面的值,得根据你的系统而定,只要能更新到nginx的配置就好了。 3. 更新nginx配置时,有可以会使用sudo,所以最好你的用户是可以免密码使用sudo的。 接下来,还需要再生成一个文件,具体我也不知道有什么用,很多ssl的配置都需要它。 ``` $ openssl dhparam -out /home/hfpp2012/boat_manager/ssl/dhparam.pem 2048 ``` #### 4. nginx配置 最后,把上面所有生成的文件跟nginx结合起来,再把配置写到nginx的配置文件中。 比如,我是这样的: ``` upstream boat_manager { server unix:///home/hfpp2012/boat_manager/shared/tmp/sockets/puma.sock fail_timeout=0; } server { listen 443 ssl; server_name boat.rails365.net; ssl_certificate /home/hfpp2012/boat_manager/ssl/boat.rails365.net.key.pem; ssl_certificate_key /home/hfpp2012/boat_manager/ssl/boat.rails365.net.key; # ssl_dhparam ssl_dhparam /home/hfpp2012/boat_manager/ssl/dhparam.pem; root /home/hfpp2012/boat_manager/current/public; keepalive_timeout 70; location ~ ^/assets/ { gzip_static on; expires max; add_header Cache-Control public; } try_files $uri/index.html $uri @boat_manager; location @boat_manager { proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header Host $http_host; proxy_redirect off; proxy_pass http://boat_manager; #proxy_http_version 1.1; #proxy_set_header Upgrade $http_upgrade; #proxy_set_header Connection "upgrade"; } error_page 500 502 503 504 /50x.html; location = /50x.html { root html; } } server { listen 80; server_name boat.rails365.net; return 301 https://boat.rails365.net$request_uri; } ``` 顶层的http指令那里,也需要加上这两行: ``` http { ssl_protocols TLSv1 TLSv1.1 TLSv1.2; ssl_prefer_server_ciphers on; } ``` 最后,你把nginx重启一下,再试试效果。 完结。