Score:0

โอเพ่นซอร์ส NGINX: รับรองการสื่อสารที่เข้ารหัสระหว่างบาลานเซอร์และโหนด

ธง tr

ฉันกำลังตั้งค่าโหลดบาลานเซอร์ที่ต้องสื่อสารกับโหนดอื่นโดยใช้ TLS สิ่งนี้มีความสำคัญเนื่องจากโหนดส่วนหลังไม่ได้อยู่ในเครือข่ายส่วนตัว การกำหนดค่าเป็นแบบด้านล่าง

ผลลัพธ์คือ Nginx กลับมา 502 เกตเวย์เสียและดูเหมือนว่า Nginx ไม่สามารถเปลี่ยนเส้นทางไปยังโดเมนของฉันได้ นอกจากนี้ ตั้งแต่ฉันใช้ โอเพ่นซอร์ส เวอร์ชั่น I ไม่ได้ ใช้ แก้ไข คำหลักภายในการกำหนดค่าอัพสตรีม ฉันจะเปลี่ยนการกำหนดค่านี้เพื่อให้ Nginx เข้ารหัสข้อมูลระหว่าง example.com -> backendX.example.com ได้อย่างไร

ข้อสังเกต: ถ้าฉันใช้ IP แทน URL ในอัพสตรีมบล็อก โหลดบาลานซ์จะทำงาน แต่ฉันไม่คิดว่ามันถูกเข้ารหัส

ข้อผิดพลาด:

*3 ข้อผิดพลาดในการตรวจสอบใบรับรอง SSL อัปสตรีม: (2:ไม่สามารถรับใบรับรองผู้ออก) ขณะจับมือ SSL ไปยังอัปสตรีม ไคลเอ็นต์: 0.0.0.0 เซิร์ฟเวอร์: lb.example.com

ผลลัพธ์ของ openssl s_client - เชื่อมต่อ backend1.example.com:

ห่วงโซ่ใบรับรอง
 0 วินาที:CN = backend1.example.com
   i:C = US, O = Let's Encrypt, CN = R3
 1 วินาที:C = US, O = Let's Encrypt, CN = R3
   i:C = US, O = Internet Security Research Group, CN = ISRG Root X1
 2 วินาที:C = US, O = Internet Security Research Group, CN = ISRG Root X1
   i:O = Digital Signature Trust Co., CN = DST Root CA X3
ต้นน้ำ example.com{
   little_conn;
   เซิร์ฟเวอร์ backend1.example.com;
   เซิร์ฟเวอร์ backend2.example.com;
}

เซิร์ฟเวอร์ {

        ฟัง [::]:443 ssl ipv6only=เปิด;
        ฟัง 443 ssl;
        server_name lb.example.com;

        ที่ตั้ง / {
                proxy_pass https://example.com;

                proxy_ssl_trusted_certificate /etc/letsencrypt/.../chain.pem;
                เปิด proxy_ssl_session_reuse;
                เปิด proxy_ssl_verify;
                proxy_ssl_verify_ความลึก 2;
                proxy_set_header โฮสต์ $host;
        }
    ssl_certificate /etc/letsencrypt/.../fullchain.pem; # จัดการโดย Certbot
    ssl_certificate_key /etc/letsencrypt/.../privkey.pem; # จัดการโดย Certbot
    รวม /etc/letsencrypt/options-ssl-nginx.conf; # จัดการโดย Certbot
    ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # จัดการโดย Certbot

}

