digitalocean의 와일드카드 서브 도메인은 Express와 Nginx를 사용하여 SSL을 암호화합니다.

This guide is intended to help you achieve the same thing, but also to keep a record for myself and thirdly to show everyone how smart I am >.< All jokes aside though, I am aware how specific this is as a use case, the hope is that if you are trying to achieve something similar you can cherrypick the bits that are relevant to your mision


뭐 공부 해요?


사용자가 하위 영역에서 간단한 html를 발표할 수 있도록 프로그램을 만들고 있습니다. 비용을 지불하면 하위 영역에서 발표할 수 있고, 가격이 싸면 무작위로 생성된 하위 영역에서 발표할 수 있습니다.
최초의 생각은 편집기에서 html을 발표하면 bash와 Node 패키지를 사용하여 DNS, SSL, Nginx 설정을 자동화할 수 있다는 것이다.문제는 내가 게으르다는 것이다.
나는 갑자기 영감이 떠올랐다. 나는 그것을 모든subdoamin이 유효하다고 설정한 다음에 HTTP req를 사용하여 이 하위 영역에 HTML 서비스가 있어야 하는지 검사할 수 있다고 생각했다. 만약 그렇다면 그것을 제공할 수 있다. 만약에 우호적인 404 메시지가 나타나지 않는다면 응용 프로그램을 사용하거나 하위 영역을 검사할 것을 건의했다.
다음은 내가 직면한 문제 목록과 내가 이 문제들을 해결하는 해결 방안이다.

도메인 이름 서버


이것은 사실상 매우 간단하다. 단지 디지털 로션 컨트롤러에 A 기록을 추가하고 점심을 먹기만 하면 된다.

그림은 좋지 않지만, *를 가치로 사용하면 당신은 매우 좋습니다.

SSL은 Let's Encrypt를 사용합니다.


마찬가지로 이곳의 최종 해결 방안은 매우 간단하지만 해결 방안을 찾는 것은 결코 간단하지 않다.
sudo certbot certonly 
    --server https://acme-v02.api.letsencrypt.org/directory 
    --agree-tos 
    --manual 
    --preferred-challenges dns 
    -d welcomeqr.codes 
    -d *.welcomeqr.codes
