nginx: কীভাবে একটি ঠিক নামের এসএসএল সার্ভার ব্লককে সমস্ত এসএসএলের ক্যাচল হিসাবে অভিনয় করা থেকে রোধ করা যায়


17

অনেক ভার্চুয়াল সার্ভার সহ আমার একটি ওয়েব সার্ভার রয়েছে। যার মধ্যে ১ টি এসএসএল। সমস্যাটি হ'ল, এসএসএলের জন্য কোনও ক্যাচল সার্ভার ব্লক শোনার জন্য নয়, অন্য সাইটগুলিতে কোনও https অনুরোধটি 1 এসএসএল ব্লক দ্বারা পরিবেশন করা হয়েছে।

আমার কনফিগারেশনটি মূলত: এরকম দেখাচ্ছে:

# the catch all
server {
  listen 80 default;

  # I could add this, but since I have no default cert, I cannot enable SSL,
  # and this listen ends up doing nothing (apparently).
  # listen 443; 

  server_name _;
  # ...
}

# some server
server {
  listen 80;
  server_name server1.com;
  # ...
}

# some other server ...
server {
  listen 80;
  server_name server2.com;
  # ...
}

# ... and it's https equivalent
server {
  listen 443;
  ssl on;
  server_name server2.com;
  # ...
}

এখন 443 এর জন্য কোনও ডিফল্ট শ্রোতা নেই, এই জাতীয় অনুরোধটি https ব্লকটির https://server1.comদ্বারা পরিবেশন করা হবে server2.com। এই জন্য যুক্তিবিজ্ঞান অনুসরণ server_nameমধ্যে ডক্স।

যদি কোনও মিল না থাকে তবে কনফিগারেশন ফাইলে একটি সার্ভার {...} ব্লক নিম্নলিখিত ক্রমের ভিত্তিতে ব্যবহার করা হবে:

  1. [ডিফল্ট | ডিফল্ট_সেসভার] হিসাবে চিহ্নিত একটি মিলে শোনা নির্দেশিকা সহ সার্ভার ব্লক
  2. মিলে শোনার নির্দেশাবলী সহ প্রথম সার্ভার ব্লক (বা অন্তর্ভুক্ত শোনার 80%)

এই সমস্যার জন্য পছন্দসই সমাধান কী? আমি কীভাবে আমার সমস্ত সার্ভার ব্লক ধরার জন্য ডামি সার্টিফিকেট স্থাপন করতে পারি যাতে আমি 443-এ শুনতে পারি এবং খারাপ অনুরোধগুলি পরিচালনা করতে পারি? এমন কোনও প্যারামিটার আছে যা সম্পর্কে আমি অবগত নই যা একটি সঠিক হোস্টনামের সাথে ম্যাচ জোর করে server?


লোকেরা যখন https ব্যবহার করে অন্য সাইটগুলিতে অ্যাক্সেস করার চেষ্টা করে তখন আপনি কী হতে চান?
ডেভিড শোয়ার্জ

আদর্শভাবে হয় আমি nginx চাইলে https পরিবেশন করা মোটেও না হয় যতক্ষণ না হোস্টনামটি মেলে, বা এটি একই হোস্টে HTTP- এ পুনঃনির্দেশিত করতে।
1311407

উত্তর:


9

আদর্শভাবে হয় আমি nginx চাইলে https পরিবেশন করা মোটেও না হয় যতক্ষণ না হোস্টনামটি মেলে, বা এটি একই হোস্টে HTTP- এ পুনঃনির্দেশিত করতে।

না হয় সম্ভব। Https://foo.example.com/ এ যাওয়া কোনও ক্লায়েন্টের সংযোগটি তার কোনও একটি নাম হিসাবে "foo.example.com" সহ একটি এসএসএল শংসাপত্র ছাড়া আর কিছু দ্বারা গৃহীত হতে পারে না। এসএসএল সংযোগ গ্রহণ না করা পর্যন্ত পুনর্নির্দেশ করার কোনও সুযোগ নেই।

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

এসএসএল এবং এইচটিটিপি ভার্চুয়াল হোস্টিং কেবল ভাল একসাথে খেলবেন না।


