Https- র জন্য সঠিকভাবে একটি "ডিফল্ট" nginx সার্ভার সেট আপ করা


70

আমার একই মেশিনে বেশ কয়েকটি সার্ভার চলছে, কিছু কেবলমাত্র HTTP সহ, কিছু HTTP এবং https উভয় দিয়ে। মূল কনফিগারেশন ফাইল থেকে অন্তর্ভুক্ত পৃথক ফাইলে সংজ্ঞায়িত বেশ কয়েকটি সার্ভার ব্লক রয়েছে।

আমি HTTP- র জন্য একটি "ডিফল্ট" সার্ভার সেট আপ করেছি যা অনুরোধগুলির জন্য একটি জেনেরিক "রক্ষণাবেক্ষণ পৃষ্ঠা" পরিবেশন করবে যা অন্য কনফিগার ফাইলে অন্য কোনও সার্ভার_নামের সাথে মেলে না। Http ডিফল্ট সার্ভারটি প্রত্যাশিত হিসাবে কাজ করে, এটি সার্ভার_নাম "_" ব্যবহার করে এবং এটি অন্তর্ভুক্তের তালিকায় প্রথম প্রদর্শিত হয় (কারণ আমি লক্ষ্য করেছি যে সার্ভারের জুড়ে সদৃশ সার্ভার_নামের ক্ষেত্রে, প্রথম যেটি প্রদর্শিত হবে তা ব্যবহৃত হবে) is এটি দুর্দান্ত কাজ করে।

আমি একই সঠিক সার্ভার ব্লকটি প্রত্যাশা করব (কেবল "শোনুন 80 ডিফল্ট_সার্ভার" "শুনুন 443 ডিফল্ট_সরভার" এবং পৃষ্ঠার পরিবর্তে "রিটার্ন 444" সরবরাহ করার জন্য) তবে তা না হয়। পরিবর্তে, এটি প্রদর্শিত হয় যে নতুন ডিফল্ট https সার্ভারটি প্রকৃতপক্ষে আগত সমস্ত https সংযোগগুলি দখল করছে এবং সেগুলি ব্যর্থ করে দিচ্ছে, যদিও অন্যান্য সার্ভার ব্লকগুলিতে আগত অনুরোধগুলির জন্য আরও উপযুক্ত সার্ভার_নাম রয়েছে। নতুন ডিফল্ট https সার্ভার অপসারণের ফলে আধা-সঠিক আচরণ পুনরায় শুরু হবে: https সহ সমস্ত ওয়েবসাইট সঠিকভাবে লোড হবে; তবে https ব্যতীত সমস্ত ওয়েবসাইটগুলিকে অন্তর্ভুক্ত করা ফাইলগুলির মধ্যে প্রথম https সার্ভারে স্থানান্তরিত করা হবে (যা ডক্স অনুসারে, যদি কোনও "ডিফল্ট_সার্ভার" প্রদর্শিত না হয়, তবে প্রদর্শিত প্রথম সার্ভার ব্লকটি "ডিফল্ট" হবে)।

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

এখানে আমার "ডিফল্ট সার্ভার" রয়েছে। এইচটিটিপি অন্যান্য সার্ভারগুলি না ভেঙে কাজ করে। এইচটিপিএস অন্যান্য সার্ভারগুলি ভেঙে দেয় এবং সমস্ত ব্যবহার করে।

server {
    listen 443 ssl default_server;
    server_name _;

    access_log /var/log/nginx/maintenance.access.log;
    error_log /var/log/nginx/maintenance.error.log error;

    return 444;
}

server {
    listen *:80 default_server;
    server_name _;
    charset utf-8;

    access_log /var/log/nginx/maintenance.access.log;
    error_log /var/log/nginx/maintenance.error.log error;

    root /home/path/to/templates;

    location / {
        return 503;
    }

    error_page 503 @maintenance;

    location @maintenance {
        rewrite ^(.*)$ /maintenance.html break;
    }
}

আপনারা কেউ কি দেখতে পাচ্ছেন যে এখানে কী ভুল হতে পারে?

ssl  https  nginx 

উত্তর:


27

আপনার "ডিফল্ট" https ব্লকে কোনও ssl_cerર્ટate বা ssl_cerર્ટate_key সংজ্ঞায়িত করা নেই। যদিও আপনি এই ডিফল্ট দৃশ্যের জন্য সত্যিকারের কী বা না পেয়েছেন, আপনার এখনও একটি কনফিগার করতে হবে অন্যথায় এনজিনেক্সের আপনার বর্ণনা করা অনাকাঙ্ক্ষিত আচরণ থাকবে।

* এর একটি সাধারণ নামের সাথে একটি স্ব-স্বাক্ষরিত শংসাপত্র তৈরি করুন এবং এটি আপনার কনফিগারেশনে প্লাগ করুন এবং এটি আপনার ইচ্ছামত কাজ করা শুরু করবে।

