একটি এনজিনেক্স বিপরীত প্রক্সি দিয়ে এনক্রিপ্ট করতে দেয়


45

ভূমিকা

আমার একটি ডেভ সার্ভার রয়েছে (বর্তমানে উবুন্টু 14.04 এলটিএস চলছে), যা আমি বেশ কিছুদিন ধরে বিভিন্ন বন্দরে বিভিন্ন বিকাশের সরঞ্জামগুলি হোস্ট করার জন্য ব্যবহার করে আসছি। কারণ বন্দরগুলি স্মরণে রাখা শক্ত হতে পারে যে আমি আমার সমস্ত পরিষেবার জন্য 80 বন্দরটি ব্যবহার করার সিদ্ধান্ত নিয়েছি এবং হোস্ট-নেম বন্ধ করে পোর্টটি অভ্যন্তরীণভাবে ফরোয়ার্ড করার সিদ্ধান্ত নিয়েছি।

ডোমেন ডটকম.৫৪৪৩২ লেখার পরিবর্তে আমি কেবল এটি sub.domain.com এর মাধ্যমে অ্যাক্সেস করতে পারি

উদাহরণস্বরূপ অ্যাপ্লিকেশন এক্স, যা 7547 পোর্টটি ব্যবহার করছে এবং সাব.ডোমেন.কম.তে চলছে এটির নিম্নলিখিত এনগিনেক্স কনফিগারেশন রয়েছে:

upstream sub {
    server 127.0.0.1:7547;
}

server {
    listen 80;
    server_name sub.domain.com www.sub.domain.com;
    access_log /var/log/nginx/sub.log combined;
    location / {
            proxy_set_header Host $host;
            proxy_set_header X-Real-IP $remote_addr;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
            proxy_pass http://127.0.0.1:7547;
            proxy_set_header Authorization "";
    }
}

প্রশ্নটি

বর্তমান কনফিগারেশন কাঠামোটি দেওয়া, যা আমি বেছে নিয়েছি, লেটসক্রিপ্ট ব্যবহার করা এবং https এর অধীনে বিভিন্ন পরিষেবা চালানো কি সম্ভব?


3
আমি এই বিষয়ে একটি ব্লগ পোস্ট লিখেছি: tom.busby.ninja/letsecnrypt-nginx-revers-proxy-no-downtime
টম বাসবি

উত্তর:


81

হ্যাঁ, আপনার এইচটিটিপি সার্ভারগুলিতে এনগিনেক্স প্রক্সি অনুরোধ থাকতে পারে এবং তারপরে নিজেই এইচটিটিপিএস-এর মাধ্যমে ক্লায়েন্টদের প্রতিক্রিয়া জানাতে পারেন। এটি করার সময়, আপনি নিশ্চিত হয়ে উঠতে চাইবেন যে nginx <-> প্রক্সি সংযোগটি আপনার প্রত্যাশিত আক্রমণকারী যাকেই কমিয়ে আনার সম্ভাবনা নেই। নিরাপদ পর্যাপ্ত পদ্ধতির মধ্যে অন্তর্ভুক্ত থাকতে পারে:

  • একই হোস্টকে প্রক্সিং করা (যেমন আপনি করেন)
  • আপনার ফায়ারওয়ালের পিছনে অন্যান্য হোস্টকে প্রক্সিং করা

পাবলিক ইন্টারনেটে অন্য হোস্টের কাছে প্রক্সিং করা নিরাপদ পর্যাপ্ত হওয়ার সম্ভাবনা নেই।

প্রক্সি হিসাবে আপনি যে একই ওয়েবসভারটি ব্যবহার করছেন তা ব্যবহার করে একটি লেটস এনক্রিপ্ট শংসাপত্র পাওয়ার জন্য এখানে নির্দেশাবলী রয়েছে।

চলুন এনক্রিপ্ট থেকে আপনার প্রাথমিক শংসাপত্রের জন্য অনুরোধ করা হচ্ছে

স্থানীয় ডিরেক্টরি থেকে serverসাব-ডিরেক্টরিকে .well-knownপরিবেশন করার অনুমতি দেওয়ার জন্য আপনার ধারাটি সংশোধন করুন , যেমন:

server {
    listen 80;
    server_name sub.domain.com www.sub.domain.com;
    […]
    location /.well-known {
            alias /var/www/sub.domain.com/.well-known;
    }

    location / {
        # proxy commands go here
        […]
    }
}

