时间:2023-02-23 07:03:01 | 来源:建站知识
时间:2023-02-23 07:03:01 来源:建站知识
用acme.sh帮你免费且自动更新的HTTPS证书,省时又省力:Certbot
来管理Let's Encrypt
的证书,使用前需要安装一堆库,觉得不太友好。所谓条条大路通罗马,肯定还有其他方法可以做这个事情。curl https://get.acme.sh | sh
具体参考这几篇:HTTPS 加密通信挺重要的,之前也听说过 MITM(中间人攻击),不过这还是第一次听说证书被劫持的……
https://www.v2ex.com/t/656367
https://www.v2ex.com/t/656394
https://m.cnbeta.com/view/960295.htm一些网站https证书出现问题的情况分析
(最后这篇说很多大站都受影响了)
当然,你还可以尝试用 Let’s Encrypt 的 certbot
工具来签发证书,不过要装一堆库吧,我也不记得了……
下面的内容涉及 acme.sh 的安装,证书的签发及认证,如何安装到 nginx,以及自动更新证书、更新 acme.sh 等。curl https://get.acme.sh | sh
或者wget -O - https://get.acme.sh | sh
执行上面的命令,它会:~/.acme.sh
目录下acme.sh
的 alias 别名.bashrc
文件(source ~/.bashrc
)。$ acme.sh -hhttps://github.com/acmesh-official/acme.shv2.8.6Usage: acme.sh command ...[parameters]....Commands:--help, -h Show this help message.--version, -v Show version info.--install Install acme.sh to your system.--uninstall Uninstall acme.sh, and uninstall the cron job.--upgrade Upgrade acme.sh to the latest code from https://github.com/acmesh-official/acme.sh.--issue Issue a cert.--signcsr Issue a cert from an existing csr.--deploy Deploy the cert to your server.--install-cert Install the issued cert to apache/nginx or any other server.# ......
acme.sh
会自动在你的网站根目录下放置一个文件,来验证你的域名所有权,验证之后就签发证书,最后会自动删除验证文件。example.com
,根目录为 /home/wwwroot/example.com
。那么只需要执行下面这条语句就行。acme.sh --issue -d example.com -w /home/wwwroot/example.com
2.1.2 Apache / Nginx modeacme.sh --issue -d example.com --apache # Apacheacme.sh --issue -d example.com --nginx # Nginx
如果找不到配置文件的话可以自行配置。acme.sh --issue -d example.com --nginx /etc/nginx/nginx.conf # 指定nginx的confacme.sh --issue -d example.com --nginx /etc/nginx/conf.d/example.com.conf # 指定网站的conf
2.1.3 Standalone modeacme.sh --issue -d example.com --standalone
如果用了反代之类的不是 80 端口,则可以手动指定。acme.sh --issue -d example.com --standalone --httpport 88
当然它还支持 tls 模式,不是 443 端口的话也可以自行指定。acme.sh --issue -d example.com --alpnacme.sh --issue -d example.com --alpn --tlsport 8443 # 自行指定tls端口
export CF_Token="sdfsdfsdfljlbjkljlkjsdfoiwje"export CF_Account_ID="xxxxxxxxxxxxx"
为了限制权限,可以新建一个区域的 API Key. 这里只需要 Zone.DNS 的编辑权限(restrict the API Token only for write access to Zone.DNS for a single domain)就行。export CF_Token="sdfsdfsdfljlbjkljlkjsdfoiwje"export CF_Account_ID="xxxxxxxxxxxxx"export CF_Zone_ID="xxxxxxxxxxxxx"
Account_ID
和 Zone_ID
在域名的管理页面右下方可以得到。acme.sh --issue --dns dns_cf -d example.com
之后这些配置信息会保存到 ~/.acme.sh/account.conf
这个文件里,在证书续期或者其他利用 CF 进行验证的时候会自动调用。export DP_Id="1234"export DP_Key="sADDsdasdgdsf"acme.sh --issue --dns dns_dp -d example.com -d www.example.com
(这个其实就是多域名签发了)acme.sh --issue -d example.com --dns -d www.example.com
更多请参考官方教程 DNS manual mode。-d <YourDomainHere>
参数就行。acme.sh --issue -d example.com -w /home/wwwroot/example.com -d www.example.comacme.sh --issue -d example.com --standalone -d www.example.comacme.sh --issue -d example.com --dns -d www.example.com
也可以多个域名指定不同的验证方式,例如acme.sh --issue /-d aa.com -w /home/wwwroot/aa.com /-d bb.com --dns dns_cf /-d cc.com --apache /-d dd.com -w /home/wwwroot/dd.com
*
就好。不过好像只适用于 DNS 验证的方式。acme.sh --issue -d example.com -d '*.example.com' --dns dns_cf
Let's Encrypt
提供了 ECDSA 证书的签发,且 acme.sh 也支持。ec-
为前缀的 --keylength
参数(或 -k
)就可以了。理论上上面的各种验证方式都适用。acme.sh --issue -w /home/wwwroot/example.com -d example.com --keylength ec-256 # 单域名acme.sh --issue -w /home/wwwroot/example.com -d example.com -d www.example.com --keylength ec-256 # 多域名
支持以下长度的证书,一般就用 ec-256
就行了。~/.acme.sh/
目录下的证书文件,因为那只能内部使用,且未来目录结构可能会更改。--installcert
命令,指定目标位置,然后证书文件就会被 copy 到相应的位置了。acme.sh --installcert -d example.com /--key-file /path/to/keyfile/in/nginx/key.pem /--fullchain-file /path/to/fullchain/nginx/cert.pem /--reloadcmd "service nginx force-reload"
比如你可以在 nginx 的目录下新建一个 ssl
目录,然后把证书安装 / copy 过去。acme.sh --installcert -d example.com /--key-file /etc/nginx/ssl/example.com.key /--fullchain-file /etc/nginx/ssl/example.com.fullchain.cer /--reloadcmd "service nginx force-reload"
这里用的是service nginx force-reload
, 不是service nginx reload
, 据测试,reload
并不会重新加载证书, 所以用的force-reload
。
Nginx 配置ssl_certificate
使用/etc/nginx/ssl/fullchain.cer
,而非/etc/nginx/ssl/.cer
,否则 SSL Labs 的测试会报Chain issues Incomplete
错误。
acme.sh --install-cert -d example.com /--cert-file /path/to/certfile/in/apache/cert.pem /--key-file /path/to/keyfile/in/apache/key.pem /--fullchain-file /path/to/fullchain/certfile/apache/fullchain.pem /--reloadcmd "service apache2 force-reload"
在命令中的 reloadcmd
参数很重要! 这个用来指定证书更新(Renew)后执行的命令,从而使续期后的证书生效。openssl dhparam -out /etc/nginx/ssl/dhparam.pem 2048
这一步是为了增强 SSL 的安全性。这里生成一个更强壮的 DHE 参数。前向安全性(Forward Secrecy)的概念很简单:客户端和服务器协商一个永不重用的密钥,并在会话结束时销毁它。服务器上的 RSA 私钥用于客户端和服务器之间的 Diffie-Hellman 密钥交换签名。从 Diffie-Hellman 握手中获取的预主密钥会用于之后的编码。因为预主密钥是特定于客户端和服务器之间建立的某个连接,并且只用在一个限定的时间内,所以称作短暂模式(Ephemeral)。更多参考这里 Guide to Deploying Diffie-Hellman for TLS 吧。
使用了前向安全性,如果一个攻击者取得了一个服务器的私钥,他是不能解码之前的通讯信息的。这个私钥仅用于 Diffie Hellman 握手签名,并不会泄露预主密钥。Diffie Hellman 算法会确保预主密钥绝不会离开客户端和服务器,而且不能被中间人攻击所拦截。
nginx 依赖于 OpenSSL 给 Diffie-Hellman (DH)的输入参数。不幸的是,这意味着 Diffie-Hellman Ephemeral(DHE)将使用 OpenSSL 的默认设置,包括一个用于密钥交换的1024位密钥。因为我们正在使用2048位证书,DHE 客户端就会使用一个要比非 DHE 客户端更弱的密钥交换。
server {server_name example.com;listen 443 ssl http2 default_server;listen [::]:443 ssl http2 default_server;# ...# ssl 相关配置ssl_certificate /etc/nginx/ssl/example.com.fullchain.cer;ssl_certificate_key /etc/nginx/ssl/example.com.key;ssl_dhparam /etc/nginx/ssl/dhparam.pem;ssl_protocols TLSv1 TLSv1.1 TLSv1.2;ssl_ciphers '[ECDHE-ECDSA-AES128-GCM-SHA256|ECDHE-ECDSA-CHACHA20-POLY1305|ECDHE-RSA-AES128-GCM-SHA256|ECDHE-RSA-CHACHA20-POLY1305]:ECDHE+AES128:RSA+AES128:ECDHE+AES256:RSA+AES256:ECDHE+3DES:RSA+3DES';ssl_prefer_server_ciphers on;# ...}
ssl_dhparam /etc/nginx/ssl/dhparam.pem;
是在 0x04 步骤中生成的,可选。ssl_ciphers
用于指定加密套件,这里采用的是 CloudFlare 家的,具体也不是很清楚 emmm。可以参考一下 Mozilla 的 Wiki:Security/Server Side TLSadd_header Strict-Transport-Security "max-age=31536000; includeSubDomains; preload";
接下来的一年(即31536000秒)中,浏览器看到 header 中包含 Strict-Transport-Security
的话就会自动切换到 https。nginx -tsystemctl restart nginx
之后就可以试一下能不能通过 https 来访问自己的网站啦!# crontab -l43 0 * * * "/root/.acme.sh"/acme.sh --cron --home "/root/.acme.sh" > /dev/null
也可以试着用上面这条命令执行看一下相关的配置是否正确。acme.sh --renew -d example.com --forceacme.sh --renew -d example.com --force --ecc # 如果用的是ECC证书
acme.sh --list
停止 Renewacme.sh --remove -d example.com [--ecc]
之后手动把目录下的证书移除就行。acme.sh --upgrade # 手动升级acme.sh --upgrade --auto-upgrade # 自动升级acme.sh --upgrade --auto-upgrade 0 # 停止自动升级
关键词:证书,更新,免费