এই সেট আপের অধীনে "ডিফল্ট" আচরণটি হ'ল ব্রাউজারটি এমন একটি সতর্কতা পায় যা শংসাপত্রের উপর আস্থা রাখতে পারে না, যদি ব্যবহারকারী ব্যতিক্রম হিসাবে শংসাপত্র যোগ করে তবে সংযোগটি এনজিনেক্স দ্বারা বাদ দেওয়া হবে এবং তারা তাদের ব্রাউজারের ডিফল্ট দেখতে পাবে browser "সংযোগ করা যায়নি" ত্রুটি বার্তা।


1
আমি এটি চেষ্টা করেছি কিন্তু এটি এখনও কার্যকর হয় না: আইপি-র সমস্ত এসএসএল অনুরোধগুলি আমার অন্যান্য এসএসএল হোস্টে যায়। আমি চেষ্টা করতে পারে অন্য কিছু?
মাইকেল হার্টল

22

আমি এনজিএনএক্স সহ একটি আইপি-তে একটি শেয়ার্ড ডেডিকেটেড হোস্টিং কনফিগার করতে সক্ষম হয়েছি। অজানা ডোমেনগুলির আগত জন্য ডিফল্ট HTTP এবং HTTPS 404 সরবরাহ করছে।

1 - একটি ডিফল্ট অঞ্চল তৈরি করুন

যেহেতু nginx vhosts ascii ক্রমে লোড করছে, আপনার নিজের মধ্যে একটি 00-defaultফাইল / প্রতীকী লিঙ্ক তৈরি করা উচিত /etc/nginx/sites-enabled

2 - ডিফল্ট অঞ্চলটি পূরণ করুন

আপনার 00-defaultডিফল্ট ভোস্টগুলি পূরণ করুন । আমি যে অঞ্চলটি ব্যবহার করছি তা এখানে:

server {
    server_name _;
    listen       80  default_server;
    return       404;
}


server {
    listen 443 ssl;
    server_name _;
    ssl_certificate /etc/nginx/ssl/nginx.crt;
    ssl_certificate_key /etc/nginx/ssl/nginx.key;
    return       404;
}

3 - স্ব স্বাক্ষরিত শংসাপত্র, পরীক্ষা এবং পুনরায় লোড তৈরি করুন

এতে আপনাকে স্ব স্বাক্ষরিত শংসাপত্র তৈরি করতে হবে /etc/nginx/ssl/nginx.crt

একটি ডিফল্ট স্ব স্বাক্ষরিত শংসাপত্র তৈরি করুন:

sudo openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout /etc/nginx/ssl/nginx.key -out /etc/nginx/ssl/nginx.crt

কেবল একটি অনুস্মারক:

  • পুনরায় লোড / পুনঃসূচনা করার আগে nginx কনফিগারেশন পরীক্ষা করুন: nginx -t
  • একটি আনন্দ পুনরায় লোড করুন: sudo service nginx reload

আশা করি এটা সাহায্য করবে.


2
কোনও অনিরাপদ সাইট পরিদর্শন করার ব্রাউজার সতর্কতা সমাধান করে না।
gdbj

