Django 배포 HTTPS

7378 단어
blogof33.com/post/10/
전언
크롬의 새 버전은 이미 자동으로 HTTPS로 넘어간다. ACool은 HTTPS가 없는 블로그 사이트가 완벽하지 않다고 생각했지만 평소 바빠서 시간을 내기가 어려웠다.오늘 드디어 시간이 났습니다. HTTPS가 Django에 배치되었습니다.인터넷에서 Django 프레임워크에서 HTTPS 배치에 대한 글이 적기 때문에 배치 과정을 기록합니다.
구성 환경:
  • django >= 1.8
  • nginx

  • Let's Encrypt는 무료, 자동, 개방적인 인증 기구(CA)로 대중의 이익을 위해 운영된다.ISRG(Internet Security Group) 에서 제공하는 서비스입니다.이 문서는 Let's Encrypt에서 제공하는 무료 SSL 인증서를 사용합니다.
    인증서를 수동으로 수령하고 유지하는 것은 매우 번거롭기 때문에, 우리는 자동 클라이언트 Cettbot을 사용하여 SSL 인증서를 배치합니다.다음은 공식 소개입니다.
    Certbot은 EFF가 인터넷 전체를 암호화하기 위한 노력의 일부입니다.웹에서의 보안 통신은 HTTPS에 의존하기 때문에 웹 서버의 신분을 브라우저가 검증할 수 있도록 디지털 인증서를 사용해야 한다. (예를 들어 구글.com이 사실입니까?)웹 서버는 인증서 발급 기구(CA)라는 신뢰할 수 있는 제3자로부터 인증서를 받습니다.Certbot은 Let's Encrypt(EFF, Mozilla 및 다른 사용자가 시작한 오픈 인증 기관)에서 인증서를 받아 웹 서버에 배치할 수 있는 편리한 클라이언트입니다.
    위 조합(Let's Encrypt + Certbot) 방식을 사용하면 간단하고 편리하며 빠르다.
    SSL 인증서 가져오기
    사전 작업
    인증서를 만들기 전에, 웹 서버가 루트 디렉터리의 이 경로에서 정적 파일을 제공할 수 있는지 확인해야 합니다. /.well-knowdjango 프로그램이 도입한 모든 경로가 wsgi를 통해 서비스를 제공하기 때문에, 이 자원을 정적으로 제공하기 위해nginx 설정을 작성해야 합니다. 도메인 이름의nginx 프로필에 다음 내용을 추가합니다.
    server {
        location /.well-known/acme-challenge {
            alias /path/to/yoursite/.well-known/acme-challenge;
        }
    }
    

    자신의 상황에 따라 /path/to/yoursite/ 필드를 수정하십시오. 예를 들어 /home/User/Blogof33.com로 변경하면 이 경로가 Django app의 절대 경로입니다. 즉, manage.py 파일이 있는 디렉터리입니다.
    Certbot 다운로드
    github에서 원본 코드를 다운로드하면 Linux 서버 버전의 차이에 관여하지 않아도 됩니다.
    git clone https://github.com/certbot/certbot.git
    

    인증서 생성
    Apache가 아닌nginx이므로 webroot 옵션을 사용하여 인증서를 받습니다.
    certbot certonly --webroot -w /path/to/yoursite -d blogof33.com -d www.blogof33.com
    

    위의 미리 작업한 수정과 같이 /path/to/yoursite 필드와 blogof33.com 필드를 수정하십시오. 현재 도메인에 www를 추가하지 못하면 (즉 WWW의 해석이 제공되지 않음) 마지막 필드를 삭제하십시오.
    이 명령의 성공적인 출력은 다음과 같습니다(Congratulations).
    Output: IMPORTANT NOTES:
  • If you lose your account credentials, you can recover through e-mails sent to [email protected]
  • Congratulations! Your certificate and chain have been saved at/etc/letsencrypt/live/example.com/fullchain.pem. Your cert will expire on 2018-08-31. To obtain a new version of the certificate in the future, simply run Let's Encrypt again.
  • Your account credentials have been saved in your Let's Encrypt configuration directory at/etc/letsencrypt. You should make a secure backup of this folder now. This configuration directory will also contain certificates and private keys obtained by Let's Encrypt so making regular backups of this folder is ideal.
  • If like Let's Encrypt, please consider supporting our work by: Donating to ISRG/Let's Encrypt: https://letsencrypt.org/donate Donating to EFF: https://eff.org/donate-le

  • 상기 명령은 www.blogof33.comblogof33.com에 단독 인증서를 생성합니다.인증서는 에 저장됩니다.
    Django 구성
    공식 링크 참조:
    docs.djangoproject.com/en/1.10/top…
    구성 파일www.blogof33.com을 수정하고 다음 행을 추가합니다.
    SESSION_COOKIE_SECURE=True
    SESSION_COOKIE_HTTPONLY=True
    SECURE_PROXY_SSL_HEADER = ('HTTP_X_FORWARDED_PROTOCOL', 'https')
    

    주의:django<1.8을 실행하는 프로그램에 대해django-secure를 설치하고 설정해야 합니다.
    Nginx 구성
    마지막 단계는nginx를 설정하는 것입니다. 설정 파일은 /etc/letsencrypt/live/blogof33.com/fullchain.pem에 위치하고 설정과 설명은 다음과 같습니다.
    server {
        charset utf-8;
        listen 80;
        server_name www.blogof33.com blogof33.com;
        return 301 https://blogof33.com$request_uri;
    
    }
    server {
        listen 443 default ssl;
        server_name  blogof33.com;
    
        ssl_certificate /etc/letsencrypt/live/blogof33.com/fullchain.pem;
        ssl_certificate_key /etc/letsencrypt/live/blogof33.com/privkey.pem;
        error_log /var/log/nginx/error.log;
        
        location /.well-known/acme-challenge {
            alias /home/ACool/sites/blogof33.com/DjangoBlog/.well-known/acme-challenge;
        }
        location /static {
            alias /home/ACool/sites/blogof33.com/DjangoBlog/static;
        }
        location / {
            proxy_set_header Host $host;
            proxy_pass http://unix:/tmp/blogof33.com.socket;
        }
    }
    
    

    여기서 첫 번째 서버 코드는 다음과 같습니다.
    server {
        charset utf-8;
        listen 80;
        server_name www.blogof33.com blogof33.com;
        return 301 https://blogof33.com$request_uri;
    
    }
    

    모든 HTTP 트래픽을 HTTPS로 리디렉션한다는 뜻으로, 우리는 자신의 도메인 이름에 따라 도메인 이름을 수정하기만 하면 다른 부분은 변하지 않는다.
    이 행은 443 포트(HTTPS 포트 번호)를 수신하는 데 사용됩니다.
    listen 443 default ssl;
    

    이 두 줄은 인증서와 키를 가리킨다. (도메인 이름은 자신의 것으로 바뀐다.)
    ssl_certificate /etc/letsencrypt/live/blogof33.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/blogof33.com/privkey.pem;
    

    이 줄은 인증서를 만드는 데 사용됩니다.
    location /.well-known/acme-challenge {
            alias /home/ACool/sites/blogof33.com/DjangoBlog/.well-known/acme-challenge;
        }
    

    nginx 구성을 수정한 후 다시 로드합니다.
    sudo nginx -s reload
    

    이 구성이 완료되었습니다.브라우저 캐시를 새로 고치는 것을 잊지 마세요.
    Let's Encrypt 자동 갱신
    Let's Encrypt의 인증서는 90일이 지나면 만료되기 때문에 우리는 자동화 업데이트 스크립트를 설정해야 한다. 가장 쉬운 것은 setting.py이다./etc/nginx/sites-available/blogof33.com 명령을 사용하여 다음과 같은 정시 작업에 가입(매주 강제 업데이트를 하고 루트 권한이 필요하면 루트 아래로 전환해서 실행해야 함):
    45 2 * * 2 cd /etc/letsencrypt/ && ./certbot-auto renew --deploy-hook "service nginx reload"
    

    crontab 여섯 필드의 의미:
    minute hour day month week command
    여기에서:
  • minute: 분을 나타냅니다. (정수 0-59).
  • hour: 시간은 0에서 23 사이의 모든 정수를 나타낸다.
  • day: 날짜를 나타내며 1에서 31 사이의 모든 정수일 수 있습니다.
  • month: 달을 의미하며 1에서 12 사이의 모든 정수일 수 있습니다.
  • week: 무슨 요일을 의미하는지는 0에서 7 사이의 모든 정수일 수 있습니다. 이곳의 0이나 7은 일요일을 대표합니다.
  • command: 실행할 명령은 시스템 명령일 수도 있고 직접 작성한 스크립트 파일일 수도 있습니다.

  • 만약 필드에 * 번호를 사용한다면, 예를 들어month 필드가 * 번호라면, 다른 필드의 제약을 만족시키기 위해 매달 이 명령을 실행합니다.
    매주 2시 45분에 인증서 업데이트를 시도합니다. 인증서가 30일 안에 만료되면 인증서를 업데이트합니다. 그렇지 않으면 업데이트되지 않습니다. crontab 옵션은 업데이트가 성공한 후에nginx를 다시 불러오는 명령을 실행합니다.
    이로써 Django 프레임워크에서 HTTPS 배치가 모두 완료되었습니다.
    Welcome to the https world!더 이상 사이트 납치 걱정 안 해도 돼.

    좋은 웹페이지 즐겨찾기