এসএসএল ক্লায়েন্ট শংসাপত্র প্রমাণীকরণের সাথে ব্যাক-এন্ডে এনগিনেক্স প্রক্সি


14

আমার দুটি সার্ভার রয়েছে, দুজনেরই এনগিনেক্স রয়েছে। সার্ভার এ 443 শুনছে এবং এটি ক্লায়েন্ট এসএসএল শংসাপত্রের সাথে প্রমাণীকরণের জন্য কনফিগার করা হয়েছে।

সার্ভার বি এর একটি অভ্যন্তরীণ প্রক্রিয়া রয়েছে যা nginx এর মাধ্যমে সার্ভার এ এর ​​সাথে যোগাযোগ করতে হবে।

আমি সার্ভার বি তে এনগিনেক্স কনফিগার করতে চাই যা ৮০৮০ (কোনও এনক্রিপশন নয়, যেহেতু এটি সমস্ত স্থানীয় যোগাযোগ) এবং সার্ভারএ: ৪৪৩ এ প্রক্সি_পাস শুনবে।

প্রশ্নটি হল আমি কীভাবে ক্লায়েন্ট শংসাপত্র ইনজেক্ট করব? আমি এমন কোনও প্রক্সি_এক্সএক্সএক্সএক্সএক্সএক্স ফাংশন পাইনি।

আমি জানি যে সকেটের সাথে এর সমতুল্য কীভাবে তৈরি করা যায় তবে আমার প্রয়োজনটি এনজিএনএক্স ব্যবহার করা।


2
এনজিএনএক্সের প্রক্সি মডিউলের দিকনির্দেশগুলি দেখে, মনে হয় যে কোনও এনজিঞ্জ সার্ভারটি প্রমাণীকরণের জন্য কোনও সার্টি ব্যবহার করা সম্ভব নয়: nginx.org/en/docs/http/ngx_http_proxy_module.html অ্যাপাচি সেই বৈশিষ্ট্যটিকে সমর্থন করে।
নিউটিটিএক্স

এটিই আমি ভয় পেয়েছিলাম ... কোনও কাস্টম মডিউল বা এই কাজটি করতে পারে এমন কোনও ধারণা থাকলে? সেই ধরণের বৈশিষ্ট্যটির অস্তিত্ব আছে!
Bastien974

আমি অ্যাপাচি থেকে এনজিন্সে ( github.com/nhnc-nginx/apache2nginx ) কনফিগারেশন ফাইলগুলি স্থানান্তরিত করার জন্য একটি ইউটিলিটি পেয়েছি , সুতরাং আমি এটি ডাউনলোড করেছি, একটি ডামি অ্যাপাচি.কনফ তৈরি করেছি এবং এটি সরঞ্জামের মাধ্যমে পাস করেছি, তবে আমি এই ফলাফল পেয়েছি :### Section 2: Unconverted directives ### # Flag Description # [S] Unsupported directives. # In conf file: dummy.conf # Line 32: SSLProxyMachineCertificateFile /path/to/cert (mod_ssl.c) # [S] SSLProxyMachineCertificateFile: No relevant directive in Nginx.
নিউটিটিএক্স

উত্তর:


21

ক্লায়েন্টের শংসাপত্রের বিবরণ দিয়ে যাওয়ার পক্ষে কি যথেষ্ট?

আপনি যোগ করতে পারেন

proxy_set_header X-SSL-CERT $ssl_client_escaped_cert;

আপনার কনফিগারেশনে এবং তারপরে শংসাপত্রের তথ্যটি এক্স-এসএসএল-সার্ট শিরোনামের মাধ্যমে সার্ভার বি-তে উপলব্ধ।


1
হিসাবে comented এখানে , যদি আপনার ব্যাকএন্ড প্রতিস্থাপন করতে পারেন সচেতন হতে \tসঙ্গে \nএকবার পরেছি এই হেডার থেকে।
lucasvc

3
এনজিনেক্সের ডকুমেন্টেশন অনুসারে , $ssl_client_certভেরিয়েবলটি হ্রাস করা হয়; $ssl_client_escaped_certপরিবর্তনশীল পরিবর্তে ব্যবহার করা উচিত।
দুবেক

1
@ ডুবেক ভাল ধরা, আমি এই জাতীয় ক্ষেত্রে সরাসরি উত্তর আপডেট করব।
ক্রিস স্ট্রাইজিনস্কি

আমি এই সমাধানটি চেষ্টা করে যাচ্ছি, তবে শংসাপত্রের বৈধতা চালু থাকলে এটি কেবলমাত্র পাসপোর্টটি দিয়ে যাচ্ছে। আমি এটি চালু করতে চাই না, বৈধতাটি সেট না করে এটিকে কাজ করার কোনও উপায় আছে কি?
জুহাকো

5

স্পষ্টতই, আপনি এটি যা খুঁজছেন: http://nginx.org/en/docs/http/ngx_http_proxy_module.html#proxy_ssl_certificate সংস্করণ 1.7.8 থেকে পাওয়া যায়।

