免费给自己的网站添加HTTPS安全加密

 

参考地址

HTTPS

超文本传输安全协议(英语:Hypertext Transfer Protocol Secure,缩写:HTTPS,常称为HTTP over TLS,HTTP over SSL或HTTP Secure)是一种透过计算器网上进行安全通信的传输协议。HTTPS经由HTTP进行通信,但利用SSL/TLS来加密数据包。HTTPS开发的主要目的,是提供对网站服务器的身份认证,保护交换数据的隐私与完整性。这个协议由网景公司(Netscape)在1994年首次提出,随后扩展到互联网上。

安装 acme.sh

curl  https://get.acme.sh | sh
# 重新载入
source ~/.bashrc

安装过程不会污染已有的系统任何功能和文件, 所有的修改都限制在安装目录中: ~/.acme.sh/

生成证书

acme.sh实现了acme协议支持的所有验证协议。 一般有两种方式验证:httpdns验证。我这里使用的是 http方式,http方式需要在你的网站根目录下放置一个文件,这个目录需要读写权限,来验证你的域名所有权,完成验证。其他方式可以参考acme.sh 生成证书

acme.sh --issue -d mydomain.com -w /home/user/www/mydomain.com/

copy / 安装证书

注意,默认生成的证书都放在安装目录下:~/.acme.sh/,请不要直接使用此目录下的文件,例如: 不要直接让 nginx/apache的配置文件使用这下面的文件. 这里面的文件都是内部使用,而且目录结构可能会变化。

正确的使用方法是使用--installcert命令,并指定目标位置,然后证书文件会被copy到相应的位置。

# key-file 服务器端的
acme.sh --installcert -d mydomain.com \
        --key-file /home/user/.nginx/ssl/mydomain.com.key \
        --fullchain-file /home/user/.nginx/ssl/fullchain.cer \
        --reloadcmd "sudo service nginx force-reload"

这里用的是service nginx force-reload,不是service nginx reload,据测试,reload并不会重新加载证书,所以用的force-reload

--installcert命令可以携带很多参数,来指定目标文件。并且可以指定reloadcmd,当证书更新以后,reloadcmd会被自动调用,让服务器生效,详细参数请参考: https://github.com/Neilpang/acme.sh#3-install-the-issued-cert-to-apachenginx-etc

Nginx的配置ssl_certificate使用/home/user/.nginx/ssl/fullchain.cer,而非 /home/user/.nginx/ssl/mydomain.com.cer,否则SSL Labs的测试会报Chain issues Incomplete错误

修改 visudo

修改一下sudoer文件,让sudo service nginx force-reload不需要输入密码

sudo visudo

文件内添加以下内容,useracme.sh安装所用的账号

user ALL=(ALL) NOPASSWD: /usr/sbin/service nginx force-reload

nano编辑器的简单使用

  • 移动光标 用Ctrl+b移动到上一字符,Ctrl+f移动到下一字符 用Ctrl+p移动到上一行,Ctrl+n移动到下一行 用Ctrl+y移动到上一页,Ctrl+v移动到下一页

  • 保存 使用Ctrl+o来保存所做的修改,回车即可

  • 退出 按Ctrl+x

  • 其他 其中^表示Ctrl键,M表示Alt

使用其他编辑器

如果觉得nano不好用,可以设置使用其他编辑器,输入以下后,按照提示选择即可

sudo update-alternatives --config editor

生成 dhparam.pem 文件

openssl dhparam -out /home/user/.nginx/ssl/dhparam.pem 2048

修改 Nginx 配置

server {
    listen 80;
    listen 443 ssl;
    server_name mydomain.com;

    # 证书文件
    ssl_certificate /home/user/.nginx/ssl/fullchain.cer;
    # 证书私钥
    ssl_certificate_key /home/user/.nginx/ssl/mydomain.com.key;
    # 为DHE密码指定具有DH参数的文件
    ssl_dhparam /home/user/.nginx/ssl/dhparam.pem;

    # 开启缓存,有利于减少SSL握手开销
    ssl_session_cache shared:SSL:10m;
    # SSL会话过期时间,有利于减少服务器开销
    ssl_session_timeout 10m;
    # 指定可用的SSL协议
    ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
    # 屏蔽不安全的加密方式
    ssl_ciphers "ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA:ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA:ECDHE-ECDSA-AES256-SHA:AES128-GCM-SHA256:AES256-GCM-SHA384:AES128-SHA256:AES256-SHA256:AES128-SHA:AES256-SHA:AES:CAMELLIA:DES-CBC3-SHA:!aNULL:!eNULL:!EXPORT:!DES:!RC4:!MD5:!PSK:!aECDH:!EDH-DSS-DES-CBC3-SHA:!EDH-RSA-DES-CBC3-SHA:!KRB5-DES-CBC3-SHA";
    # 指定在使用SSLv3和TLS协议时,服务器密码应优先于客户端密码
    ssl_prefer_server_ciphers on;
    # 开启HSTS,强制全站加密,如果你的网站要引用不加密的资源,或者考虑将来取消加密,就不要开这个
    add_header Strict-Transport-Security "max-age=63072000; includeSubdomains; preload";

    # ... 其他配置
}

配置好后,执行

# 测试配置是否有问题
sudo service nginx configtest
# 重启nginx服务
sudo service nginx restart

测试SSL服务

按照以上步骤完整配好后,应该是 A+ 测试地址:https://www.ssllabs.com/ssltest/

后续维护

目前由于acme协议和letsencrypt CA都在频繁的更新, 因此acme.sh也经常更新以保持同步.

acme.sh --upgrade
# 开启自动更新
acme.sh --upgrade --auto-upgrade
# 关闭自动更新
acme.sh --upgrade --auto-upgrade 0

目前证书在 60 天以后会自动更新, 需要定期重新申请,这部分acme.sh已经帮你做了,在安装的时候往 crontab增加了一行每天执行的命令,执行crontab -l,会看到以下信息

49 0 * * * "/home/user/.acme.sh"/acme.sh --cron --home "/home/user/.acme.sh" > /dev/null

你可以尝试执行一下,看看是否正确运行

"/home/user/.acme.sh"/acme.sh --cron --home "/home/user/.acme.sh"

最后走一下acme.sh --cron的流程看看能否正确执行

acme.sh --cron -f