암호화가 두드러지기 전에, 나처럼 겸손한 전단 개발자는 작은 고통을 겪어야만 하나의 영역을 인증할 수 있다.비록 이 블로그 문장의 주제와도 단도직입적이다.절대 다수의 용례에서certbot은 당신의 아파치나 Nginx 설정을 책임질 것입니다. 이것은 저와 같은 초보자들에게 매우 좋습니다. 그들은 컬러 트레이와 커다란 NPM 가방을 보는 데 시간을 들이고 수염을 빗고 artisinal craft 맥주를 마시고 싶습니다.여기서 주의해야 할 것은 어댑터 인증서의 경우 Nginx 설정을 수동으로 작성해야 한다는 것입니다.
Certbot은 우수한 소프트웨어 패키지로 Let's Encrypt가 제공합니다. 솔직히 일류라고 할 수 있습니다. 조쉬 아아스, 에릭 레스콜라, Peter Eckersley와 J.Alex Halderman을 기념하기 위해 조각상을 기부하고 만들어 주십시오.
어쨌든, 내가 위의certbot 명령을 찾으려고 할 때 저지른 실수는 다음과 같다.
  • 와일드카드 도메인 및 사양 도메인에 별도의 인증서 추가 시도
  • 인터넷에서 내가 필요로 하는certbot 로고의 복사 붙여넣기 예시를 검색하는데 나는 RTFM
  • 만 있어야 한다
    생활과 공부!

    Nginx 회사


    다음 문제는 Nginx를 두 개의 다른 응용 프로그램에 서비스하는 것입니다. 하나는 도메인에서, 다른 하나는 모든 하위 도메인입니다.마찬가지로, 이것도 특별히 어려운 것은 아닙니다. 다행히도, 사용자가 하위 영역에 접근할 때 제공하는 프로그램은 vuecli가 구축한 정적 파일로만 구성되어 있지만, 값이 있는 새로운 위치 블록을 추가해서 모든 일을 할 수 있습니다/
    다음 코드 블록은 전체 사이트에서 유일한nginx 파일입니다.
    server {
    
        index index.html index.htm index.nginx-debian.html;
    
        server_name welcomeqr.codes;
    
        expires $expires;
    
        location /robots.txt {
                alias /var/www/welcomeqr.codes/server/nginx/robots.txt;
        }
    
        location /squire/ {
                alias /var/www/welcomeqr.codes/server/squire/;
        }
    
        location /uploads/ {
                alias /var/www/welcomeqr.codes/server/dist/uploads/;
        }
    
        location / {
                proxy_pass http://localhost:1980;
                proxy_set_header Host $host;
                proxy_set_header X-Real-IP $remote_addr;
                proxy_set_header X-Forwarded-for $remote_addr;
        }
    
        listen 443 ssl; # This needed to be hand written
        ssl_certificate /etc/letsencrypt/live/welcomeqr.codes/fullchain.pem; # This needed to be hand written
        ssl_certificate_key /etc/letsencrypt/live/welcomeqr.codes/privkey.pem; # This needed to be hand written
        include /etc/letsencrypt/options-ssl-nginx.conf; # This needed to be hand written
        ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # This needed to be hand written
    }
    
    server {
        if ($host = welcomeqr.codes) {
            return 301 https://$host$request_uri;
        } # This needed to be hand written
    
        server_name welcomeqr.codes;
        listen 80;
        return 404; # This needed to be hand written
    }
    
    server {
    
        index index.html index.htm index.nginx-debian.html;
    
        server_name *.welcomeqr.codes;
    
        root /var/www/welcomeqr.codes/front-published/dist/;
    
        expires $expires;
    
        listen 443 ssl; # This needed to be hand written
        ssl_certificate /etc/letsencrypt/live/welcomeqr.codes/fullchain.pem; # This needed to be hand written
        ssl_certificate_key /etc/letsencrypt/live/welcomeqr.codes/privkey.pem; # This needed to be hand written
        include /etc/letsencrypt/options-ssl-nginx.conf; # This needed to be hand written
        ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # This needed to be hand written
    }
    
    server {
        if ($host = *.welcomeqr.codes) {
            return 301 https://$host$request_uri;
        } # This needed to be hand written
    
        server_name *.welcomeqr.codes;
        listen 80;
        return 404; # This needed to be hand written
    }
    
    

    CORS 회사


    CORS는 어려운 일입니다.내가 이 작업 단원을 시작하기 전에, 나는 화이트 리스트, 정규 표현식과 isDev 스위치를 가지고 있었다.그다지 미치지는 않지만, 간단하지 않다. 이것은 작은 응용 프로그램이라는 것을 감안하면, 아직 많이 하지 않았다...네, CORS는 고통입니다.알겠습니다. XSS와 러시아에서 온 해커가 필요합니다. 좋습니다. 하지만 이것은 제 블로그입니다. 그래서 제가 불평하고 싶을 때 불평합니다.

    나는 내가 전보 채팅에서 어댑터 영역을 연구했다고 언급했다. 채팅 중에 많은 친구들이 있었다. 그들은 공교롭게도 매우 유명한 프로그래머이기 때문에 나는 편집을 했다.
    기본적으로 브라우저는 하위 도메인에서 Access-Control-Allow-Origin라는 헤더가 없는 도메인으로 HTTP 요청을 자극하는 것을 좋아하지 않습니다. 이 헤더는 요청의 출처와 일치하고 그 중에서 출처는 도메인과 하위 도메인과 일치합니다.만약 하드코딩된 하위 영역이 몇 개 있다면, 이것은 매우 좋지만, *의 강력한 기능을 원한다면, 추가 해커가 필요합니다.
    // Middleware - this.app = express()
    
    this.app.use((req, res, next) => {
    
        // tldjs is a handy npm package, 10/10 recommended
        const tld = tldjs.parse(req.header('origin'))
    
        if (process.env.NODE_ENV === 'production' && tld.isValid && tld.domain === 'welcomeqr.codes' ) {
    
            // this is the line that does the 'heavy' lifting
            res.setHeader('Access-Control-Allow-Origin', req.header('origin'))
    
        }
    
        // other headers and things here have been ommitted becuause security and brevity
    
        next()
    })
    
    // expressjs CORS package
    this.app.use(cors({
        origin:
            process.env.NODE_ENV !== 'production' ?
                [DEV_URL, DEV_URL_PUBLISHED, '/\.google.com\.com$/']
                : [PROD_URL, '/\.welcomeqr\.codes$/', '/\.google.com\.com$/'],
        credentials: true
    }))
    
    이것이 바로 코스입니다. 당신도 Nginx 단계에서 이 일을 할 수 있지만, 나에게는 더욱 의미가 있고, 또한 매우 잘 합니다.나는 안전미들로부터 곤혹스러운 비명을 들을 수 있다. "하지만 현재 발표된 하위 영역에서 원하는 자바스크립트를 실행할 수 있는 사람이 있다. 모든 사람이 죽을 수도 있다!"
    이것은 사실이지만, 나의 모든 단점은 httpOnly 쿠키와 JWT 영패에 잠겨 있고, 모든 입력은 암호화되어 있다.나는 우리가 안전하다고 생각한다. 게다가 그 주석 모자를 네 몸에 쓰면 좀 멍청해 보인다.

    결론


    네가 어떻게 하는지 알기만 하면 모든 것이 쉽다.나는 이곳의 몇 가지 물건이 너를 도울 수 있기를 바란다. 만약 없다면, 나는 네가 더 이상 내가 얼마나 많은지 생각하지 않기를 바란다.이 두 가지 모두 중요하지 않을지 모르지만, 꿈은 자유다.

    I'm the first to admit that there could well be errors and incorrect assumptions contained in the words and examples above, if you find any and feel strongly about them, reach out to me on GitHub I would appreciate any and all feedback, both negative and positive.

    좋은 웹페이지 즐겨찾기