location / {
    ...
    proxy_pass     the_other_nginx;
    proxy_ssl_certificate  the_certificate.pem;
    ...
}

1
এটা ভুল. এটি ব্যাকএন্ডে অনুরোধগুলির জন্য ব্যবহৃত হওয়া প্রক্সিটিতে একটি ক্লায়েন্ট শংসাপত্র নির্ধারণ করে। তবে জিজ্ঞাসা করা হয়েছে, বলেছে যে এই যোগাযোগটি কেবল একটি স্থানীয়কে এনক্রিপ্ট করা হয়েছে, তাই ক্লায়েন্টের শংসাপত্রের কোনও পরীক্ষণ নেই। জুইলকিন্সের উত্তরটি ভাল কাজ করে।
কেনিয়াকর্ন কেটসম্বুট

@ কেন্যাকর্নকেটসম্বুট আমার বিশ্বাস আপনি প্রশ্নটি ভুলভাবে পড়েছেন। সার্ভার বি এর কোনও এনক্রিপশন নেই (8080 এ শোনা) তবে সার্ভার এ-তে যোগাযোগ করতে হবে (443 এ এনক্রিপশন সহ শুনা হচ্ছে)। সুতরাং খ অনুমোদনের জন্য ক্লায়েন্টের শংসাপত্র A তে প্রেরণ করা দরকার। এটি সম্পাদন করতে আপনি প্রক্সি_এসএসএল_সেসিফেট ব্যবহার করতে পারেন। জুইলকিন্স উত্তর দেয়, বি কে দেওয়া শংসাপত্রটি ফরোয়ার্ড করবে উভয়ই আপনার প্রয়োজনের উপর নির্ভর করে কাজ করতে পারে।
নিকোলাস মালব্রান

হাই নিকোলাস আমি বলার চেষ্টা করছিলাম: সার্ভার বি যদি এনক্রিপশন ব্যবহার না করে (8080 পোর্টে) এটি এইচটিটিপিএস / এসএসএল জাতীয় কোনও জিনিস ব্যবহার না করে তবে আপনি এটিকে কল করেন। ক্লায়েন্ট শংসাপত্রগুলি এসএসএলের একটি অংশ, সুতরাং এই অংশটি সার্ভার বি দ্বারা করা যাবে না বি কোনও ক্লায়েন্ট শংসাপত্র প্রেরণ বা গ্রহণ করতে পারে না।
কেনিয়াকর্ন কেটসম্বুট

1
আমি এনজিন্স পেয়েছি: [উত্সর্গ] কোনও "প্রক্সি_এসএল_সেসিফেট_কি" শংসাপত্রের জন্য "সার্টিফিকেট / রোরো_স্লায়েন্ট.পিএম" এনজিনেক্সের জন্য সংজ্ঞায়িত করা হয়নি: কনফিগারেশন ফাইল /etc/nginx/nginx.conf পরীক্ষাটি ব্যর্থ হয়েছিল যখন আমি 1.8.0 দিয়ে চেষ্টা করেছি
ওল্ফগ্যাং ফাহল

4

সমস্যাটি মূলত সংস্করণ নির্ভরতা বলে মনে হচ্ছে। উবুন্টু 14.04 এলটিএসে ডিফল্ট এনগিনেক্স একটি পুরানো 1.4। প্রথমে আপনাকে পিপিএ ভিত্তিক সংস্করণ ইনস্টল করতে হবে

https://leftshift.io/upgrading-nginx-to-the-latest-version-on-ubuntu-servers

এটি কীভাবে এটি করবেন তা দেখায়:

sudo add-apt-repository ppa:nginx/stable
sudo aptitude safe-upgrade

আপনার সাথে শেষ করা উচিত:

nginx -v
nginx version: nginx/1.8.0

@ Xatr0z উত্তর থেকে কনফিগারেশন https://serverfault.com/a/636455/162693 http://www.senginx.org/en/index.php/Proxy_HTTPS_Client_Cerificationsate- এ নির্দেশ করে:

কর্মহীন প্রস্তাব

backend {
    server some-ip:443;
}

server {
    listen 80;


    location / {
        proxy_ssl_certificate        certs/client.crt;
        proxy_ssl_certificate_key    certs/client.key;


        proxy_pass https://backend;
    }
}

1.8.0 এর সাথে বাক্সটির বাইরে কাজ করে না। এটি সম্ভবত একটি ইঙ্গিত হিসাবে বোঝানো হয়েছে এবং এটি কনফিগারেশন ফাইল হিসাবে ব্যবহার করা হবে না বা অন্য সংস্করণের উপর নির্ভর করে।

আমি একটি অ্যাপাচি 2 ভিত্তিক ব্যাকএন্ড সার্ভার এ এসএসএল এবং স্ব-স্বাক্ষরিত ক্লায়েন্ট শংসাপত্র সক্ষম সহ পরীক্ষা করছি। অ্যাপাচি কনফিগারেশন এসএসএলপিশনগুলি এতে সেট করা আছে:

