การจับมือ tls ล้มเหลว ไม่มี IP SAN ใด ๆ


28

ฉันกำลังพยายามตั้งค่าผู้ส่งต่อ logstash แต่ฉันมีปัญหากับการสร้างช่องทางที่ปลอดภัย กำลังพยายามกำหนดค่าสิ่งนี้กับเครื่อง ubuntu สองเครื่อง (เซิร์ฟเวอร์ 14.04) ที่ทำงานใน virtualbox สะอาด 100% (ไม่ใช่ไฟล์โฮสต์ที่แตะต้องหรือติดตั้งแพ็คเกจอื่นนอกเหนือจาก java, ngix, elastisearch และอื่น ๆ ที่จำเป็นสำหรับ logstash)

ฉันไม่เชื่อว่านี่เป็นปัญหา logstash แต่การจัดการใบรับรองที่ไม่เหมาะสมหรือสิ่งที่ไม่ได้ตั้งค่าอย่างถูกต้องทั้งใน logstash ubuntu หรือเครื่องส่งของ

ฉันสร้างกุญแจ:

sudo openssl req -x509 -batch -nodes -newkey rsa:2048 -keyout private/logstash-forwarder.key -out certs/logstash-forwarder.crt

อินพุตของฉัน conf บนเซิร์ฟเวอร์ logstash:

input {
  lumberjack {
    port => 5000
    type => "logs"
    ssl_certificate => "/etc/pki/tls/certs/logstash-forwarder.crt"
    ssl_key => "/etc/pki/tls/private/logstash-forwarder.key"
  }
}

คีย์ถูกคัดลอกไปยังโฮสต์ของผู้ส่งซึ่งมีการกำหนดค่าต่อไปนี้

{
  "network": {
    "servers": [ "192.168.2.107:5000" ],
    "timeout": 15,
    "ssl ca": "/etc/pki/tls/certs/logstash-forwarder.crt"
    "ssl key": "/etc/pki/tls/certs/logstash-forwarder.key"
  },
  "files": [
    {
      "paths": [
        "/var/log/syslog",
        "/var/log/auth.log"
       ],
      "fields": { "type": "syslog" }
    }
   ]
}

เมื่อเซิร์ฟเวอร์ logstash ทำงานอยู่ฉัน'sudo service logstash-forwarder start'บนเครื่องส่งต่อทำให้ฉันมีข้อผิดพลาดซ้ำ ๆ กันดังต่อไปนี้:

Jul  9 05:06:21 ubuntu logstash-forwarder[1374]: 2014/07/09 05:06:21.589762 Connecting to [192.168.2.107]:5000 (192.168.2.107)
Jul  9 05:06:21 ubuntu logstash-forwarder[1374]: 2014/07/09 05:06:21.595105 Failed to tls handshake with 192.168.2.107 x509: cannot validate certificate for 192.168.2.107 because it doesn't contain any IP SANs
Jul  9 05:06:22 ubuntu logstash-forwarder[1374]: 2014/07/09 05:06:22.595971 Connecting to [192.168.2.107]:5000 (192.168.2.107)
Jul  9 05:06:22 ubuntu logstash-forwarder[1374]: 2014/07/09 05:06:22.602024 Failed to tls handshake with 192.168.2.107 x509: cannot validate certificate for 192.168.2.107 because it doesn't contain any IP SANs

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

ขอบคุณ

คำตอบ:


40

... ไม่สามารถจับมือ tls กับ 192.168.2.107 x509: ไม่สามารถตรวจสอบใบรับรองสำหรับ 192.168.2.107 ได้เนื่องจากไม่มี IP SAN ใด ๆ

SSL ต้องการการระบุตัวตนของเพื่อนมิฉะนั้นการเชื่อมต่อของคุณอาจจะต่อต้านคนกลางซึ่งถอดรหัส + sniffs / แก้ไขข้อมูลแล้วส่งต่อพวกเขาเข้ารหัสอีกครั้งเพื่อเป้าหมายที่แท้จริง การระบุจะกระทำด้วยใบรับรอง x509 ซึ่งจะต้องมีการตรวจสอบกับ CA ที่เชื่อถือได้และต้องระบุเป้าหมายที่คุณต้องการเชื่อมต่อ

โดยปกติแล้วเป้าหมายจะได้รับเป็นชื่อโฮสต์และจะถูกตรวจสอบกับชื่อเรื่องและชื่ออื่นของใบรับรอง ในกรณีนี้เป้าหมายของคุณคือ IP การตรวจสอบความถูกต้องของใบรับรองจะต้องได้รับใบรับรอง n ในส่วนชื่อทางเลือกของชื่อเรื่อง แต่ไม่เป็นรายการ DNS (เช่นชื่อโฮสต์) แต่เป็น IP แทน

