सवाल ssl एसीएल के साथ haproxy multihost


मैं सर्वर एकाधिक एकाधिक होस्ट्स के लिए प्रत्येक एसएसएल प्रमाण पत्र के साथ हैप्रोक्सी (1.5dev19) में एसीएल नियमों का उपयोग कैसे कर सकता हूं ??

मेरे पास एक आईपी पते पर एकाधिक डोमेन के साथ 3 बैकएंड हैं।

नोडजेस (http / https / ws / wss)

nginx (http / https) (अब अपाचे के लिए रिवर्स प्रॉक्सी)

अपाचे (http)

मैं उनके सामने haproxy रखना चाहता हूँ और इसे एसएसएल कनेक्शन की सेवा करना चाहते हैं। क्या हैप्रोक्सी एसीएल के साथ यह संभव है या मुझे हैप्रोक्सी के सामने स्टड की तरह कुछ उपयोग करना है?

कुछ इस तरह:

frontend http-in
    bind *:80

    acl host_domain1 hdr(host) -i domain1.lt
    use_backend nginx_web_http if host_domain1

frontend http-in
    bind *:443

    acl host_domain1 hdr(host) -i domain1.lt
    use_backend nginx_web_https if host_domain1

backend nginx_web_https
    mode http
    ssl crt /etc/ssl/domain1/ crt ./certs/ prefer-server-cipher
    option httplog
    option httpclose
    server nginx 192.168.2.101:8080 check

backend nginx_web_http
    mode http
    option httplog
    option httpclose
    server nginx 192.168.2.101:8080 check

6
2017-12-15 14:04


मूल


एसएनआई विरासत ब्राउज़र द्वारा समर्थित नहीं है। परेशानी को बचाओ और अपने haproxy के साथ 3 आईपी का उपयोग करें। - wqw


जवाब:


मुझे नहीं लगता है कि हैप्रोक्सी आपको प्रत्येक आने वाले अनुरोध के लिए प्रति बैकएंड एसएसएल प्रमाण पत्र निर्दिष्ट करने की अनुमति देगा, बल्कि आपको एक संयुक्त प्रमाणपत्र होना होगा जो एकाधिक डोमेन नामों (एसएनआई) की अनुमति देता है।

यहां हैप्रोक्सी के साथ एसएनआई का उपयोग करने पर एक गाइड है, जहां सभी प्रमाणपत्र वास्तव में हैप्रोक्सी सर्वर द्वारा होस्ट किए जाते हैं, बैकएंड उदाहरण नहीं: http://trick77.com/2012/12/26/haproxy-and-sni-based-ssl-offloading-with-intermediate-ca/

इस खंड के अंत में उदाहरण भी देखें: http://cbonte.github.io/haproxy-dconv/configuration-1.5.html#4.2-use-server


3
2017-12-15 16:19



एसएनआई अच्छी पसंद है, लेकिन मैं पहले से मौजूद प्रमाणपत्रों का उपयोग करना चाहता हूं। तो मैं 3 विकल्प देखता हूं। 1) अपाचे या nginx से टीसीपी मोड और सर्वर एसएसएल में हैप्रोक्सी का उपयोग करें (मुझे नहीं पता कि यह संभव है या नहीं) 2) हैप्रॉक्स के सामने nginx का उपयोग करें, जो वास्तव में अच्छा नहीं है। 3) पाउंड की तरह एक और रिवर्स प्रॉक्सी का उपयोग करें जो मुझे नहीं पता कि मेरी आवश्यकताओं को पूरा कर सकता है: डी - zajca
विकल्प 1 आधे काम करेगा, लेकिन पैकेट एन्क्रिप्टेड होने के बाद से आप यह तय करने में सक्षम नहीं होंगे कि कौन सा बैकएंड हैप्रोक्सी से भेजना है। - Mike Fiedler
लेख से, ऐसा लगता है कि आप अपने सभी मौजूदा certs /etc/haproxy/certs.d में रख सकते हैं, और यातायात को डिक्रिप्ट करने के लिए उन्हें HAPRoxy के माध्यम से उपयोग कर सकते हैं, और फिर सही बैकएंड पर भेज सकते हैं। - Mike Fiedler
और यह अपाचे द्वारा कैसे हल किया जाता है? क्योंकि अपाचे में मैं प्रत्येक वर्चुअलहोस्ट के विभिन्न प्रमाणपत्रों के लिए उपयोग कर सकता हूं। इसके लिए एसएनआई का उपयोग कर अपाचे है? जैसा कि मैं लेख पढ़ रहा हूं, मैं यहां संभावित समस्या है लेकिन यह अपाचे पर ठीक काम कर रहा है। - zajca
मैं अपाचे पर 100% निश्चित नहीं हूं, लेकिन यहां एक लेख है कि nginx के साथ ऐसा कैसे करें: digitalocean.com/community/articles/... यह एसएनआई का भी उपयोग करता है, जैसा कि अधिकांश अन्य बहु-एसएसएल प्रमाण पत्र गाइड करेंगे। - Mike Fiedler