SSLOptions +ExportCertData +FakeBasicAuth + StdEnvVars

এটি পরিস্থিতি ডিবাগিংকে আরও সহজ করে তোলে যেহেতু ব্যাকএন্ড পাশের একটি phpinfo () স্ক্রিপ্ট সার্ভার এবং ক্লায়েন্ট সাইডের তথ্য প্রদর্শন করবে।

আমি এটি ব্যবহার করে যাচাই করতে:

HTTPS: // ব্যাকএন্ড / পরীক্ষা / phpinfo

ব্রাউজারে এসএসএল শংসাপত্র ইনস্টল করা আছে এবং আমি যেমন বিভাগগুলি পাই: সার্ভার শংসাপত্রের জন্য SSL_SERVER_S_DN_CN এবং ক্লায়েন্ট শংসাপত্রের জন্য SSL_CLIENT_S_DN_CN।

প্রথম প্রারম্ভ হিসাবে আমি ফ্রন্টএন্ড সার্ভার বিতে এনজিনেক্স কনফিগার করতে (বন্ধনীগুলির অংশগুলি পূরণ করুন) ব্যবহার করেছি:

server {
  listen 8080;
  server_name <frontend>;

  location / {
    proxy_buffering off;
    proxy_pass https://<backend>;
    #proxy_ssl_certificate      certs/<SSL Client Certificate>.crt;
    #proxy_ssl_certificate_key  certs/<SSL Client Certificate>.key;
  }
}

বিএসএল ক্লায়েন্ট শংসাপত্রের নির্দিষ্ট অংশটি কেবলমাত্র বিপরীত প্রক্সিটি কাজ করে তা পরীক্ষা করে।

nginx -t
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful
service nginx restart
nginx stop/waiting
nginx start/running, process 8931

এখন http: // ফ্রন্টএন্ড: 8080 / টেস্ট / phpinfo.php কাজ করে দ্য

সার্ভার শংসাপত্রের জন্য SSL_SERVER_S_DN_CN প্রদর্শিত হবে এবং ক্লায়েন্ট শংসাপত্রের জন্য SSL_CLIENT_S_DN_CN প্রদর্শিত হয়নি (এখনও) প্রদর্শিত হয়নি

এখন অস্বাস্থ্যকর পরে:

server {
  listen 8080;
  server_name <frontend>;

  location / {
    proxy_buffering off;
    proxy_pass https://<backend>;
    proxy_ssl_certificate      certs/<SSL Client Certificate>.crt;
    proxy_ssl_certificate_key  certs/<SSL Client Certificate>.key;
  }
}

এবং পরীক্ষা / পুনরায় আরম্ভ

nginx -t
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful
service nginx restart
nginx stop/waiting
nginx start/running, process 8931

HTTP: // সম্মুখভাগ: 8080 / পরীক্ষা / phpinfo.php কাজ করে এবং

সার্ভার শংসাপত্রের জন্য SSL_SERVER_S_DN_CN প্রদর্শিত হবে এবং ক্লায়েন্ট শংসাপত্রের জন্য SSL_CLIENT_S_DN_CN প্রদর্শিত হবে

সুতরাং এখন আমরা যেমন চাওয়া হিসাবে কাজ পেয়েছিলাম।

দয়া করে বাগ https://trac.nginx.org/nginx/ticket/872#ticket নোট করুন


আপনি পুনর্বিবেচনামূলক ইস্যুটি রুবি-ফার্মাম / টপিক / 75687575১1377 দেখতে চান যা শো ক্ষতিগ্রস্ত করতে পারে
ফাহল

1

এনগিনেক্স এবং এসএসএল ক্লায়েন্টের শংসাপত্রগুলিতে বেশ ঝরঝরে নিবন্ধ রয়েছে; এটি উদাহরণস্বরূপ ফাস্টসিজিআইয়ের সাথে পিএইচপি ব্যবহার করে তবে আমি মনে করি আপনি এটি একটি বিপরীত প্রক্সি সেটআপের সাথে মানিয়ে নিতে পারেন:

server {
    listen        443;
    ssl on;
    server_name example.com;

    ssl_certificate      /etc/nginx/certs/server.crt;
    ssl_certificate_key  /etc/nginx/certs/server.key;
    ssl_client_certificate /etc/nginx/certs/ca.crt;
    ssl_verify_client optional;

    location / {
        root           /var/www/example.com/html;
        fastcgi_pass   127.0.0.1:9000;
        fastcgi_param  SCRIPT_FILENAME /var/www/example.com/lib/Request.class.php;
        fastcgi_param  VERIFIED $ssl_client_verify;
        fastcgi_param  DN $ssl_client_s_dn;
        include        fastcgi_params;
    }
}

উত্স http://nategood.com/client-side-certificate-authentication-in-ngi


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