एसएक्सजी एक्सटेंशन के साथ TLS सर्टिफ़िकेट जनरेट करने, एसएक्सजी फ़ाइलें जनरेट करने के लिए टूल इंस्टॉल करने, और एसएक्सजी फ़ाइलें दिखाने के लिए nginx को कॉन्फ़िगर करने का तरीका.
साइन किए गए एचटीटीपी एक्सचेंज (एसएक्सजी) एक नई वेब टेक्नोलॉजी है. इसकी मदद से, उपयोगकर्ता आसानी से कॉन्टेंट क्रिएटर्स और कॉन्टेंट डिस्ट्रिब्यूटर में अंतर कर सकते हैं. इस गाइड में, एसएक्सजी को सेट अप करने का तरीका बताया गया है.
क्रॉस-ब्राउज़र सहायता
Chromium पर आधारित कई ब्राउज़र, SXG के साथ काम करते हैं. इनमें Google Chrome, Samsung Internet, और Microsoft Edge शामिल हैं. अप-टू-डेट जानकारी के लिए, ऑरिजिन से हस्ताक्षर किए गए एचटीटीपी एक्सचेंज के सहमति और स्टैंडर्ड सेक्शन देखें.
ज़रूरी शर्तें
अपनी वेबसाइट पर एसएक्सजी लागू करने के लिए, आपको:
- अपने डोमेन का कंट्रोल रखें. इसमें डीएनएस एंट्री का कंट्रोल भी शामिल है.
- सर्टिफ़िकेट पाएं. एसएक्सजी के लिए, खास तौर पर एक सर्टिफ़िकेट जारी करना ज़रूरी है. खास तौर पर, अपनी TLS कुंजी या सर्टिफ़िकेट का फिर से इस्तेमाल नहीं किया जा सकता.
- आपके पास ऐसा एचटीटीपी सर्वर हो जो एचटीटीपीएस पर एसएक्सजी जनरेट और दिखा सकता हो.
अनुमान
इस गाइड में यह माना गया है कि:
- साथ ही, आपके ऐप्लिकेशन में OpenSSL 1.1.1 एनवायरमेंट मौजूद हो. यह गाइड, amd64 ISA पर Ubuntu 18.04 LTS के लिए लिखी गई है.
- रन करने की सुविधा होनी चाहिए
sudo
, ताकि चलाए जा सकने वाले प्रोग्राम इंस्टॉल किए जा सकें. nginx
को एचटीटीपी सर्वर के तौर पर इस्तेमाल करें.- SXG से जुड़े एक्सटेंशन वाले सर्टिफ़िकेट जनरेट करने के लिए, DigiCert का इस्तेमाल किया जा रहा है, क्योंकि फ़िलहाल यही कंपनी इन एक्सटेंशन के साथ काम करती है.
साथ ही, इस लेख में दिए गए उदाहरणों के निर्देशों में यह माना गया है कि आपका डोमेन website.test
है. इसलिए, आपको website.test
को अपने असल डोमेन से बदलना होगा.
पहला चरण: SXG के लिए अपना सर्टिफ़िकेट पाना
एसएक्सजी जनरेट करने के लिए, आपको CanSignHttpExchanges
एक्सटेंशन वाले TLS सर्टिफ़िकेट की ज़रूरत होगी. साथ ही, एक खास तरह की कुंजी भी होनी चाहिए.
DigiCert इस एक्सटेंशन वाले सर्टिफ़िकेट उपलब्ध कराता है.
सर्टिफ़िकेट जारी करने के लिए, आपको सीएसआर फ़ाइल की ज़रूरत होगी. इसलिए, इसे इन निर्देशों की मदद से जनरेट करें:
openssl ecparam -genkey -name prime256v1 -out mySxg.key
openssl req -new -key mySxg.key -nodes -out mySxg.csr -subj "/O=Test/C=US/CN=website.test"
आपको एक सीएसआर फ़ाइल मिलेगी, जो कुछ इस तरह दिखेगी:
-----BEGIN CERTIFICATE REQUEST-----
MIHuMIGVAgEAMDMxDTALBgNVBAoMBFRlc3QxCzAJBgNVBAYTAlVTMRUwEwYDVQQD
DAx3ZWJzaXRlLnRlc3QwWTATBgcqhkjOPQIBBggqhkjOPQMBBwNCAAS7IVaeMvid
S5UO7BspzSe5eqT5Qk6X6dCggUiV/vyqQaFDjA/ALyTofgXpbCaksorPaDhdA+f9
APdHWkTbbdv1oAAwCgYIKoZIzj0EAwIDSAAwRQIhAIb7n7Kcc6Y6pU3vFr8SDNkB
kEadlVKNA24SVZ/hn3fjAiAS2tWXhYdJX6xjf2+DL/smB36MKbXg7VWy0K1tWmFi
Sg==
-----END CERTIFICATE REQUEST-----
सुनिश्चित करें कि:
- सदस्यता की समयसीमा 90 दिनों से ज़्यादा नहीं होनी चाहिए.
- सर्टिफ़िकेट में CanSignHttpExchanges एक्सटेंशन शामिल करें चेकबॉक्स चालू हो, जो सर्टिफ़िकेट के अन्य विकल्पों में मौजूद होता है.
अगर आपका सर्टिफ़िकेट इन शर्तों के मुताबिक नहीं है, तो ब्राउज़र और डिस्ट्रिब्यूटर सुरक्षा से जुड़ी वजहों से आपके SXG को अस्वीकार कर देंगे.
इस गाइड में यह माना गया है कि DigiCert से मिले सर्टिफ़िकेट का फ़ाइल नाम mySxg.pem
है.
दूसरा चरण: libsxg
इंस्टॉल करना
एसएक्सजी फ़ॉर्मैट काफ़ी जटिल होता है. साथ ही, टूल का इस्तेमाल किए बिना इसे जनरेट करना मुश्किल होता है. SXG जनरेट करने के लिए, इनमें से किसी एक विकल्प का इस्तेमाल किया जा सकता है:
- Go में लिखा गया gen-signedexchange टूल.
- C में लिखी गई
libsxg
लाइब्रेरी.
यह गाइड libsxg
का इस्तेमाल करती है.
पहला विकल्प: Debian पैकेज से libsxg
इंस्टॉल करना
जब तक OpenSSL (libssl-dev
) का वर्शन मेल खाता है, तब तक पैकेज को Debian के सामान्य तरीके से इंस्टॉल किया जा सकता है.
sudo apt install -y libssl-dev
wget https://github.com/google/libsxg/releases/download/v0.2/libsxg0_0.2-1_amd64.deb
wget https://github.com/google/libsxg/releases/download/v0.2/libsxg-dev_0.2-1_amd64.deb
sudo dpkg -i libsxg0_0.2-1_amd64.deb
sudo dpkg -i libsxg-dev_0.2-1_amd64.deb
दूसरा विकल्प: libsxg
को मैन्युअल तरीके से बनाना
अगर .deb
फ़ाइलों के साथ काम करने वाले एनवायरमेंट का इस्तेमाल नहीं किया जा रहा है, तो libsxg
को खुद बनाया जा सकता है.
इसके लिए, आपको git
, cmake
, openssl
, और gcc
इंस्टॉल करने होंगे.
git clone https://github.com/google/libsxg
mkdir libsxg/build
cd libsxg/build
cmake .. -DRUN_TEST=false -DCMAKE_BUILD_TYPE=Release
make
sudo make install
तीसरा चरण: nginx
प्लग इन इंस्टॉल करना
nginx
प्लग इन की मदद से, SXG को दिखाने से पहले स्टैटिक तौर पर जनरेट करने के बजाय, डाइनैमिक तौर पर जनरेट किया जा सकता है.
विकल्प 1: Debian पैकेज से प्लगिन इंस्टॉल करें
nginx
के लिए एसएक्सजी मॉड्यूल, GitHub पर उपलब्ध कराया गया है.
Debian वाले सिस्टम पर, इसे बाइनरी पैकेज के तौर पर इंस्टॉल किया जा सकता है:
sudo apt install -y nginx=1.15.9-0
wget https://github.com/google/nginx-sxg-module/releases/download/v0.1/libnginx-mod-http-sxg-filter_1.15.9-0ubuntu1.1_amd64.deb
sudo dpkg -i libnginx-mod-http-sxg-filter_1.15.9-0ubuntu1.1_amd64.deb
दूसरा विकल्प: प्लग इन को मैन्युअल तरीके से बनाना
nginx
मॉड्यूल बनाने के लिए, nginx
सोर्स कोड की ज़रूरत होती है.
आपको नीचे दिए गए निर्देशों का इस्तेमाल करके टारबॉल मिल सकती है और इसे एसएक्सजी डाइनैमिक मॉड्यूल के साथ बनाया जा सकता है:
git clone https://github.com/google/nginx-sxg-module
wget https://nginx.org/download/nginx-1.17.5.tar.gz
tar xvf nginx-1.17.5.tar.gz
cd nginx-1.17.5
./configure --prefix=/opt/nginx --add-dynamic-module=../nginx-sxg-module --without-http_rewrite_module --with-http_ssl_module
make
sudo make install
nginx
कॉन्फ़िगरेशन में बहुत ज़्यादा विकल्प होते हैं.
अपने सिस्टम में कहीं भी nginx
इंस्टॉल करें. इसके बाद, module/config/log/pidfile
का पाथ बताएं.
हम उम्मीद करते हैं कि आपने इसे /opt/nginx
पर इंस्टॉल किया है.
चौथा चरण: SXG के साथ काम करने के लिए, nginx
प्लग इन को कॉन्फ़िगर करना
पहला विकल्प: डेबियन से इंस्टॉल किए गए nginx
मॉड्यूल को कॉन्फ़िगर करना
अगर आपने पहले तीसरा चरण, पहला विकल्प इस्तेमाल किया है, तो इन निर्देशों का पालन करें.
एसएक्सजी कॉन्टेंट को डिलीवर करने के लिए, एचटीटीपीएस ज़रूरी है. DigiCert, Let's Encrypt, और अन्य सेवाओं से एसएसएल/TLS सर्टिफ़िकेट लिया जा सकता है. ध्यान दें कि एसएसएल के लिए एसएक्सजी सर्टिफ़िकेट का इस्तेमाल नहीं किया जा सकता. इसके अलावा, एसएक्सजी के लिए एसएसएल सर्टिफ़िकेट का इस्तेमाल भी नहीं किया जा सकता. इसलिए, आपको दो सर्टिफ़िकेट की ज़रूरत होगी. /etc/nginx/nginx.conf
में मौजूद कॉन्फ़िगरेशन फ़ाइल, यहां दी गई फ़ाइल जैसी दिखनी चाहिए. ऐसा तब होगा, जब आपने /path/to/ssl/
में एसएसएल कुंजी/सर्टिफ़िकेट जोड़ा हो और /path/to/sxg/
में SXG कुंजी/सर्टिफ़िकेट जोड़ा हो:
user www-data;
include /etc/nginx/modules-enabled/*.conf;
events {
worker_connections 768;
}
http {
include mime.types;
default_type application/octet-stream;
add_header X-Content-Type-Options nosniff;
server {
listen 443 ssl;
ssl_certificate /path/to/ssl/fullchain.pem;
ssl_certificate_key /path/to/ssl/privkey.pem;
server_name website.test;
sxg on;
sxg_certificate /path/to/sxg/mySxg.pem;
sxg_certificate_key /path/to/sxg/mySxg.key;
sxg_cert_url https://website.test/certs/cert.cbor;
sxg_validity_url https://website.test/validity/resource.msg;
sxg_cert_path /certs/cert.cbor;
root /var/www/html;
}
}
- एसएक्सजी को सही तरीके से लोड करने के लिए,
sxg_cert_url
ज़रूरी है. ऐसा इसलिए, क्योंकि यह सर्टिफ़िकेट चेन का पता लगाता है. सर्टिफ़िकेट चेन में, सर्टिफ़िकेट और OCSP स्टेपल करने की जानकारी, cbor फ़ॉर्मैट में होती है. ध्यान दें कि आपकोcert.cbor
फ़ाइल को उसी ऑरिजिन से नहीं दिखाना होगा. इसे किसी भी सीडीएन या स्टैटिक फ़ाइल को दिखाने वाली अन्य सेवाओं के ज़रिए दिखाया जा सकता है. हालांकि, इसके लिए ज़रूरी है कि वे एचटीटीपीएस के साथ काम करती हों. sxg_validitiy_url
में SXG-साइनचर-हेडर से जुड़ी जानकारी देने की योजना है. अगर पिछले एसएक्सजी के बाद से किसी पेज में कोई बदलाव नहीं हुआ है, तो तकनीकी तौर पर पूरी एसएक्सजी फ़ाइल डाउनलोड करने की ज़रूरत नहीं है. इसलिए, सिर्फ़ हस्ताक्षर वाले हेडर की जानकारी अपडेट करने से, नेटवर्क ट्रैफ़िक कम हो सकता है. हालांकि, ये जानकारी अभी तक लागू नहीं की गई है.
nginx
शुरू करें और SXG दिखाने के लिए तैयार हो जाएं!
sudo systemctl start nginx.service
curl -H"Accept: application/signed-exchange;v=b3" https://website.test/ > index.html.sxg
cat index.html.sxg
sxg1-b3...https://website.test/...(omit)
दूसरा विकल्प: सोर्स से बनाए गए nginx
मॉड्यूल को कॉन्फ़िगर करना
अगर आपने पहले चरण 3, विकल्प 2 का इस्तेमाल किया था, तो इन निर्देशों का पालन करें.
/opt/nginx
में इंस्टॉल किए गए अपने nginx
सिस्टम को, नीचे दिए गए उदाहरण की तरह कॉन्फ़िगर करें:
load_module "/opt/nginx/modules/ngx_http_sxg_filter_module.so";
events {
worker_connections 768;
}
http {
include mime.types;
default_type application/octet-stream;
add_header X-Content-Type-Options nosniff;
server {
listen 443 ssl;
ssl_certificate /path/to/ssl/fullchain.pem;
ssl_certificate_key /path/to/ssl/privkey.pem;
server_name example.com;
sxg on;
sxg_certificate /path/to/sxg/mySxg.pem;
sxg_certificate_key /path/to/sxg/mySxg.key;
sxg_cert_url https://website.test/certs/cert.cbor;
sxg_validity_url https://website.test/validity/resource.msg;
sxg_cert_path /certs/cert.cbor;
root /opt/nginx/html;
}
}
इसके बाद, nginx
शुरू करें. अब आपके पास SXG पाने का विकल्प है!
cd /opt/nginx/sbin
sudo ./nginx
curl -H "Accept: application/signed-exchange;v=b3" https://website.test/ > index.html.sxg
less index.html.sxg
sxg1-b3...https://website.test/...(omit)
पांचवां चरण: अपने ऐप्लिकेशन का बैकएंड उपलब्ध कराना
ऊपर दिए गए उदाहरणों में, nginx
रूट डायरेक्ट्री में स्टैटिक फ़ाइलें दिखाता है. हालांकि, अपने ऐप्लिकेशन के लिए अपस्ट्रीम डायरेक्टिव का इस्तेमाल करके, किसी भी वेब ऐप्लिकेशन के बैकएंड (जैसे, Ruby on Rails, Django या Express) के लिए SXG बनाया जा सकता है. ऐसा तब तक किया जा सकता है, जब तक आपका nginx
फ़्रंट एचटीटीपी(एस) सर्वर के तौर पर काम करता है.
upstream app {
server 127.0.0.1:8080;
}
server {
location / {
proxy_pass http://app;
}
}
छठा चरण: जांच करना
dump-signedexchange टूल का इस्तेमाल करके, यह जांच करें कि दिखाए जा रहे SXG सही हैं या नहीं. साथ ही, पक्का करें कि कोई गड़बड़ी न हुई हो और हेडर और मुख्य हिस्सा सही हो.
go get -u github.com/WICG/webpackage/go/signedexchange/cmd/dump-signedexchange
export PATH=$PATH:~/go/bin
dump-signedexchange -verify -uri https://website.test/ | less
सुझाव भेजें
एसएक्सजी पर काम करने वाले Chromium के इंजीनियर, webpackage-dev@chromium.org पर आपके सुझाव, शिकायत या राय जानना चाहेंगे. आप खास जानकारी पर चर्चा में शामिल हो सकते हैं या टीम को गड़बड़ी की रिपोर्ट कर सकते हैं. आपके सुझाव/राय/शिकायत से, स्टैंडर्ड बनाने की प्रोसेस को काफ़ी मदद मिलेगी. साथ ही, इसे लागू करने से जुड़ी समस्याओं को हल करने में भी मदद मिलेगी. धन्यवाद!