आप वास्तव में हैप्रोक्सी के अपने संस्करण के साथ ऐसा कर सकते हैं। मैंने इसके बारे में ब्लॉग किया है यहाँ

उदाहरण यहां दिया गया है:

global
   log 127.0.0.1  local0
   log 127.0.0.1  local1 notice
   #log loghost   local0 info
   maxconn 4096
   # chroot /usr/share/haproxy
   user haproxy
   group haproxy
   daemon
   #debug
   #quiet

defaults
   log   global
   mode  http
   option   httplog
   option   dontlognull
   retries  3
   option redispatch
   maxconn  2000
   contimeout  5000
   clitimeout  50000
   srvtimeout  50000

# Host HA-Proxy web stats on Port 3306 (that will confuse those script kiddies)
listen HAProxy-Statistics *:3306
    mode http
    option httplog
    option httpclose
    stats enable
    stats uri /haproxy?stats
    stats refresh 20s
    stats show-node
    stats show-legends
    stats show-desc Workaround haproxy for SSL
    stats auth admin:ifIruledTheWorld
    stats admin if TRUE

frontend ssl_relay 192.168.128.21:443
    # this only works with 1.5 haproxy
    mode tcp
    option tcplog
    option socket-stats
    # option nolinger
    maxconn  300

    # use tcp content accepts to detects ssl client and server hello.
    # acl clienthello req_ssl_hello_type 1 -> seems to not work

    tcp-request inspect-delay 5s
    tcp-request content accept if { req_ssl_hello_type 1 }

    use_backend ssl_testdomain_prod if { req_ssl_sni -i www.testdomain.nl }
    use_backend ssl_testdomain_stag if { req_ssl_sni -i test.testdomain.nl }

    default_backend ssl_testdomain_stag

backend ssl_testdomain_stag
   mode tcp
   #option nolinger
   option tcplog
   balance roundrobin
   hash-type consistent
   option srvtcpka

    # maximum SSL session ID length is 32 bytes.
    stick-table type binary len 32 size 30k expire 30m

    # make sure we cover type 1 (fallback)
    acl clienthello req_ssl_hello_type 1
    acl serverhello rep_ssl_hello_type 2

    # use tcp content accepts to detects ssl client and server hello.
    tcp-request inspect-delay 5s
    tcp-request content accept if clienthello

    # no timeout on response inspect delay by default.
    tcp-response content accept if serverhello

    # SSL session ID (SSLID) may be present on a client or server hello.
    # Its length is coded on 1 byte at offset 43 and its value starts
    # at offset 44.
    # Match and learn on request if client hello.
    stick on payload_lv(43,1) if clienthello

    # Learn on response if server hello.
    stick store-response payload_lv(43,1) if serverhello

    #option ssl-hello-chk

    server x_testdomain_stag 123.123.123.123:443


backend ssl_testdomain_prod
   mode tcp
   #option nolinger
   option tcplog
   balance roundrobin
   hash-type consistent
   option srvtcpka

    # maximum SSL session ID length is 32 bytes.
    stick-table type binary len 32 size 30k expire 30m

    # make sure we cover type 1 (fallback)
    acl clienthello req_ssl_hello_type 1
    acl serverhello rep_ssl_hello_type 2

    # use tcp content accepts to detects ssl client and server hello.
    tcp-request inspect-delay 5s
    tcp-request content accept if clienthello

    # no timeout on response inspect delay by default.
    tcp-response content accept if serverhello

    # SSL session ID (SSLID) may be present on a client or server hello.
    # Its length is coded on 1 byte at offset 43 and its value starts
    # at offset 44.
    # Match and learn on request if client hello.
    stick on payload_lv(43,1) if clienthello

    # Learn on response if server hello.
    stick store-response payload_lv(43,1) if serverhello

    #option ssl-hello-chk

    server x_testdomain_prod 123.123.111.111:443

इस उदाहरण का तात्पर्य है कि आप अपने एसएसएल को वेबसर्वर बैकएंड पर समाप्त कर देते हैं, मैंने अभी तक हैप्रोक्सी एसएसएल टर्मिनेशन के साथ ऐसा करने की कोशिश नहीं की है।

यदि आप यही चाहते हैं, तो शायद यह उदाहरण इसे काम करने में मदद करता है।

वहाँ एक और उदाहरण है जो use_backend के बजाय use_server का उपयोग करता है यहाँ


6
2018-06-13 13:07