SSLの暗号化を用いたExpressとNGinxを用いたディジタル上のワイルドカードサブドメイン


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とノードパッケージを使用してDNS、SSL、NGinXの設定を自動化することができました.問題は怠け者だ.
インスピレーションのフラッシュでは、私は十分にすべてのsubdoaminsが有効であるように、私はそれを設定することができれば、私はhttp reqを使用して、このサブドメインで提供されるいくつかのHTMLがある必要があるかどうかをチェックするために使用する場合は、フレンドリーな404メッセージを表示しない場合は、それを提供し、彼らはアプリを使用するか、サブドメインをチェックすることを示唆.
私が遭遇した問題のリスト、および私が採用した解決策を修正しました.

DNS


これは実際には超簡単で、単にDigialOceanコンソールにレコードを追加し、昼食を取る.

イメージは偉大ではありませんが、ちょうど値として*を使用し、あなたが行ってもいいです.

Let ' s Encryptを使用したSSL


ここでの最終的な解決策はかなり単純で、解決策がないということを見つけた.
sudo certbot certonly 
    --server https://acme-v02.api.letsencrypt.org/directory 
    --agree-tos 
    --manual 
    --preferred-challenges dns 
    -d welcomeqr.codes 
    -d *.welcomeqr.codes
暗号化が始まる前に、自分自身のような謙虚なフロントエンドの開発者は、いくつかの小さな痛みと苦しみを介してドメインを認証する必要があります.今、このブログ記事の主題のような何かのためにさえ、それはまっすぐ前方です.大部分のユースケースCertbotはあなたのApacheまたはNGinx Configsの世話をします.そして、彼らのひげをcomcombingして、職人のクラフトビールを飲んでいる間、カラーパレットと巨大なNPM束を見ている時間を過ごしたい私のようなNewbsのために大きいです.ここで警告するのは、ワイルドカードの証明書を手動でnginx設定を書く必要があることです.
Certbotは、レッツの暗号化、正直トップのノッチによって提供される優れたパッケージであり、ジョシュAAS、エリックResorla、ピーターEkerksleyとJ .アレックスHaldermanの名誉で寄付し、構築像をしてください.
いずれにしても、上記のCertbotコマンドを見つけようとしたときの間違いは以下の通りでした.
ワイルドカードと正準ドメインのために別々の証明書を加えようとしている
  • コピーペーストのinterwebsを捜します、私がちょうどRTFM
  • を持っていなければならないとき、私が必要としたcertbot旗の例
    ライブと学ぶ!

    金研


    次の問題は、NGinxが2つの異なるアプリケーション、ドメインの1つ、すべてのサブドメインで他のものを提供するようになっていました.再び、スーパーは難しい、幸いにもアプリは、ユーザーが任意のサブドメインを訪問したときにだけVueのCLIによって構築された静的なファイルで構成されていたが、あなたは/の値を持つ新しい場所のブロックを追加することによってここで何をすることができます
    以下のコードブロックはサイト全体のNGNIXファイルです.
    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は苦難です.私はこのユニットを開始する前にホワイトリスト、正規表現、isDevスイッチを持っていました.あまりにもクレイジーではありませんが、単純なものから、これを考慮すると、doesntはまだ多くのまだ小さなアプリケーションです.はい、Corsは痛みです.私はそれを得ます、我々はそれからそれを必要とします、XSSとハッカーはロシアからすばらしいです、しかし、これは私のブログです.

    私はワイルドカードのサブドメインに取り組んでいたことについては、超有名なプログラマーであることが起こる友人の完全な電子メールのチャットでは、それゆえにredaction.
    基本的に、ブラウザはサブドメインから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
    }))
    
    それは本当にCorsのために、あなたは同様にNGinxレベルでこれをすることができました、しかし、私のために、これはより多くのsenceをして、仕事をよくします.私は、セキュリティオタクから来る混乱した叫び声を聞くことができますが、今誰かが公開されたサブドメイン上で欲しいJavaScriptを実行することができますし、誰もが死ぬことができる
    それは事実です、しかし、すべての私の終点はhttpOnlyクッキーとJWTトークンでロックされます.私は、我々が安全であると思います、そして、Tinfoil Hatはあなたに少し馬鹿に見えます.

    結論


    あなたが知っているとき、すべては簡単です.私は、ここのもののいくつかがあなたを助けることを望みます、そして、それがそうしないならば、あなたが私がどれくらい驚くべきかについてこの考えから離れて来ることを望みます.おそらく両方のカウントにはないが、夢は無料です.

    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.