ดังนั้นสิ่งที่คุณต้องมีคือ:

  1. แก้ไขของคุณ/etc/ssl/openssl.cnf ในโฮสต์ logstash - เพิ่มsubjectAltName = IP:192.168.2.107ใน[v3_ca] ส่วน

  2. สร้างใบรับรองใหม่

  3. คัดลอกใบรับรองและคีย์ไปยังโฮสต์ทั้งสอง

PS ลองเพิ่ม-days 365หรือมากกว่านั้นใน commandline การสร้างใบรับรองเนื่องจากความถูกต้องของใบรับรองเริ่มต้นคือเพียง 30 วันและคุณอาจไม่ต้องการสร้างใหม่ทุกเดือน


ขอบคุณสำหรับการตอบกลับอย่างรวดเร็ว ฉันสร้างใบรับรองใหม่บนเซิร์ฟเวอร์ การตรวจสอบอย่างรวดเร็วให้ฉันต่อไปนี้: ผู้ออก: C = AU, ST = บางรัฐ, O = อินเทอร์เน็ต Widgits Pty Ltd, CN = 192.168.2.107 โดยที่ 2.107 เป็นเซิร์ฟเวอร์ logstash ip ฉันจะคัดลอก crt และคีย์ไปยังเครื่องอื่น (ตัวส่งต่อ) และนำไปใช้กับการกำหนดค่า เสียงนี้ถูกต้องสำหรับคุณหรือไม่? เพราะมันยัง
ครวญคราง

โปรดละเว้นความคิดเห็นของฉันด้านบน ตอนนี้ฉันได้แก้ไข /etc/ssl/openssl.cnf และเพิ่ม subjectAltName = IP: 192.168.2.107 สร้างใบรับรองใหม่ด้วย: 'sudo openssl req -x509 -nodes -newkey rsa: 2048 -keyout private / logstash-forwarder.key - ออก certs / logstash-forwarder.crt 'คัดลอกพวกเขาไปแล้วและใช้การกำหนดค่าและเริ่มต้นใหม่ (ทั้งสองกล่อง) น่าเสียดายที่ยังคงเป็นปัญหาเดียวกัน มีเวลาที่ยากลำบากในการค้นหากรณีที่คล้ายกันกับ Google ดังนั้นหวังว่าคุณจะสามารถพาฉันไปยังเส้นทางที่ถูกต้องได้หรือไม่? :)
connery

1
ปัญหาเดียวกันจริง ๆ หรือข้อความแสดงข้อผิดพลาดอื่น (เช่นไม่ทราบ CA หรือคล้ายกัน)? กรุณาโพสต์ส่วนสำคัญของใบรับรองเช่น openssl x509 -textจากใบรับรองที่ติดตั้งบนเซิร์ฟเวอร์ โปรดตรวจสอบopenssl s_clientด้วยว่าเซิร์ฟเวอร์ส่งคืนใบรับรองที่คาดหวังและใช้-CApathกับ s_client เพื่อตรวจสอบว่าเชนความน่าเชื่อถือสามารถตรวจสอบกับ CA ที่กำหนดค่าได้
Steffen Ullrich

ฉันจัดการเพื่อให้มันทำงานได้ ฉันใส่หัวเรื่องAltNameในส่วนที่ไม่ถูกต้อง วิธีการทำงาน: โดยทั่วไปฉันแก้ไข openssl.cnf ในส่วน [v3_ca] ฉันได้เพิ่ม 'subjectAltName = IP: 192.168.2.107' ผลิตใบรับรองใหม่และเพิ่มไปยังเซิร์ฟเวอร์ + ไคลเอนต์ ขอบคุณสำหรับความช่วยเหลือของคุณ! :)
connery

9

มีสคริปต์สำหรับสร้าง certs ที่เหมาะสมสำหรับคนตัดไม้ที่ถูกกล่าวถึงในตั๋ว gitub logstash: การจับมือ SSL ล้มเหลวเนื่องจาก IP SANs หายไป

ดาวน์โหลดไฟล์:

curl -O https://raw.githubusercontent.com/driskell/log-courier/1.x/src/lc-tlscert/lc-tlscert.go

... สร้างมัน:

go build lc-tlscert.go

.. และรัน:

./lc-tlscert 
Specify the Common Name for the certificate. The common name
can be anything, but is usually set to the server's primary
DNS name. Even if you plan to connect via IP address you
should specify the DNS name here.

Common name: you_domain_or_whatever

The next step is to add any additional DNS names and IP
addresses that clients may use to connect to the server. If
you plan to connect to the server via IP address and not DNS
then you must specify those IP addresses here.
When you are finished, just press enter.

DNS or IP address 1: 172.17.42.1 (th ip address to trust)
DNS or IP address 2: 

How long should the certificate be valid for? A year (365
days) is usual but requires the certificate to be regenerated
within a year or the certificate will cease working.