#### NGINX -T
ผู้ใช้ www-data;
worker_processes อัตโนมัติ
pid /run/nginx.pid;
รวม /etc/nginx/modules-enabled/*.conf;

เหตุการณ์ {
    worker_connections 768;
    # multi_accept บน;
}

http {

    ##
    # การตั้งค่าพื้นฐาน
    ##

    ส่งไฟล์บน;
    tcp_nopush บน;
    tcp_nodelay บน;
    keepalive_timeout 65;
    types_hash_max_size 2048;
    # ปิด server_tokens;

    # server_names_hash_bucket_size 64;
    # server_name_in_redirect ปิด;
    ตัวแก้ไข 8.8.8.8 8.8.4.4 ถูกต้อง = 30 วินาที;
    รวม /etc/nginx/mime.types;
    แอปพลิเคชัน default_type/octet-stream;

    ##
    # การตั้งค่า SSL
    ##

    ssl_protocols TLSv1 TLSv1.1 TLSv1.2 TLSv1.3; # วาง SSLv3 อ้างอิง: พุดเดิ้ล
    เปิด ssl_prefer_server_ciphers;

    ##
    # การตั้งค่าการบันทึก
    ##

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

    ##
    # การตั้งค่า Gzip
    ##

    เปิด gzip;

    # gzip_vary บน;
    # gzip_proxyed ใด ๆ ;
    # gzip_comp_level 6;
    # gzip_buffers 16 8k;
    # gzip_http_version 1.1;
    # gzip_types ข้อความ/ข้อความล้วน/แอปพลิเคชัน css/แอปพลิเคชัน json/ข้อความจาวาสคริปต์/แอปพลิเคชัน xml/แอปพลิเคชัน xml/xml+rss ข้อความ/จาวาสคริปต์;

    ##
    # การกำหนดค่าโฮสต์เสมือน
    ##

    รวม /etc/nginx/conf.d/*.conf;
    รวม /etc/nginx/sites-enabled/*;
}

ต้นน้ำ example.com{
   little_conn;
   เซิร์ฟเวอร์ backend1.example.com;
   เซิร์ฟเวอร์ backend2.example.com;
}

เซิร์ฟเวอร์ {

        ฟัง [::]:443 ssl ipv6only=เปิด;
        ฟัง 443 ssl;
        server_name lb.example.com;

        ที่ตั้ง / {
                proxy_pass https://example.com;

                proxy_ssl_trusted_certificate /etc/letsencrypt/.../chain.pem;
                เปิด proxy_ssl_session_reuse;
                เปิด proxy_ssl_verify;
                proxy_ssl_verify_ความลึก 2;
                proxy_set_header โฮสต์ $host;
        }
    ssl_certificate /etc/letsencrypt/.../fullchain.pem; # จัดการโดย Certbot
    ssl_certificate_key /etc/letsencrypt/.../privkey.pem; # จัดการโดย Certbot
    รวม /etc/letsencrypt/options-ssl-nginx.conf; # จัดการโดย Certbot
    ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # จัดการโดย Certbot

}

เซิร์ฟเวอร์ {
    ถ้า ($host = lb.example.com) {
        ส่งคืน 301 https://$host$request_uri;
    } # จัดการโดย Certbot


    ฟัง 80 default_server;
    ฟัง [::]:80 default_server;

    server_name lb.example.com;
    กลับ 404; # จัดการโดย Certbot


}

# ไฟล์กำหนดค่า /etc/letsencrypt/options-ssl-nginx.conf:
# ไฟล์นี้มีพารามิเตอร์ความปลอดภัยที่สำคัญ หากคุณแก้ไขไฟล์นี้
# ด้วยตนเอง Certbot จะไม่สามารถให้ความปลอดภัยในอนาคตได้โดยอัตโนมัติ
# อัปเดต Certbot จะพิมพ์และบันทึกข้อความแสดงข้อผิดพลาดพร้อมพาธไปที่แทน
# ไฟล์ล่าสุดที่คุณจะต้องอ้างถึงเมื่ออัปเดตด้วยตนเอง
#ไฟล์นี้.

ssl_session_cache แชร์:le_nginx_SSL:10m;
ssl_session_timeout 1440m;
ปิด ssl_session_tickets;

ssl_protocols TLSv1.2 TLSv1.3;
ปิด ssl_prefer_server_ciphers;

ssl_ciphers "ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305: ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384:ECDHE-RSA-AES128-SHA";

nginx -t nginx: ไฟล์การกำหนดค่า /etc/nginx/nginx.conf ไวยากรณ์ใช้ได้ nginx: การทดสอบไฟล์การกำหนดค่า /etc/nginx/nginx.conf สำเร็จ

djdomi avatar
za flag
เหตุใดคุณจึงใช้ https และพอร์ตสำหรับอัพสตรีม พอร์ตจำเป็นเฉพาะในกรณีที่คุณไม่มีพอร์ตมาตรฐานใช้
AndreaCostanzo1 avatar
tr flag
@djdomi ฉันลองโดยไม่ระบุพอร์ตด้วย มันเป็นการทดลองที่ฉันทำเพื่อให้แน่ใจว่านั่นไม่ใช่ปัญหา
djdomi avatar
za flag
แบ็คเอนด์ทั้งสองสามารถแก้ไขได้หรือไม่
AndreaCostanzo1 avatar
tr flag
@djdomi ใช่ ทั้งคู่เข้าถึงได้ด้วยการเรียกดูตามปกติโดยใช้ url
AndreaCostanzo1 avatar
tr flag
@djdomi ฉันแก้ไขตัวอย่างแล้ว อย่างไรก็ตาม โดเมนที่ใช้โดย DNS ของฉันและโดเมนที่ใช้โดยโหนดอื่นๆ นั้นแตกต่างกันทั้งหมด
djdomi avatar
za flag
โปรดแชร์ผลลัพธ์ของ nginx -t และหลังจากนั้น nginx -T ของเซิร์ฟเวอร์แต่ละเซิร์ฟเวอร์เพราะ IMHO ส่วนใบรับรอง ssl ดูแปลก [ดูที่นี่เป็นตัวอย่าง](https://www.digitalocean.com/community/tutorials/how-to- ตั้งค่า nginx โหลดบาลานซ์ด้วย ssl-termination)
AndreaCostanzo1 avatar
tr flag
@djdomi เพิ่มด้านล่าง โหนดส่วนหลังอื่น ๆ เป็นเซิร์ฟเวอร์ที่มีอยู่แล้วบน apache ที่เราใช้เป็นเวลานาน ฉันแค่พยายามใช้ nginx เป็นตัวโหลดบาลานเซอร์เพื่อวางไว้ระหว่างนั้น ถ้าฉันลบ URL และใช้ IP ในอัปสตรีม ทุกอย่างทำงานได้ดี แต่ปัญหาของการใช้ IP คือฉันไม่รู้ว่าการสื่อสารนั้นเข้ารหัสหรือไม่
Michael Hampton avatar
cz flag
คุณต้องระบุ `resolver` แต่ฉันไม่เห็นเลย ตาม [docs](https://nginx.org/r/resolver) สิ่งเหล่านี้จะต้องอยู่ในบล็อก `http`, `เซิร์ฟเวอร์` หรือ `ตำแหน่ง'
AndreaCostanzo1 avatar
tr flag
มี (ในการตั้งค่า http ของฉัน)! แต่ก็ยังใช้งานไม่ได้
Michael Hampton avatar
cz flag
โอเค ฉันเห็นแล้ว ฉันค้นหารายการ error_log ของคุณแล้ว แต่ไม่พบในโพสต์ของคุณ โปรดลองส่งคำขออีกครั้ง แล้วโพสต์รายการ error_log ใหม่
AndreaCostanzo1 avatar
tr flag
@MichaelHampton พบปัญหาแต่ไม่พบวิธีแก้ปัญหา: ในระหว่างการจับมือ SSL ฉันไม่ได้ส่งใบรับรอง CA ที่เชื่อถือได้ ฉันจะแก้ไขได้อย่างไร ข้อผิดพลาด: *3 ข้อผิดพลาดในการตรวจสอบใบรับรอง SSL อัปสตรีม: (2:ไม่สามารถรับใบรับรองผู้ออก) ในขณะที่ SSL แฮนด์เชคไปยังอัปสตรีม ไคลเอนต์: 0.0.0.0 เซิร์ฟเวอร์: lb.example.com
AndreaCostanzo1 avatar
tr flag
@MichaelHampton ฉันได้เปลี่ยนใบรับรอง CA ที่เชื่อถือได้ด้วย /etc/ssl/certs/ca-certificates.crt; และตอนนี้ข้อผิดพลาดคือ *1 ใบรับรอง SSL อัปสตรีมไม่ตรงกับ "ชื่ออัปสตรีม" ในขณะที่การจับมือ SSL กับอัปสตรีม

โพสต์คำตอบ

คนส่วนใหญ่ไม่เข้าใจว่าการถามคำถามมากมายจะปลดล็อกการเรียนรู้และปรับปรุงความสัมพันธ์ระหว่างบุคคล ตัวอย่างเช่น ในการศึกษาของ Alison แม้ว่าผู้คนจะจำได้อย่างแม่นยำว่ามีคำถามกี่ข้อที่ถูกถามในการสนทนา แต่พวกเขาไม่เข้าใจความเชื่อมโยงระหว่างคำถามและความชอบ จากการศึกษาทั้ง 4 เรื่องที่ผู้เข้าร่วมมีส่วนร่วมในการสนทนาด้วยตนเองหรืออ่านบันทึกการสนทนาของผู้อื่น ผู้คนมักไม่ตระหนักว่าการถามคำถามจะมีอิทธิพลหรือมีอิทธิพลต่อระดับมิตรภาพระหว่างผู้สนทนา