API шифрования R Plumber с помощью Let's Encrypt и Docker - PullRequest
0 голосов
/ 04 мая 2018

Я пытаюсь разместить API на AWS EC2 под управлением Ubuntu, и связь должна быть через HTTPS

Я создаю код на R и использую Plumber для создания API и построения образа докера

  1. Сначала я создаю образ:

    docker build github.com/eaoestergaard/UNPIE -t eaoestergaard/unpie

  2. А затем запустите образ на порт 8001

    docker run -d -p 8001:8000 --name unpie1 eaoestergaard/unpie

  3. Затем я следую этому (удивительному) руководству, чтобы настроить nginx с Let's Encrypt и Certbot, но заменить производственный сайт моим API

Мой docker-compose.yml выглядит так

    version: '3.1'

    services:

      production-nginx-container:
        container_name: 'production-nginx-container'
        image: nginx:latest
        ports:
          - "80:80"
          - "443:443"
        volumes:
          - ./production.conf:/etc/nginx/conf.d/default.conf
          - ./production-site:/usr/share/nginx/html
          - ./dh-param/dhparam-2048.pem:/etc/ssl/certs/dhparam-2048.pem
          - /docker-volumes/etc/letsencrypt/live/example.com/fullchain.pem:/etc/letsencrypt/live/example.com/fullchain.pem
          - /docker-volumes/etc/letsencrypt/live/example.com/privkey.pem:/etc/letsencrypt/live/example.com/privkey.pem
        networks:
          - docker-network
        depends_on:
          - unpie1

      unpie1:
        image: eaoestergaard/unpie
        restart: always
        ports:
         - "7001:8000"


    networks:
      docker-network:
        driver: bridge

И мой файл конфигурации Nginx production.conf

    server {
        listen      80;
        listen [::]:80;
        server_name example.com www.example.com;

        location ^~ /.well-known/acme-challenge {
            root   /usr/share/nginx/html;
            default_type text/plain;
            allow all;
        }

        location / {
            rewrite ^ https://$host$request_uri? permanent;
        }
    }

    #https://example.com
    server {
        listen 443 ssl http2;
        listen [::]:443 ssl http2;
        server_name example.com;

        server_tokens off;

        ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem;
        ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;

        ssl_buffer_size 8k;

        ssl_dhparam /etc/ssl/certs/dhparam-2048.pem;

        ssl_protocols TLSv1.2 TLSv1.1 TLSv1;
        ssl_prefer_server_ciphers on;

        ssl_ciphers ECDH+AESGCM:ECDH+AES256:ECDH+AES128:DH+3DES:!ADH:!AECDH:!MD5;

        ssl_ecdh_curve secp384r1;
        ssl_session_tickets off;

        # OCSP stapling
        ssl_stapling on;
        ssl_stapling_verify on;
        resolver 8.8.8.8;

        location ^~ /.well-known/acme-challenge {
            root   /usr/share/nginx/html;
            default_type text/plain;
            allow all;
        }

        location /unpie1/ {
                            proxy_pass http://unpie1:8000/;
                            proxy_set_header Host $host;
                    }

        return 301 https://www.example.com$request_uri;
    }

    #https://www.example.com
    server {
        server_name www.example.com;
        listen 443 ssl http2;
        listen [::]:443 ssl http2;

        server_tokens off;

        ssl on;

        ssl_buffer_size 8k;
        ssl_dhparam /etc/ssl/certs/dhparam-2048.pem;

        ssl_protocols TLSv1.2 TLSv1.1 TLSv1;
        ssl_prefer_server_ciphers on;
        ssl_ciphers ECDH+AESGCM:ECDH+AES256:ECDH+AES128:DH+3DES:!ADH:!AECDH:!MD5;

        ssl_ecdh_curve secp384r1;
        ssl_session_tickets off;

        # OCSP stapling
        ssl_stapling on;
        ssl_stapling_verify on;
        resolver 8.8.8.8 8.8.4.4;

        ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem;
        ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;

        location ^~ /.well-known/acme-challenge {
            root   /usr/share/nginx/html;
            default_type text/plain;
            allow all;
        }

        location / {
            #security headers
            add_header Strict-Transport-Security "max-age=31536000; includeSubDomains; preload";
            add_header X-XSS-Protection "1; mode=block" always;
            add_header X-Content-Type-Options "nosniff" always;
            add_header X-Frame-Options "DENY" always;
            #CSP
            add_header Content-Security-Policy "frame-src 'self'; default-src 'self'; script-src 'self' 'unsafe-inline' https://maxcdn.bootstrapcdn.com https://ajax.googleapis.com; img-src 'self'; style-src 'self' https://maxcdn.bootstrapcdn.com; font-src 'self' data: https://maxcdn.bootstrapcdn.com; form-action 'self'; upgrade-insecure-requests;" always;
            add_header Referrer-Policy "strict-origin-when-cross-origin" always;
        }

        root /usr/share/nginx/html;
        index index.html;
    }

Оба созданы по вдохновению из документации сантехника раздел 7.4.2

  1. Затем раскрутите док-контейнер

cd /docker/letsencrypt-docker-nginx/src/production

sudo docker-compose up -d

Я могу подключиться к API по адресу http (например, http://example.com:7001/fv.annuity),, но, к сожалению, не по адресу https - я подозреваю, что мои файлы конфигурации неполные, но, поскольку я новичок в этом, мне не ясно, что я ' м отсутствует.

...