ডকস পড়ার পরে এটিই জড়ো হয়েছিল। আমি কেবল আশা করছিলাম যে আমি কিছু মিস করেছি। আমি মোটেও এসএসএল সতর্কতা সম্পর্কে চিন্তা করি না। আমি কেবল চাই না যে কেউ সার্ভার 1.কম প্রবেশ করুক এবং নিজেরাই সার্ভার 2.com এর হোমপৃষ্ঠায় সন্ধান করুক ... কোন অনুরোধ গ্রহণ না করার জন্য এনজিনেক্সকে বলার সত্যিই কোন উপায় নেই ?
1311407

যদি এটি অনুরোধটি গ্রহণ না করে তবে প্রথম সাইটটি কাজ করবে না। ব্যবহারকারী কোন সাইটে অ্যাক্সেস করার চেষ্টা করছেন তা জানার জন্য এটির অনুরোধটি গ্রহণ করতে হবে।
ডেভিড শোয়ার্টজ

2
" Foo.example.com এ যাওয়া ক্লায়েন্টের সংযোগটি তার নামগুলির মধ্যে একটি হিসাবে" foo.example.com "সহ একটি এসএসএল শংসাপত্র ব্যতীত অন্য কোনও কারণে গ্রহণ করা যাবে না।" - এটি সঠিক নয়, সার্ভারটি অনুরোধটি গ্রহণ করবে এবং অনুরোধ করা ডিএন সার্ভার শংসাপত্র ডিএন এর সাথে মেলে তা যাচাই করা ক্লায়েন্টের উপর নির্ভর করে up
কলিনম

4

একমাত্র উপায় হ'ল একটি স্ব-স্বাক্ষরিত SSL শংসাপত্র তৈরি করা এবং আগত https অনুরোধগুলিতে নিয়ন্ত্রণ অর্জনের জন্য এটি ব্যবহার করুন। আপনি এই পোস্টে বর্ণিত কয়েকটি সাধারণ পদক্ষেপে আপনার স্ব-স্বাক্ষরিত এসএসএল শংসাপত্র তৈরি করতে পারেন ।

ধরা যাক আপনি সার্ভার.সিআরটি ফাইলের একটি স্ব স্বাক্ষরিত শংসাপত্র তৈরি করেন। এরপরে আপনি আপনার এনজিএনএক্স কনফিগারেশনে নিম্নলিখিতগুলি সংযোজন করবেন:

server {
    listen  443;

    ssl    on;
    ssl_certificate         /etc/nginx/ssl/server.crt;
    ssl_certificate_key     /etc/nginx/ssl/server.key;

    server_name server1.com;

    keepalive_timeout 60;
    rewrite ^       http://$server_name$request_uri? permanent;
}

তবুও আপনি ব্রাউজারটি এসএসএল সতর্কতা বার্তাটি পাবেন, তবে এরপরে যা ঘটেছিল তাতে অন্তত আপনার নিয়ন্ত্রণ থাকবে।


1
আমি এটার সাথে একমত. অবিশ্বস্ত শংসাপত্রগুলি সম্পর্কে একটি সতর্কতা বার্তা দেখানোর ক্ষেত্রে ব্রাউজারের সমস্যা রয়েছে, তবে আপনি যদি কেবলমাত্র https: // <ipdadress> এ গিয়ে ব্যবহারকারীদের আপনার সত্যিকারের vhosts এর জন্য সমান অবৈধ শংসাপত্রের সার্ভার করতে বাধা দেওয়ার চেষ্টা করছেন (অবৈধ কারণ হোস্টনামটি মেলে না), তবে আপনি তাদেরকে একটি অবৈধ স্ব-স্বাক্ষরিত ডামি শংসাপত্র সরবরাহ করা ভাল off এই ধরণের তাদের বলে "এখানে দেখার মতো কিছুই নেই, এমনকি অন্য হোস্টের শংসাপত্রও নেই"।
ড্যানিয়েল এফ

2

একটি ক্যাচ-অল সার্ভার ব্লক যুক্ত করুন এবং স্থিতি কোড 444 ফেরান It

