前言

你的主机上已经安装了Git,如果没有,可以参考我这篇教程centos7安装git

http和https

安装证书之前我们先了解一下http和https

什么是http

http:超文本传输协议,用于从WWW服务器传输超文本到本地浏览器的传送协议。

什么是https

https,是以安全为目标的http通道,简单讲是http的安全版。即http下加入SSL层,https的安全基础是SSL证书,因此加密的详细内容就需要SSL证书。

http和https的区别

名字 协议 传输方式 安全性 端口 证书
http 超文本传输协议 明文 不安全 80 不需要
https SSL加密传输协议 加密 安全 443 需要

SSL

什么是SSL证书

SSL证书,也称为服务器证书,是遵守SSL协议的一种数字证书,提供了一种在互联网上身份验证的方式,是用来标识和证明通信双方身份的数字信息文件。

如何免费安装SSL证书

Let’s Encrypt 是一个免费、开放,自动化的证书颁发机构,由 ISRG(Internet Security Research Group)运作。ISRG 是一个关注网络安全的公益组织,其赞助商包括 Mozilla、Akamai、Cisco、EFF、Chrome、IdenTrust、Facebook等公司。ISRG 的目的是消除资金和技术领域的障碍,全面推进网站从HTTP到HTTPS过度的进程。

开始安装SSL证书

环境说明

  • 操作系统:centos7
  • 服务器:tomcat、nginx

使用git下载letsencrypt-auto脚本

$ git clone https://github.com/letsencrypt/letsencrypt

进入脚本所在目录

$ cd letsencrypt

申请证书

$ ./letsencrypt-auto certonly --standalone --email 1158827539@qq.com -d www.roothub.cn -d roothub.cn

注意事项

(1)注意将上面的邮箱和域名替换成自己的 (2)certonly :表示只获取证书,不安装 (3)-d :表示将要获取的SSL证书绑定两个域名,这里是两个,想要再添加域名的话继续在后面添加 -d 域名 (4)弹出的 两个选项 一个选择同意 A 另外一个选择 Y 就行。

出现以下内容说明申请成功

image

进入申请证书的目录,这个目录会以第一个域名命名,不影响多域名使用。

cd /etc/letsencrypt/live/www.roothub.cn/ 

相关的证书文件有4个

image

我们需要用到的是后面两个证书文件: fullchain.pem 和 privkey.pem。 接下来,还需要用到 Linux 下的 openssl 和 keytool 工具,将SSL证书由 .pem 格式转换成 Tomcat 所支持的 .jks 格式。

生成.p12格式的证书

$ openssl pkcs12 -export -in fullchain.pem -inkey privkey.pem -out zyxx_letsencrypt.p12 -name tomcat_letsencrypt
  • 这里会被要求设置密码,输入就行(下面用到的:yourPKCS12pass)
  • 经过上面的操作,/etc/letsencrypt/live/www.roothub.cn/ 目录下就生成了一个p12格式证书 zyxx_letsencrypt.p12

image

生成.jks证书(将证书由.p12格式转换成.jks格式)

$ keytool -importkeystore -deststorepass 'yourJKSpass' -destkeypass yourKeyPass -destkeystore zyxx_letsencrypt.jks -srckeystore zyxx_letsencrypt.p12 -srcstoretype PKCS12 -srcstorepass 'yourPKCS12pass' -alias tomcat_letsencrypt
  • 其中 yourPKCS12pass 是上一步中设置的ssl证书密码,这里的yourKeyPass是要设置的keystore密码,可以与yourPKCS12pass一致,这样不会搞混,下面配置tomcat会用到

  • 经过上面的两步操作,/etc/letsencrypt/live/www.roothub.cn/ 目录下就生成了一个新的证书 zyxx_letsencrypt.jks image

配置服务器

根据你的服务器做选择,tomcat用的是jks格式的证书,nginx用的是pem格式的证书。

tomcat

<Connector port="80" protocol="HTTP/1.1"
               connectionTimeout="20000"
               redirectPort="443" />
<Connector port="443" protocol="org.apache.coyote.http11.Http11Protocol" SSLEnabled="true"
        maxThreads="150" scheme="https" secure="true"
        clientAuth="false" sslProtocol="TLS"
        keystoreFile="/etc/letsencrypt/live/www.roothub.cn/zyxx_letsencrypt.jks"
        keystorePass="zxxx_123"/>

nginx

server {
        listen       443 ssl;
        server_name  www.roothub.cn roothub.cn;
        ssl_certificate      /etc/letsencrypt/live/www.roothub.cn/fullchain.pem;
        ssl_certificate_key  /etc/letsencrypt/live/www.roothub.cn/privkey.pem;
        ssl_session_cache   shared:SSL:1m;
        ssl_session_timeout 5m;
        ssl_protocols             TLSv1 TLSv1.1 TLSv1.2;
        ssl_ciphers               EECDH+CHACHA20:EECDH+CHACHA20-draft:EECDH+AES128:RSA+AES128:EECDH+AES256:RSA+AES256:EECDH+3DES:RSA+3DES:!MD5;
        ssl_prefer_server_ciphers on;
    }

访问站点

重启tomcat或者nginx,使用浏览器访问你的站点。

image

如图所示,URL已经是https了,而且浏览器也信任了我们的证书,有个绿色的小锁,是不是很漂亮。

证书续费

(1)出于安全原因,Let’s Encrypt 颁发的 SSL 证书有效期为90天,我们可以通过自动续期来解决。 (2)考虑到有可能会忘记续期,或者每3个月就要续期一次太麻烦,可以使用 linux crontab 每两个月(0 0 1 */2 *)执行一次证书续期操作。 (3)默认情况下,在证书即将到期之前才能执行续期操作,否则会提示“Cert not yet due for renewal”,即证书尚未到期。如果需要强制执行续期操作,可以加上参数 –force-renew ,命令如下:

$ cd letsencrypt
$ ./letsencrypt-auto renew --force-renew

常见问题

第4步申请证书的时候报错:

Problem binding to port 80: Could not bind to IPv4 or IPv6.

原因是 nginx、tomcat或者其他服务 占用了80端口,释放80端口,再次执行证书安装命令,即可顺利安装。

原文链接:https://miansen.wang/2018/09/08/2/