4
কোনও ক্যাচ-অলকে অবশ্যই কোনও ডোমেনের সাথে মিলে যাওয়ার কারণে সমাধান করা যাচ্ছে না। কোনও এসএসএল সমস্ত ডোমেন ওয়াইল্ডকার্ড করতে পারে না। কল্পনা করুন আপনি যদি আপনার সার্ভারে গুগল.ফ্রের ঠিকানাটি ফাঁকি দিচ্ছেন, আপনি নিজের সার্ভারকে google.fr হিসাবে প্রমাণ করতে পারবেন be এটি একটি গুরুতর সুরক্ষা ইস্যু হবে :(
যদি

হ্যাঁ, আমি বুঝতে পারি যে এটি উপলব্ধি করে। দুর্ভাগ্যক্রমে ক্রোমে, 404 পৃষ্ঠা দেখার আগে আপনাকে একটি ভীতিজনক সতর্কতা উপস্থাপিত করা হয়েছে যা সার্ভারকে ট্র্যাফিক কেবল অস্বীকার করার চেয়ে খারাপ। এটিকে দেখে মনে হচ্ছে সার্ভারটি ভুল কনফিগার করা হয়েছে।
gdbj

আপনাকে অনেক ধন্যবাদ. এটি আমার পক্ষে কাজ করেছিল, কেবলমাত্র default_server443 শোনার জন্য আমাকে যুক্ত করতে হয়েছিল এবং আমি আইপিভি 6 ঠিকানা [::]: 80 এবং [::]: 443 যুক্ত করেছি default_server
chmike

16

আমরা মূলত যে কোনও মূল্যে এড়াতে চাই যে আমাদের কনফিগ ফাইলে প্রথম সার্ভার সংজ্ঞাটি এসএসএল সংযোগগুলির জন্য ক্যাচ-অল-সার্ভার হিসাবে পরিবেশন করা হয়েছে। আমরা সকলেই জানি যে এটি তা করে (HTTP এর বিপরীতে এবং ডিফল্ট_সার্ভার কনফিগারেশন যা দুর্দান্তভাবে কাজ করে) ব্যবহার করে।

এটি এসএসএলের জন্য ঘোষিতভাবে অর্জন করা যায় না (এখনও) সুতরাং আমাদের এটি একটি আইএফ দিয়ে কোড করতে হবে ...

ভেরিয়েবলটি $hostঅনুরোধ লাইন বা http শিরোনাম থেকে হোস্টের নাম। ভেরিয়েবলটি $server_nameএখনই আমরা আছি যে সার্ভার ব্লকের নাম।

সুতরাং যদি এই দুটি সমান না হয় তবে আপনি অন্য হোস্টের জন্য এই এসএসএল সার্ভার ব্লক পরিবেশন করেছেন যাতে এটি অবরুদ্ধ করা উচিত।

কোডটিতে আপনার সার্ভারের আইপি অ্যাড্রেসের নির্দিষ্ট উল্লেখ থাকতে পারে না তাই এটি পরিবর্তন ছাড়া অন্য সার্ভার কনফিগারেশনের জন্য সহজেই ব্যবহার করা যেতে পারে।

উদাহরণ:

server {
    listen 443 ssl http2;
    listen [::]:443 ssl http2;

    ###
    ### Section: SSL

    #
    ## Check if this certificate is really served for this server_name
    ##   http://serverfault.com/questions/578648/properly-setting-up-a-default-nginx-server-for-https
    if ($host != $server_name) {
        #return 404 "this is an invalid request";
        return       444;
    }

    ...

আপনি কি কি ব্যাখ্যা করতে পারেন listen [::]:443 ssl http2;? আমি এটির জন্য ডকুমেন্টেশন খুঁজে পেতে সমস্যা হচ্ছে।
অ্যান্ড্রু ব্রাউন

আমি মনে করি আমি এটি খুঁজে পেয়েছি, কেবল কী অনুসন্ধান করতে হবে তা জানতে হবে। আইপিভি 4 এবং আইপিভি 6 নির্দেশিকা।
অ্যান্ড্রু ব্রাউন

7

র‌ডমিল্লা মুস্তফার উত্তরের বিষয়ে আরও বিস্তারিত জানাতে:

Nginx সার্ভার_নামের মিলের জন্য 'হোস্ট' শিরোনাম ব্যবহার করে। এটি টিএলএস এসএনআই ব্যবহার করে না। এর অর্থ হ'ল কোনও এসএসএল সার্ভারের জন্য, এনজিনেক্স অবশ্যই এসএসএল সংযোগ গ্রহণ করতে সক্ষম হবেন, যা শংসাপত্র / কী থাকাতে উত্পন্ন হয়। শংসাপত্র / কী কোনও যেমন, স্ব-স্বাক্ষরিত হতে পারে।

ডকুমেন্টেশন দেখুন

সুতরাং, সমাধানটি হ'ল:

server {
    server_name _;
    listen 80 default_server;
    listen 443 ssl default_server;

    ## To also support IPv6, uncomment this block
    # listen [::]:80 default_server;
    # listen [::]:443 ssl default_server;

    ssl_certificate <path to cert>;
    ssl_certificate_key <path to key>;
    return 404; # or whatever
}

আমি মনে করি এটি গ্রহণযোগ্য উত্তর হওয়া উচিত। অনেক ধন্যবাদ.
সামগ্রিক

2

আমার চেয়ে কেও এর চেয়ে বেশি চুল হারিয়েছেন তার কাছে (আজকের দিনে পুরো দিনটি কাটিয়েছেন)। আমি প্রায় সব কিছু চেষ্টা করে দেখেছি এবং অবশেষে যে জিনিসটি এটি সঠিকভাবে কাজ করেছে তা হ'ল এই নির্বোধ লাইন:

ssl_session_tickets off;

ইফনোটের উত্তরের উপর ভিত্তি করে আমার কাজের উদাহরণটি হ'ল:

server {
    listen 443 ssl http2 default_server;
    listen [::]:443 ssl http2 default_server;
    server_name _;

    ssl_certificate /etc/nginx/ssl/nginx.crt;
    ssl_certificate_key /etc/nginx/ssl/nginx.key;
    ssl_session_tickets off;

    return 404;
}

কেন এটি প্রয়োজনীয় ছিল তা আমার কোনও ধারণা নেই, আমি এ থেকে উত্পন্ন একমাত্র নীতিটি হ'ল যখন আমরা তাকে যা চান তা না দিলে এনজিনেক্স খুব অদ্ভুত আচরণ করে।


1
তুমি একজন কিংবদন্তী.
নিজার ব্লন্ড

1

আপনি যদি একেবারে নিশ্চিত হতে চান, তবে হোস্টগুলির জন্য পৃথক আইপি ঠিকানা ব্যবহার করুন যা HTTPS এবং হোস্টগুলির উত্তর দেওয়া উচিত নয় which এটি "অবৈধ শংসাপত্র" ব্রাউজার সতর্কতা সমস্যাও সমাধান করে।

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