server {
    listen 443 default_server ssl;
    server_name _;
    return 444;
}

1

আজকাল আপনি টিএলএস সার্ভারের নাম ইন্ডিকেশন এক্সটেনশন (এসএনআই, আরএফসি 6066) ব্যবহার করতে পারেন। এইচটিটিপিএস শ্রোতা উপযুক্ত শংসাপত্র দেওয়ার আগে ডোমেন নামটি স্বীকৃতি দিতে সক্ষম হবে।

এর অর্থ হ'ল আপনার সমস্ত ডোমেনের জন্য আপনার শংসাপত্র থাকতে হবে এবং যখন অন্য কোনও ডোমেন সনাক্ত করতে এসএনআই ব্যবহার করা হয় আপনি সার্ভারের নামটি এককটির সাথে মিলে না গেলে HTTP 301 পুনঃনির্দেশ HTTP নন-এনক্রিপ্ট করা সংস্করণে ব্যবহার করতে পারবেন জোড়া লাগানো.

Nginx ডকুমেন্টেশনে sni সম্পর্কে আরো তথ্য উপলব্ধ http://nginx.org/en/docs/http/configuring_https_servers.html


0

অনুরোধ করা হোস্টনামটি http {}ব্লকের বৈধ হোস্টনামে মানচিত্র করুন :

map $ssl_server_name $correct_hostname_example {
  default 0;
  example.com 1;
  www.example.com 1;
}

এবং তারপরে server {}ব্লকটিতে ভুল হোস্টনামের সাথে সংযোগগুলি হত্যা করুন:

if ($correct_hostname_example = 0) {
  return 444;
}

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

$ssl_server_nameপরিবর্তনশীল nginx 1.7 বা তার অধিক উপস্থিতি রয়েছে।


0

এইভাবে আমি সমস্যার সমাধান করেছি:

  1. স্ব-স্বাক্ষরিত শংসাপত্র তৈরি করুন:

openssl req -nodes -x509 -newkey rsa:4096 -keyout self_key.pem -out self_cert.pem -days 3650

  1. এনগিনএক্স যেখানে এটি সন্ধান করতে পারে তা অনুলিপি করুন:

cp self*.pem /etc/nginx/ssl/

  1. একটি ক্যাচ-অল রুট সেট আপ করুন:
server {
    listen 443 default_server ssl;

    ssl on;
    ssl_certificate /etc/nginx/ssl/self_cert.pem;
    ssl_certificate_key /etc/nginx/ssl/self_key.pem;

    return 301 http://$host;
}

এটি কী করবে: এটি এমন কোনও সার্ভারে আপনাকে একটি সতর্কতা দেবে (এর কোনও উপায় নয়) যার নিজস্ব শংসাপত্র নেই, তবে সতর্কতাটি ভুল শংসাপত্রের নামটি বলবে না say যদি ব্যবহারকারীরা "যাইহোক যাইহোক" ক্লিক করে তবে সেগুলি তারা টাইপ করা সাইটের নন-এসএসএল সংস্করণে পুনঃনির্দেশিত হবে।

সতর্কতা :

যদি আপনার এসএলএল-সক্ষম ওয়েবসাইটটি কেবলমাত্র সংজ্ঞায়িত করে www.example.com(এবং না example.com) তবে আপনার ক্যাপ-সমস্ত রুটটি https://example.comস্ব-স্বাক্ষরিত শংসাপত্র এবং সংশ্লিষ্ট সতর্কতার সাথে পরিবেশন করবে ।


-2

পুনঃনির্দেশ HTTP:

server {
    listen       443;
    server_name  *.com;
    rewrite        ^ http://$host$request_uri? permanent;
}    

404 Return ফেরান

server {
    listen       443;
    server_name  *.com;
    return 404;
}    

1
এটি এখনও কোনও এসএসএল সতর্কতার ফলে ঘটবে, যেহেতু কোনও এসটিটিপি পুনর্নির্দেশ হওয়ার আগেই এসএসএল টানেলটি স্থাপন করা দরকার। ডেভিড শোয়ার্টজের গৃহীত উত্তর দেখুন।
সিজেসি
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.