申请 Let’s Encrypt证书的原因: 现在阿里云等都有免费的 https
证书,为什么还要申请这个呢(估计也是因为阿里云这些有免费证书的原因,所以
Let’s Encrypt 知道的人其实并不算太多)?

目录:
1、凭证申请 Let’s Encrypt
2、Nginx支持多域名ssl证书
3、Nginx强制使用https访问(http跳转到https)
4、配置 Tomcat

原因是公司最近接了很多微信小程序的单子,而小程序是必须要 https
的,申请了几个后阿里云的免费就到限额了(每个阿里云的免费证书有限制).

SSL For Free 免费 SSL 凭证申请 Let’s Encrypt

Let’s Encrypt 简单来说就是一个立志让所有网站都用上 https
安全加密通讯的公益项目,背后在众多大公司的支持. 是目前免费 https
证书中最靠谱的.

什么是Let’s Encrypt

可以看看简书上的这篇文章写得比较详细《Let’s Encrypt
SSL证书配置》

文章中详细介绍了使用如何手动生成SSL证书。但是我个人觉得还是比较麻烦,下面我来介绍一个简单的生成SSL证书方案。

不过 Let’s Encrypt
有些限制,首先证书需要三个月一换(阿里云证书是一年),其次非 linux
用户没有太直接的官方申请方法(就算是 linux
平台也要好几个步骤).所以最好是找靠谱第三方代理,

使用sslforfree生成Let’s Encrypt证书

https://www.sslforfree.com

填写域名创建免费的SSL证书

下载文件上传到服务器验证并下载证书

文件上传目录

验证文件

配置好Nginx,点击第5步中的链接看看能不能访问到,如果访问正常就可以点击Download SSL Certificate
按钮下载证书了。

Nginx 主配置nginx.conf如下:

#user  nobody;
worker_processes  1;

#error_log  logs/error.log;
#error_log  logs/error.log  notice;
#error_log  logs/error.log  info;

#pid        logs/nginx.pid;


events {
    worker_connections  1024;
}