http://sub.domain.com/.well-known এই যে চলো এনক্রিপ্ট সার্ভারগুলি এটি যে চ্যালেঞ্জগুলি জাগিয়েছে তার উত্তরগুলি সন্ধান করবে।

এর পরে আপনি ব্যবহার করতে পারেন certbot ব্যবহার আসুন এনক্রিপ্ট থেকে একটি শংসাপত্র অনুরোধ ক্লায়েন্ট webroot প্লাগইন (root পরিচয়ে):

certbot certonly --webroot -w /var/www/sub.domain.com/ -d sub.domain.com -d www.sub.domain.com

আপনার কী, শংসাপত্র এবং শংসাপত্র শৃঙ্খলা এখন ইনস্টল করা হবে /etc/letsencrypt/live/sub.domain.com/

আপনার শংসাপত্রটি ব্যবহার করার জন্য এনজিএনএক্স কনফিগার করছে

প্রথমে নতুন সার্ভারের এই ধারাটি তৈরি করুন:

server {
    listen 443 ssl;

    # if you wish, you can use the below line for listen instead
    # which enables HTTP/2
    # requires nginx version >= 1.9.5
    # listen 443 ssl http2;

    server_name sub.domain.com www.sub.domain.com;

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

    # Turn on OCSP stapling as recommended at 
    # https://community.letsencrypt.org/t/integration-guide/13123 
    # requires nginx version >= 1.3.7
    ssl_stapling on;
    ssl_stapling_verify on;

    # Uncomment this line only after testing in browsers,
    # as it commits you to continuing to serve your site over HTTPS
    # in future
    # add_header Strict-Transport-Security "max-age=31536000";

    access_log /var/log/nginx/sub.log combined;

    # maintain the .well-known directory alias for renewals
    location /.well-known {
        alias /var/www/sub.domain.com/.well-known;
    }

    location / {
        # proxy commands go here as in your port 80 configuration
        […]
    }
}

পুনরায় লোড করুন:

service nginx reload

যাচাই করুন যে HTTPS দ্বারা এখন পরিদর্শন করে কাজ করে https://sub.domain.comএবং https://www.sub.domain.comআপনার ব্রাউজার (এবং অন্য কোন ব্রাউজার সমর্থন আপনি নির্দিষ্টভাবে ইচ্ছুক) এবং পরীক্ষণ যে তারা শংসাপত্রে ত্রুটি প্রতিবেদন না।

প্রস্তাবিত: এছাড়াও raymii.org পর্যালোচনা করুন: এনগিনেক্সে শক্তিশালী এসএসএল সুরক্ষা এবং এসএসএল ল্যাবগুলিতে আপনার কনফিগারেশনটি পরীক্ষা করুন ।

(প্রস্তাবিত) এইচটিটিপিএস অনুরোধগুলি HTTPS এ পুনঃনির্দেশ করুন Red

একবার আপনি নিশ্চিত https://হয়ে গেলেন যে আপনার সাইটটি ইউআরএল সংস্করণ নিয়ে কাজ করে, কিছু ব্যবহারকারী অনিরাপদ বিষয়বস্তু পরিবেশন করার পরিবর্তে http://sub.domain.comসেগুলি সাইটের এইচটিটিপিএস সংস্করণে পুনর্নির্দেশ করে।

আপনার পুরো বন্দর 80 টি serverধারাটি এর সাথে প্রতিস্থাপন করুন :

server {
    listen 80;
    server_name sub.domain.com www.sub.domain.com;
    rewrite     ^   https://$host$request_uri? permanent;
}

আপনার এখন 443 কনফিগারেশনের বন্দরে এই লাইনটি অসুবিধা করা উচিত, যাতে ব্রাউজারগুলি সাইটের এইচটিটিপি সংস্করণটি চেষ্টা না করে দেখতেও ভুলে যায়:

add_header Strict-Transport-Security "max-age=31536000";

স্বয়ংক্রিয়ভাবে আপনার শংসাপত্র পুনর্নবীকরণ

আপনি এই কমান্ডটি (রুট হিসাবে) নতুন সার্টিফিকেট ব্যবহার করে (যা আপনার বিদ্যমান শংসাপত্রের মতো একই পথ পাবে) ব্যবহার করে সার্টিবোট এবং এনগিনেক্স পুনরায় লোড করার জন্য পরিচিত সমস্ত শংসাপত্রগুলি পুনর্নবীকরণ করতে ব্যবহার করতে পারেন:

certbot renew --renew-hook "service nginx reload"

