为确保网络信息安全传输,对网站进行https加密已是大势所趋,当前通行的方法就是给网站作SSL认证,然后基于认证使用https加密通信协议。

环境:

服务器--阿里云ECS

操作系统--Ubuntu 16.04.2 server

docker版本--17.05.0-ce

docker-compose版本--1.13.0

Web服务器--nginx:1.14(官方镜像)

方案:

基于Docker容器技术,通过docker-compose来编排容器,使用nginx官方镜像构建出Web服务器,认证机构选择提供免费SSL认证的 Let's encrypt(证书有效期每次 90 天),SSL认证客户端软件选择简单易用的 acme.sh,以 --standalone 方式获取到SSL证书后,再手工配置 nginx 的 https 加密。证书在 60 天以后 acme.sh 会自动进行更新, 无需任何操作。

步骤:

1、拉取 nginx 的官方镜像

docker pull nginx:1.14

2、编写 docker-compose.yml 容器编排文件

version: "3"
  nginx:
    container_name: "nginx"
    image: "nginx:1.14"
    ports:
      - "80:80"
      - "443:443"
    volumes:
      - ./nginx/nginx.conf:/etc/nginx/nginx.conf:ro
      - ./nginx/html:/usr/share/nginx/html
    restart: always

3、编写nginx的配置文件nginx.conf

http {
  server {
      listen [::]:80 default_server;
      listen 80;
      server_name  www.59m59s.com;
      rewrite ^(.*)$ https://${server_name}$1 permanent;
  }
  alias /usr/share/nginx/html/;
  index index.html;
}

4、测试用 docker-compose up -d 启动 nginx 容器,打开浏览器以http协议访问网站正常,以https协议访问网站报错(因为还没有配置https)。

5、在宿主机(不是在nginx容器里)安装 acme.sh ,再创建一个 acme.sh 的别名,方便使用 acme.sh 指令,最后安装 socat ,因为以 --standalone 方式申请SSL证书要用到 socat 。

curl  https://get.acme.sh | sh
alias acme.sh=~/.acme.sh/acme.sh
apt-get install  socat

6、通过 acme.sh 向 Let's encrypt 认证机构申请 SSL 证书,这一步要注意的是,如果 Web 服务器是打开的,必须先关闭Web服务器,因为 --standalone 方式需要临时监听 80 端口。

acme.sh  --issue -d 59m59s.com -d www.59m59s.com   --standalone

7、把获取到的SSL证书复制到 nginx 容器可以读取的数据卷对应的文件里。

acme.sh  --installcert  -d  59m59s.com  -d www.59m59s.com --key-file   ./ssl/59m59s.com.key   --fullchain-file ./ssl/fullchain.cer

8、重新编辑 nginx 的配置文件 nginx.conf ,添加 https 协议默认使用的 443 端口,并在 443 端口启用 SSL ,为能够允许 http 协议和 https 协议都能访问网站,对所有访问 80 端口的 http 请求进行重写,转发到已经 https 加密的 443 端口。

...
...
server {
      listen [::]:80 default_server;
      listen 80;
      server_name  www.59m59s.com;
      rewrite ^(.*)$ https://${server_name}$1 permanent;
  }
  server {
    listen [::]:443 default_server ssl;
    listen 443 ssl;
    server_name  www.59m59s.com;
    ssl_certificate /usr/share/nginx/html/ssl/fullchain.cer;
    ssl_certificate_key /usr/share/nginx/html/ssl/59m59s.com.key;
    ssl_session_cache shared:SSL:100m;
    ssl_session_timeout 500m;
    ssl_ciphers HIGH:!aNULL:!MD5;
    ssl_prefer_server_ciphers on;
    ...
    ...

9、用 docker-compose up -d 重启 Web 服务器,用 http 和 https 访问网站均正常,且浏览器地址栏显示连接是安全的,说明给网站作SSL认证已生效。