http {
    include       mime.types;
    default_type  application/octet-stream;

    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for"';

    access_log  logs/access.log  main;

    sendfile        on;
    #tcp_nopush     on;
    server_tokens off;
    #keepalive_timeout  0;
    keepalive_timeout  65;

    #gzip  on;

    include conf.d/*.conf;
}

Nginx web配置web.conf如下:

upstream tomcat {
   server 127.0.0.1:8080;
}

server {
        listen       80;
        server_name  localhost;

        #charset koi8-r;
    access_log  /home/dev/logs/nginx/web.access.log  main;

    #  error_page  500 502 503 504  /service/tomcat/nginx/504/504.html;
    location /static/{
        alias /home/dev/www/;
    }
    location ~/.well-known/{
        add_header Content-Type text/plain;
                allow all;
        root /home/dev/www/;
    }

     location / {
        proxy_redirect          off;
        proxy_set_header Host $host:$server_port;
        proxy_set_header X-Forwarded-For $remote_addr;
        client_max_body_size      20m;
        client_body_buffer_size 128k;
        proxy_connect_timeout   600;
        proxy_send_timeout      600;
        proxy_read_timeout      900;
        proxy_buffer_size       4k;
        proxy_buffers           4 32k;
        proxy_busy_buffers_size 64k;
        proxy_temp_file_write_size 64k;
        proxy_pass http://tomcat;
        }
}

总结
1、相比较从服务器中命令行获取脚本部署方法简单很多,至少这边可以图形化操作,这样对于一般的用户不用担心是否影响服务器的安全和稳定性。
2、通过获取到的Let’s Encrypt
SSL证书,我们可以部署到虚拟主机、VPS、服务器中,根据各种需要的WEB环境自行部署。
3、因为Let’s Encrypt证书90天有效期,我们在SSL FOR
FREE注册过账户,所以到期前会提醒我们,我们需要根据提示重新续约时间和重新替换证书部署。

幸运的是这样的代理网站很多,这里介绍我用过的比较好的一个 SSL For Free
网址为

Nginx支持多域名ssl证书

要让nginx支持多证书,nginx必须支持TLS SNI。可以使用如下命令查看

./sbin/nginx -V 或者 /usr/local/nginx/sbin/nginx -V

查看Nginx是否支持TLS SNI

如果显示TLS SNI support disabled可以参考这篇文章进行配置

虽然是英文网站,不过还是比较简单的

Nginx强制使用https访问(http跳转到https)

SSL FOR FREE 上下载的证书的zip包含如下内容:

下载的证书

这里我们要将ca_bundle.crt以及certificate.crt
整合到一个文件中cert_chain.crt

 cat certificate.crt ca_bundle.crt >> cert_chain.crt

整合到一个文件需要手动处理一下换行,不然启动Nginx会出现”PEM_read_bio:bad
end line” 的问题

合并文件需要换行

Nginx 配置SSLhttps.conf如下:

1、指定域名80端口强制使用https
2、配置https监听

[root@localhost conf]# cat conf.d/https.conf
upstream tomcats {
   server 127.0.0.1:8088;
}

server
    {
        listen 80;
        #listen [::]:80;
        server_name ngrok.javen205.1mfy.cn static.javen205.1mfy.cn frp.javen205.1mfy.cn ijpay.javen205.1mfy.cn;

        return 301 https://$host$request_uri;
        #rewrite ^(.*)$  https://$host$1 permanent;
    }

server {
        listen 443;
        server_name  ngrok.javen205.1mfy.cn static.javen205.1mfy.cn frp.javen205.1mfy.cn ijpay.javen205.1mfy.cn;
        ssl on;
        ssl_certificate /usr/local/nginx/conf/ssl/cert_chain.crt;
        ssl_certificate_key /usr/local/nginx/conf/ssl/private.key;
        ssl_session_timeout 5m;
        ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
        ssl_prefer_server_ciphers on;
        ssl_ciphers "EECDH+CHACHA20:EECDH+CHACHA20-draft:EECDH+AES128:RSA+AES128:EECDH+AES256:RSA+AES256:EECDH+3DES:RSA+3DES:!MD5";
        ssl_session_cache builtin:1000 shared:SSL:10m;
        access_log  /home/dev/logs/nginx/https.access.log  main;

    #  error_page  500 502 503 504  /service/tomcat/nginx/504/504.html;
    location /static/{
        alias /home/dev/www/;
    }
    location ~/.well-known/{
        add_header Content-Type text/plain;
                allow all;
        root /home/dev/www/;
    }

     location / {
        proxy_redirect          off;
        proxy_set_header Host $host:$server_port;
        proxy_set_header X-Forwarded-For $remote_addr;
        client_max_body_size      20m;
        client_body_buffer_size 128k;
        proxy_connect_timeout   600;
        proxy_send_timeout      600;
        proxy_read_timeout      900;
        proxy_buffer_size       4k;
        proxy_buffers           4 32k;
        proxy_busy_buffers_size 64k;
        proxy_temp_file_write_size 64k;
        proxy_pass http://tomcats;
        }
}
[root@localhost conf]#

 1.首选输入要使用证书的域名,有多个的话可以用空格分开同时申请,不过默认一个根域名的时候会把
www 也子域名也同时申请了,所以 www 的不需要独立再申请.

配置Tomcat

配置Tomcat server.xml 的 Engine 模块下配置一个 Valve:

<Engine name="Catalina" defaultHost="localhost"> 
<Valve className="org.apache.catalina.valves.RemoteIpValve" 
remoteIpHeader="X-Forwarded-For" 
protocolHeader="X-Forwarded-Proto" 
protocolHeaderHttpsValue="https" httpsServerPort="8088"/>  #非80端口时,必须增加httpsServerPort配置,不然request.getServerPort()方法返回 443. 
</Engine>

在Tomcat的webapps/ROOT目录下添加test.html测试如下图:

image.png

参考资料
Installing a certificate on
Nginx
Nginx支持多域名ssl证书
解决配置SSL证书出现”PEM_read_bio:bad end
line”问题
Nginx+Tomcat+HTTPS 配置不需要在 Tomcat 上启用 SSL
支持

图片 1

 

2.接下来要证明这个域名确实属于您,方法是传文件上去,然后发证书的程序会去访问,原理如此方法如下:

选择 “Manually Verify Domain” 表示要手动验证网站属于您.

图片 2

 3.这时用于验证的文件就生成了,要下载回去放到您的网站上,特别注意的是这个文件是无后缀名的,用
iis 的用户要设置下网站才能下载.

点击 “Download SSL Certificate”
下载两个文件,然后上传后的网址也后提示出来,自己先访问一下,要设置服务器让它们能访问才行,否则后面是过不去的.

图片 3

4.如果文件放置位置正确就可以走下一步下载证书了,不过由于证书只有三个月,所以它还提供了到期提醒的邮件服务.

这里我强烈推荐大家不要提供常用的主邮箱,再说普通国内邮箱一般都会把这种不太出名的地方发出的邮件当做垃圾邮件过滤掉,这里我推荐

专门用于这种临时用途的 newbt 邮箱,注册简单,也不会有收不到信的问题,网址是

 

图片 4

5.好,一切顺利的话证书可以下载了

图片 5

这里仍然有一个非常需要注意的问题,各个服务器程序对 https
证书的格式其实是有要求的,这种格式应该是明文 base64 的 crt 格式,开源的
http 服务器

或者 golang 语言都能很好支持,但使用 iis 的用户需要先转换成 pfx 证书.

关于 pfx
证书的转换和验证文件的配置还是比较麻烦的,所以这里一时半会也说不清楚,需要的网友可以给我留言.

 

相关文章