সার্টবোট কেবলমাত্র than০ দিনের বেশি পুরানো শংসাপত্রগুলি পুনর্নবীকরণের চেষ্টা করবে, সুতরাং খুব সহজেই এই কমান্ডটি চালানো নিরাপদ (এবং প্রস্তাবিত!) এবং যদি সম্ভব হয় তবে স্বয়ংক্রিয়ভাবে এটি নিরাপদ । উদাহরণস্বরূপ, আপনি নিম্নলিখিত কমান্ডটি ভিতরে রাখতে পারেন /etc/crontab:

# at 4:47am/pm, renew all Let's Encrypt certificates over 60 days old
47 4,16   * * *   root   certbot renew --quiet --renew-hook "service nginx reload"

আপনি শুকনো রান দিয়ে নবায়নগুলি পরীক্ষা করতে পারেন, যা আপনার ডোমেনের সাথে যোগাযোগের সত্যিকারের পরীক্ষা করার জন্য চলুন এনক্রিপ্ট স্টেজিং সার্ভারগুলিতে যোগাযোগ করবে , তবে ফলাফল শংসাপত্রগুলি সংরক্ষণ করবে না :

certbot --dry-run renew

অথবা আপনি এটির সাথে কোনও প্রাথমিক পুনর্নবীকরণ বাধ্য করতে পারেন:

certbot renew --force-renew --renew-hook "service nginx reload"

দ্রষ্টব্য: আপনি নিজের পছন্দমতো রান শুকনো করতে পারেন তবে আসল পুনর্নবীকরণগুলি চলুন এনক্রিপ্টের হার সীমা সাপেক্ষে ।


আপনার soluton আমার জন্য কাজ করে না বলে মনে হচ্ছে। আমি মূলত একই কনফিগারেশন আছে। এটি goopen.tk এর জন্য কাজ করে তবে www.goopen.tk নয়
আলকো

3
@ আলকো, উত্তরের নির্দেশাবলী সঠিক এবং এই সমস্যাটি কভার করুন। certbotঅন্য কোনও সরঞ্জাম ব্যবহার করার সময় , আপনি কাজ করতে www এবং অ- www উভয় ফর্ম্যাটে আপনার ডোমেন নির্দিষ্ট করতে ভুলে যেতে পারবেন না।
পাওলো কোঘি

এর অধীনে location /.well-known, আপনাকে .well-knownপথ ছেড়ে যেতে হবে। ব্যবহার করুন alias /var/www/sub.domain.com, নাalias /var/www/sub.domain.com/.well-known
gldraphael

1
কেউ আমাকে কেন ব্যাখ্যা করতে পারেন আপনি "পুনর্লিখন ^ https: // $ হোস্ট $ অনুরোধ_উরিয়ালি? স্থায়ী;" এখানে "301 https: // $ সার্ভার_নাম $ অনুরোধ_রিউ করুন" এর পরিবর্তে;
জ্যাক্সলফুল

আমি দেখতে পেয়েছি যে আমার কাছে অবস্থানের পথের চারপাশে উদ্ধৃতিগুলি দরকার। location '/.well-known' {। এটি কোনও ভার্সন জিনিস বা কেবল আমার সেটআপ কিনা তা নিশ্চিত নয় তবে ক্ষেত্রে অন্য কেউ আটকে থাকলে।
ফ্রাঙ্ক ভি

2

হ্যাঁ, আপনি nginxhttps এর শেষ পয়েন্ট হিসাবে ব্যবহার করতে পারেন এবং HTTP এর মাধ্যমে ব্যাকএন্ডে সহযোগিতা করতে পারেন । উদাহরণস্বরূপ আমার কনফিগারেশন:

server {
        server_name host;
        listen 443 ssl;
...
 location /svn/ {
            auth_ldap off;

            proxy_set_header Host $host;
            proxy_set_header X-Real-IP $remote_addr;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
            proxy_set_header X-Forwarded-Proto $scheme;

            proxy_pass http://localhost:1080/svn/;
            proxy_redirect http://localhost:1080/ https://host/;
        }
...
}

তবে যেমনটি আমি জানি, আসুন এনক্রিপ্টের মাধ্যমে আপনি শংসাপত্রটি পাওয়ার সময় আপনাকে সমস্ত সাবডোমেনগুলি নির্দেশ করতে হবে এবং যদি এটি কোনও সমস্যা হয়ে থাকে তবে আপনি https://host/serviceপরিবর্তে url বেছে নিনhttps://service.host

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.