ฉันมีปัญหากับลูกค้ารายหนึ่งซึ่งกระทบกับตัวโหลดบาลานซ์ haproxy ของฉัน ข้อความแสดงข้อผิดพลาดในบันทึก haproxy:]

incoming_ssl/1: SSL handshake failure

ไคลเอนต์ที่เป็นปัญหาดูเหมือนจะเป็นไคลเอนต์ Apache Java หรือเซิร์ฟเวอร์ ActiveMq ไม่ว่าจะด้วยวิธีใด เป็นเซิร์ฟเวอร์ระยะไกลซึ่งเราไม่สามารถควบคุมได้

ใช้ ssldump ฉันเห็นบรรทัดเหล่านี้:

11 5  0.4152 (0.1649)  C>S  Alert
    level           fatal
    value           certificate_unknown
11    0.4152 (0.0000)  C>S  TCP FIN

การใช้ curl / browser ทุกอย่างดูดีและฉันได้ตรวจสอบ ssl แล้วซึ่งรายงานว่าไม่มีปัญหาดังกล่าว

ฉันได้ดึงออกจากไฟล์กำหนดค่า haproxy ของฉันให้มากที่สุดเพื่อวินิจฉัยปัญหา ฉันได้ทดสอบแม้กระทั่งการกดปุ่มเซิร์ฟเวอร์แบ็กเอนด์ (NodeJS) โดยตรงซึ่งทำงานได้ดี - ลูกค้าสามารถเชื่อมต่อได้ มันเป็น defo haproxy ฉันไม่รู้ว่าจะแก้ไขได้อย่างไร

ไฟล์ conf haproxy พื้นฐานของฉันมีลักษณะดังนี้:

frontend incoming_ssl
  bind *:443 ssl crt /etc/haproxy/cert.key ca-file /etc/haproxy/cert.pem ciphers ECDHE-RSA-AES256-SHA:RC4-SHA:RC4:HIGH:!MD5:!aNULL:!EDH:!AESGCM
  acl flume hdr_dom(host) -i dom.ain.com
  use_backend flume if flume

backend flume :80
  server flume 10.40.14.1:8000 weight 1 maxconn 1000 check inter 2000

ได้ลองใช้แบ็กเอนด์ ssl ด้วย - ปัญหาเดียวกัน ได้ลองลบส่วนรหัสด้วย

กำลังใช้ใบรับรองของ godaddy ซึ่งถือว่าใช้ได้สำหรับ curl / browsers หากตั้งค่าน่ารำคาญเล็กน้อย

มีอะไรอีกบ้างที่ฉันสามารถทำได้เพื่อให้สิ่งนี้ใช้งานได้ ฉันกำลังใช้งาน haproxy 1.5 รุ่นพัฒนาล่าสุด 26 แต่ยังได้ลองใช้รุ่นล่าสุดอื่น ๆ

answer

ไคลเอ็นต์นี้ไม่รู้จักใบรับรองว่าเป็นใบรับรองที่ถูกต้อง

ใบรับรองระดับกลางของ Godaddy จะต้องรวมอยู่ในไฟล์ที่โหลดโดย "crt"

ตรวจสอบว่าสายใบรับรองทั้งหมดรวมอยู่ในใบรับรองของเซิร์ฟเวอร์อย่างถูกต้อง:

crt /etc/haproxy/cert.key

จากเอกสารประกอบ haproxy สำหรับคีย์เวิร์ด "crt" :

Some CAs (such as Godaddy) offer a drop down list of server types that do not include HAProxy when obtaining a certificate. If this happens be sure to choose a webserver that the CA believes requires an intermediate CA (for Godaddy, selection Apache Tomcat will get the correct bundle, but many others, e.g. nginx, result in a wrong bundle that will not work for some clients).

ฉันคิดว่าคุณเข้าใจผิดเกี่ยวกับสิ่งที่ ca-file ทำ

ทำเช่นนี้:

cd /etc/haproxy
cat cert.pem cert.key > cert.bundle

bind *:443 ssl crt /etc/haproxy/cert.bundle ciphers ECDHE-RSA-AES256-SHA:-RC4-SHA:HIGH:!MD5:!aNULL:!EDH

ฉันยังตั้งค่า haproxy (2016-05) และในบันทึกฉันได้รับข้อผิดพลาด

ssl/1: SSL handshake ล้มเหลว

ดูเหมือนว่า ssh v2 จะรอเซิร์ฟเวอร์ก่อนที่จะพูด ทำให้ haproxy เข้าใจผิดว่าเป็นการเชื่อมต่อ ssl

การแก้ไขได้เพิ่มบรรทัดต่อไปนี้ใน~/.ssh/config

Host my.host.com
  HostName my.host.com
  Port 443
  User MeMe
  ProxyCommand openssl s_client -connect my.host.com:443 -quiet