nginx เป็น reverse proxy พร้อมอัพสตรีม SSL


19

ฉันกำลังสร้างพร็อกซีสำหรับ API ภายในเพื่อให้ลูกค้าเชื่อมต่อโดยไม่ต้องติดตั้งใบรับรองที่ลงนามเอง

ลูกค้า (สร้างขึ้นเป็นเจ้าของและใช้ภายในเท่านั้น) จะเชื่อมต่อผ่าน SSL ไปยังกล่อง nginx โดยที่ฉันใช้XSendfileเพื่อตรวจสอบข้อมูลรับรองในระดับแอปพลิเคชัน (แอปพลิเคชันราง) หากข้อมูลรับรองนั้นถูกต้องการเชื่อมต่อจะถูกส่งกลับไปยัง nginx โดยที่มันจะใช้ proxy_pass เพื่อส่งการเชื่อมต่อไปยังเซิร์ฟเวอร์ upstream

ตอนนี้ใช้งานได้ดีสำหรับการเชื่อมต่อ http มาตรฐาน แต่ฉันพยายามหาวิธีเพิ่มใบรับรองของเราลงในส่วนผสม

คำถามนี้เกือบจะเหมือนกันกับคำถามนี้แต่มีข้อกำหนดด้านใบรับรองที่น่าอึดอัดใจ

เป็นไปได้ด้วย nginx หรือไม่ มีวิธีแก้ปัญหาที่ดีกว่านี้ไหม?

ฉันต้องการชำระ http จากไคลเอ็นต์ -> nginx และใบรับรองที่ลงนามเองจาก nginx เป็น API

คำตอบ:


19

สำหรับใครก็ตามที่สะดุดกับคำถามนี้ที่ต้องการใช้ nginx คุณสามารถตั้งค่านี้เหมือนกับพร็อกซีปกติและเพื่อยอมรับใบรับรองที่ลงนามด้วยตนเองจากแบ็กเอนด์คุณต้องให้ใบรับรอง pem ที่ส่งออก (และอาจเป็นกุญแจ) และตั้งค่าการตรวจสอบ ssl ปิด ตัวอย่างเช่น:

...

server {
    listen       10.1.2.3:80;
    server_name  10.1.2.3 myproxy.mycompany.com;

    location / {
         proxy_pass                    https://backend.server.ip/;
         proxy_ssl_trusted_certificate /etc/nginx/sslcerts/backend.server.pem;
         proxy_ssl_verify              off;

         ... other proxy settings
    }

หากแบ็คเอนด์ที่ปลอดภัยของคุณกำลังใช้การระบุชื่อเซิร์ฟเวอร์ SNI โดยมีหลายโฮสต์ที่ให้บริการต่อคู่ IP / พอร์ตคุณอาจต้องรวมproxy_ssl_server_name on;ไว้ในการกำหนดค่าด้วย สิ่งนี้ใช้ได้กับ nginx 1.7.0 และใหม่กว่า


1
proxy_ssl_server_name on;คือทั้งหมดที่ฉันต้องใช้เพื่อทำงานเมื่อพร็อกซีทราฟฟิกไปยังโฮสต์บน Google App Engine โดยใช้ SSL ในตัวที่จัดการโดย Google! (นี่ไม่ใช่ใบรับรองที่ลงนามด้วยตนเองหรืออะไรเลยดังนั้นจึงจำเป็นต้องมีหนึ่งบรรทัด) ขอบคุณสำหรับเคล็ดลับที่ดี
XP84

ฉันได้รับ 'ไม่ "ssl_certificate" ถูกกำหนดไว้สำหรับคำสั่ง "Listen ... ssl" ถ้าฉันไม่ได้ใช้ ssl_certificate เป็นไปได้หรือไม่ที่จะใช้ proxy SSL โดยไม่ต้องให้ใบรับรอง upstream
ดาเมียน

ความคิดเห็นปิดหัวข้อเนื่องจากเป็นเรื่องเกี่ยวกับพร็อกซี http ที่เชื่อมต่อกับ upstream https หากคุณต้องการที่จะ proxy https แล้วก็น่าจะเป็นคำถามที่แยกต่างหาก คำตอบที่รวดเร็วและสั้นคือ No Nginx ไม่สามารถ "ฟัง" พอร์ต https โดยไม่มีใบรับรองและคีย์ส่วนตัว
ผู้ใช้ shonky linux

5

ฉันคิดว่าคุณอาจต้องการบางสิ่งเช่นนี้ (ทำให้ง่ายขึ้นสำหรับตัวอย่างนี้):

worker_processes  1;
events {
    worker_connections  1024;
}

http {
    include       mime.types;
    default_type  application/octet-stream;

    sendfile        on;
    keepalive_timeout  65;

    upstream backend {
        server mybackendserver:443;
    }

    server {
        server_name localhost;
        listen 443 ssl;
        ssl_certificate /etc/nginx/server.crt;
        ssl_certificate_key /etc/nginx/server.key;
        ssl_verify_client off;
        location / {
            proxy_pass  https://backend;
            proxy_set_header Host $http_host;
            proxy_set_header X_FORWARDED_PROTO https;
        }
    }
}

สิ่งเดียวที่คุณอาจต้องเปลี่ยนคือการทำให้ "โฮสต์" ชัดเจน - ตัวอย่างเช่นถ้าชื่อโฮสต์ที่คุณมอบฉันทะไม่เหมือนกับชื่อโฮสต์ที่ใช้บนพร็อกซีเซิร์ฟเวอร์ nginx


จากความเข้าใจของฉันพารามิเตอร์ ssl_certificate และ ssl_certificate_key อ้างถึงการเชื่อมต่อลูกค้าไม่ใช่การเชื่อมต่อ upstream เป็นอย่างนั้นเหรอ?
simonmaddox

1
จากสิ่งที่ฉันเข้าใจใช่ ในตัวอย่างนี้ใบรับรองที่ไคลเอ็นต์เห็นคือใบรับรองที่จัดทำโดย nginx nginx เห็น (และตรวจสอบหรือไม่ฉันไม่แน่ใจว่า ... ) เซิร์ฟเวอร์ที่จัดหาให้ แต่ไม่ส่งผ่านไปยังลูกค้า
Jam

3

สำหรับทุกคนที่เจอสิ่งนี้ในอนาคตฉันก็ไม่ได้ใช้ nginx สำหรับเรื่องนี้

แต่ฉันกลับมาใช้ stunnel ใน "โหมดลูกค้า" แทน ติดตั้งง่ายมากและทำสิ่งที่ฉันต้องการ

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.