基于Docker的Nginx文件服务器的SSL配置

基于Docker的Nginx文件服务器的SSL配置

Scroll Down

基于Docker的Nginx文件服务器的SSL配置

什么是SSL证书

来自Symantec网站

SSL代表安全套接字层,简而言之,它是保持互联网连接安全和保护在两个系统之间发送的任何敏感数据的标准技术,可防止犯罪分子阅读和修改任何传输的信息,包括潜在的个人信息。这两个系统可以是服务器和客户端(例如,购物网站和浏览器)或服务器到服务器(例如,具有个人可识别信息或具有工资单信息的应用程序)

TLS(传输层安全性)只是SSL的更新,更安全的版本

当网站受SSL证书保护时,HTTPS(超文本传输协议安全)出现在URL中。可以通过单击浏览器栏上的锁定符号来查看证书的详细信息,包括颁发机构和网站所有者的公司名称

TLS(传输层安全性)

来自维基百科

传输层安全性(TLS)及其现已弃用的前身安全套接字层(SSL),是旨在通过计算机网络提供通信安全性的加密协议。协议的几个版本广泛用于诸如网页浏览,电子邮件,即时消息和IP语音(VoIP)之类的应用程序中。网站可以使用TLS来保护其服务器和Web浏览器之间的所有通信

TLS协议主要旨在提供两个或更多通信计算机应用程序之间的隐私和数据完整性。当通过TLS保护时,客户端(例如,Web浏览器)和服务器(例如,wikipedia.org)之间的连接应具有以下一个或多个属性:

  • 连接是私有的(或安全的),因为对称加密用于加密传输的数据
  • 可以使用公钥加密来验证通信方的身份。该认证可以是可选的,但通常需要至少一方(通常是服务器)
  • 该连接是可靠的,因为发送的每个消息包括使用消息认证码的消息完整性检查,以防止在传输期间未检测到的丢失或数据的改变

获取证书

自签名证书可以用于开发和测试目的,如果你想要部署到production(生产环境),你需要CA trusted certifcate Let's Encrypt是第一个免费开放的CA。这里也是我的选择!

获取源代码

git clone https://github.com/certbot/certbot

生成证书

./certbot-auto certonly -a standalone -d example.com -d www.example.com
或
./certbot-auto certonly -a standalone -d example.com
或
./certbot-auto certonly --standalone -d example.com

参数说明可以使用./certbot-auto --help查看

注意:安装证书过程请务必先关掉当前环境中占用80端口的服务,否则会安装失败。查看端口进程命令netstat -nap | grep 80

查看证书

安装成功后在/etc/letsencrypt路径下会生成相关文件(夹),证书存放路径/etc/letsencrypt/live/你的域名

drwx------ 3 root root 4096 7月  11 22:54 accounts
drwx------ 5 root root 4096 7月  14 01:47 archive
drwxr-xr-x 2 root root 4096 7月  14 01:47 csr
drwx------ 2 root root 4096 7月  14 01:47 keys
drwx------ 5 root root 4096 7月  14 01:47 live
drwxr-xr-x 2 root root 4096 7月  14 01:47 renewal
drwxr-xr-x 5 root root 4096 7月  11 22:54 renewal-hooks

Nginx文件服务器搭建

nginx.yml

version: '3.1'
services:
  nginx:
    image: nginx
    hostname: nginx
    container_name: nginx
    restart: always
    ports:
      - 9090:80
      - 90:8080
      - 91:8443
    volumes:
      - /volume1/yaolianhua/files/docker/nginx/file_https.conf:/etc/nginx/conf.d/file_https.conf:rw
      - /volume1/yaolianhua/files/docker/nginx/file.conf:/etc/nginx/conf.d/file.conf:rw
      - /volume1/yaolianhua/files/docker/nginx/ssl:/etc/nginx/ssl:rw
      - /volume1/yaolianhua/files:/var/www/file:ro
      - /volume1/yaolianhua/files/docker/nginx/logs:/var/logs/nginx:rw
    networks:
      - app_net
networks:
  app_net:
    external: true

/.../files是你的文件服务器跟路径,/.../ssl是生成证书的路径(将所有目录拷贝)

file.conf

log_format  p_access.log  '$remote_addr - $remote_user [$time_local] "$request" '
             '$status $body_bytes_sent "$http_referer" '
             '"$http_user_agent" $http_x_forwarded_for';
server
    {
        listen       8080;  # 监听 8080 端口,按需求也可以配置一个前台服务器作子域名转发

        index index.html default.html; # 默认首页文件
        root  /var/www/file;   #文件服务器的根路径

        autoindex on;
        autoindex_exact_size off;
        autoindex_localtime on;

        charset utf-8;

        location /favicon.ico {
               root /var/www/file; #favicon.ico 存放路径

        }

                # 这里配置拒绝访问的目录或文件
        location ~ (repos)
        {
            deny all;
        }

                # 静态文件的过期时间,可以不需要此配置
        location ~ .*\.(gif|jpg|jpeg|png|bmp|swf)$
            {
                expires      30d;
            }

                # 静态文件的过期时间,可以不需要此配置
        location ~ .*\.(js|css)?$
            {
                expires      12h;
            }
                 # 这里很重要! 将日志转发到 /dev/stdout ,可以通过 docker logs -f  来查看容器日志
        access_log  /var/logs/nginx/file.log;
    }

file_https.conf

log_format  q_access.log  '$remote_addr - $remote_user [$time_local] "$request" '
             '$status $body_bytes_sent "$http_referer" '
             '"$http_user_agent" $http_x_forwarded_for';
server
    {
        listen 8443 ssl;  # 监听 8433 端口,按需求也可以配置一个前台服务器作子域名转发
        ssl_certificate /etc/nginx/ssl/live/file.yaolh.cn/fullchain.pem; # 证书
        ssl_certificate_key /etc/nginx/ssl/live/file.yaolh.cn/privkey.pem; # 密钥

        ssl_session_timeout  5m;
        ssl_ciphers HIGH:!aNULL:!MD5;
        ssl_protocols SSLv3 TLSv1 TLSv1.1 TLSv1.2;
        ssl_prefer_server_ciphers   on;

        index index.html default.html; # 默认首页文件
        root  /var/www/file;   #文件服务器的根路径

        autoindex on;
        autoindex_exact_size off;
        autoindex_localtime on;

        charset utf-8;

        location /favicon.ico {
               root /var/www/file;

        }

                # 这里配置拒绝访问的目录或文件
        location ~ (repos)
        {
            deny all;
        }

                # 静态文件的过期时间,可以不需要此配置
        location ~ .*\.(gif|jpg|jpeg|png|bmp|swf)$
            {
                expires      30d;
            }

                # 静态文件的过期时间,可以不需要此配置
        location ~ .*\.(js|css)?$
            {
                expires      12h;
            }
                 # 这里很重要! 将日志转发到 /dev/stdout ,可以通过 docker logs -f  来查看容器日志
        access_log  /var/logs/nginx/file_https.log;
    }

启动

docker-compose -f nginx.yml up -d

访问

http://域名:90,https://域名:91一个未加密,一个有安全锁,测试均通过