Number of days: 3650
Common name: what_ever
DNS SANs:
    None
IP SANs:
    172.17.42.1

The certificate can now be generated
Press any key to begin generating the self-signed certificate.

Successfully generated certificate
    Certificate: selfsigned.crt
    Private Key: selfsigned.key

Copy and paste the following into your Log Courier
configuration, adjusting paths as necessary:
    "transport": "tls",
    "ssl ca":    "path/to/selfsigned.crt",

Copy and paste the following into your LogStash configuration, 
adjusting paths as necessary:
    ssl_certificate => "path/to/selfsigned.crt",
    ssl_key         => "path/to/selfsigned.key",

1
สิ่งนี้ช่วยฉันได้มากในวันนี้ ... แม้ว่าจะเป็น gitlab-runner ขอขอบคุณ!
Matt Messersmith

6

ฉันมีปัญหาจริงกับสิ่งนี้ ฉันไม่ได้ใช้ logstash ฉันแค่พยายามให้ IP SAN ทำงานกับ docker tls ฉันจะสร้างใบรับรองตามที่อธิบายไว้ในบทความนักเทียบท่าบน https ( https://docs.docker.com/articles/https/ ) จากนั้นเมื่อฉันจะเชื่อมต่อจากไคลเอนต์นักเทียบท่า:

docker --tlsverify  -H tcp://127.0.0.1:2376 version

ฉันจะได้รับข้อผิดพลาดนี้:

...
FATA[0000] An error occurred trying to connect: Get https://127.0.0.1:2376/v1.16/version: \
x509: cannot validate certificate for 127.0.0.1 because it doesn't contain any IP SANs 

ซึ่งทำให้ฉันบ้า ฉันยอมรับว่าฉันสะดุดทุกสิ่งใน opensl ดังนั้นทุกคนอาจรู้ว่าฉันค้นพบแล้ว ตัวอย่าง subjectAltName ที่นี่ (และที่อื่น ๆ ) แสดงการอัปเดตไฟล์ openssl.cnf ฉันไม่สามารถทำงานได้ ฉันหาตำแหน่งบน openssl.cnf แล้วคัดลอกไปยังไดเรกทอรีภายในแล้วทำการเปลี่ยนแปลง เมื่อฉันตรวจสอบใบรับรองมันไม่มีส่วนขยาย:

openssl x509 -noout -text -in server-cert.pem

คำสั่งที่ใช้เพื่อสร้างใบรับรองนั้นอยู่ที่นี่ (จากบทความนักเทียบท่า):

openssl x509 -req -days 365 -in server.csr -CA ca.pem -CAkey ca-key.pem \
    -CAcreateserial -out server-cert.pem

คุณไม่สามารถเพิ่มบรรทัด -config openssl.cnf ให้กับคำสั่งนี้มันไม่ถูกต้อง คุณไม่สามารถคัดลอกไฟล์ openssl.cnf ไปยังไดเรกทอรีปัจจุบันปรับเปลี่ยนและหวังว่าจะสามารถใช้งานได้ ไม่กี่บรรทัดต่อมาฉันสังเกตเห็นว่าใบรับรอง 'ไคลเอนต์' ใช้ -extfile extfile.cnf ดังนั้นฉันลองทำสิ่งนี้:

echo subjectAltName = IP:127.0.0.1 > extfile.cnf
openssl x509 -req -days 365 -in server.csr -CA ca.pem -CAkey ca-key.pem -CAcreateserial \
   -out server-cert.pem -extfile extfile.cnf

และนั่นก็แก้ไขมัน ดังนั้นไม่ว่าด้วยเหตุผลใดเวอร์ชัน openssl ของฉันไม่อนุญาตให้ฉันแก้ไขไฟล์ openssl.cnf แต่ฉันสามารถระบุหัวเรื่องAltNameเช่นนี้ได้ ใช้งานได้ดี!

คุณสามารถระบุที่อยู่ IP จำนวนเท่าใดก็ได้เช่น IP: 127.0.0.1, IP: 127.0.1.1 (ไม่ใช่โฮสต์ในพื้นที่เช่นกัน)


Ah-Ha! ขอบคุณฉันกำลังทำสิ่งเดียวกับคุณกับนักเทียบท่าและพบปัญหานี้ ฉันจะลองคำแนะนำของคุณตอนนี้
Mark Jones

0

โปรดดูโซลูชันของ @Steffen Ullrich ด้านบนเพื่อการแก้ไขอย่างรวดเร็ว

นอกจากนี้ยังมีปัญหา / คุยเกี่ยวกับมันใน GitHub ดู (เร็ว ๆ นี้ขณะนี้กำลังดำเนินการอยู่) เพื่อหาวิธีแก้ไขที่ง่ายขึ้น

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