软硬件环境

  • ubuntu 16.04 server on vps
  • certbot

简介

本站之前在hostpark托管时, 由于 hostpark 本身提供了 https 的良好支持, 所以这块就没怎么去研究. 现在站点搭在了vps上, 再裸奔就不好了, 因此趁着这个机会, 查找了相关的资料, 把这块空缺给补上, 也让站点更加安全, 让访问者更加的放心.

先来看看设置前后的区别, 浏览器中URL的输入框

https_ssl_03

https_ssl_04

HTTP vs HTTPS

http 是一个传输网页内容的协议, 网站上的文字、图片、CSS、JS脚本等文件都是通过 http 协议传输到我们的浏览器, 通过浏览器的解析渲染, 才使我们看到精彩丰富的内容。但是 http 是明文传输的, 内容很容易被篡改, 很不安全.

https 的出现就是为了解决这样的问题, 它在 http 协议的基础上增加了一层 SSL/TLS 安全协议. 协议本身比较复杂, 可以简单的理解为SSL(Secure Sockets Layer)TLS(Transport Layer Security) 是一个东西的不同阶段, 总之是特别安全就行了.

部署HTTPS需要什么

只需要有一张被信任的 CA(Certificate Authority) , 也就是 SSL 安全证书, 这个必须是证书授权中心颁发的. 理论上我们自己也可以签发 SSL 证书, 但是这个证书, 肯定不会被主流浏览器所信任. 一般的 SSL 安全证书签发服务都比较贵, 如Godaddy 的, 一年的费用超过20美刀, 像我等穷人, 只能另谋它路.

幸运的是, EEF(Electronic Frontier Foundation) 、Mozilla基金会和美国密歇根大学成立了一个公益组织 ISRG(Internet Security Research Group) , 他们从2015年开始推出了 Let’s Encrypt 免费证书, 这个免费证书不仅免费,而且还相当好用, 我们就通过它来拥抱 HTTPS.

实践

登录站点 https://certbot.eff.org/, 根据你的服务器的情况进行下拉选择, 这是一个安装向导, 它会智能的根据你的输入, 来给出相应的安装指令. 我使用的是 ubuntu 16.04 操作系统和 tomcat 服务器

https_ssl_05

$ sudo apt-get update
$ sudo apt-get install software-properties-common
$ sudo add-apt-repository ppa:certbot/certbot
$ sudo apt-get update
$ sudo apt-get install certbot

安装完毕后执行

certbot certonly

然后出现一堆选择项, 根据实际情况填写就好了

https_ssl_01

https_ssl_02

相关的文件都默认存在与/etc/letsencrypt下

证书的更新

最简单的方法,执行

certbot renew --quiet

默认情况下, 证书只有90天的有效期, 感谢xdtianyu, 这里有更新证书的详细方法.

nginx 和 tomcat的配置

我这里的环境是nginx + tomcat, nginx 是通过 sudo apt-get install nginx 安装,tomcat 是下载的zip安装包

修改/etc/nginx/sites-available/default
server {
    listen 80;

    server_name xugaoxiang.com;

    return 301 https://$host$request_uri;

}

server {
        listen 443 ssl;
        server_name xugaoxiang.com,localhost;

    ssl on;
    index index.jsp index.html index.htm;

        ssl_certificate /etc/letsencrypt/live/xugaoxiang.com/fullchain.pem;
        ssl_certificate_key /etc/letsencrypt/live/xugaoxiang.com/privkey.pem;
        #ssl_session_cache shared:SSL:1m;
        ssl_session_timeout 5m;
        ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
        ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4;
        ssl_prefer_server_ciphers on;

    location / {
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header Host $host;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
        proxy_set_header X-Forwarded-Host $host;
        proxy_set_header X-Forwarded-Server $host;

        proxy_pass http://127.0.0.1:8888;
        proxy_redirect http://127.0.0.1:8888 https://xugaoxiang.com;
    }
}
tomcat的配置

修改server.xml, 主要是修改端口,与 nginx 里的 proxy_pass 匹配起来就可以了

<Connector port="8888" protocol="HTTP/1.1"
               connectionTimeout="20000"
               redirectPort="8443" URIEncoding="UTF-8"/>

参考资料

  1. https://letsencrypt.org/
  2. https://certbot.eff.org/
  3. https://github.com/xdtianyu/scripts/tree/master/lets-encrypt

Comments

comments powered by Disqus