Jabat tangan gagal. Tidak mengandung IP SAN apa pun

28

Saya mencoba mengatur forwarder logstash, tetapi saya memiliki masalah dengan membuat saluran aman yang tepat. Mencoba mengkonfigurasi ini dengan dua mesin ubuntu (server 14.04) yang berjalan di virtualbox. Mereka 100% bersih (tidak menyentuh file host atau menginstal paket lain selain java, ngix, elastisearch, dll yang diperlukan, untuk logstash)

Saya tidak percaya ini adalah masalah logstash, tetapi penanganan sertifikat yang tidak tepat atau sesuatu yang tidak disetel dengan benar pada logstash ubuntu atau mesin penerus.

Saya menghasilkan kunci:

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

Input input saya di server 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"
  }
}

Kunci disalin ke host forwarder , yang memiliki konfigurasi berikut.

{
  "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" }
    }
   ]
}

Dengan server logstash berjalan, saya 'sudo service logstash-forwarder start' pada mesin forwarder, memberi saya kesalahan berulang berikut:

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

Seperti yang saya sebutkan sebelumnya, saya tidak percaya ini adalah masalah logstash, tetapi masalah konfigurasi sertifikat / mesin. Masalahnya, saya sepertinya tidak bisa menyelesaikannya. Semoga beberapa orang pintar di sini dapat membantu saya?

Terima kasih

Connery
sumber

Jawaban:

40

... Gagal melakukan tsh handshake dengan 192.168.2.107 x509: tidak dapat memvalidasi sertifikat untuk 192.168.2.107 karena tidak mengandung IP SANs

SSL membutuhkan identifikasi rekan, jika tidak koneksi Anda mungkin bertentangan dengan man-in-the-middle yang mendekripsi + mengendus / memodifikasi data dan kemudian meneruskannya dienkripsi lagi ke target sebenarnya. Identifikasi dilakukan dengan sertifikat x509 yang perlu divalidasi terhadap CA tepercaya dan yang perlu mengidentifikasi target yang ingin Anda sambungkan.

Biasanya target diberikan sebagai nama host dan ini diperiksa terhadap subjek dan nama alternatif subjek sertifikat. Dalam hal ini target Anda adalah IP. Validasi sertifikat yang berhasil, IP harus diberikan pada sertifikat di dalam bagian nama alternatif subjek, tetapi bukan sebagai entri DNS (mis. Nama host) tetapi sebagai IP.

Jadi yang Anda butuhkan adalah:

  1. Mengedit Anda /etc/ssl/openssl.cnf pada host logstash - add subjectAltName = IP:192.168.2.107di [v3_ca] bagian.

  2. Buat kembali sertifikat

  3. Salin sertifikat dan kunci ke kedua host

PS Pertimbangkan untuk menambahkan -days 365atau lebih banyak ke baris perintah pembuatan sertifikat karena validitas sertifikat default hanya 30 hari dan Anda mungkin tidak ingin membuatnya kembali setiap bulan ..

Steffen Ullrich
sumber
Terima kasih atas balasan cepatnya. Saya membuat sertifikat baru di server. Inspeksi cepat memberi saya yang berikut: Penerbit: C = AU, ST = Beberapa Negara, O = Internet Widgits Pty Ltd, CN = 192.168.2.107 Di mana 2.107 adalah ip server logstash. Saya kemudian menyalin crt dan kunci ke mesin lain (forwarder) dan menerapkannya pada konfigurasi. Apakah ini benar bagi Anda? Karena masih mengeluh tentang hal yang sama ...: P
connery
Tolong abaikan komentar saya di atas. Saya sekarang telah mengedit /etc/ssl/openssl.cnf dan menambahkan subjectAltName = IP: 192.168.2.107 Membuat sertifikat baru dengan: 'sudo openssl req -x509 -node -newkey rsa: 2048 --kunci private / logstash-forwarder.key - out certs / logstash-forwarder.crt 'Menyalinnya dan menerapkan konfigurasi dan restart (pada kedua kotak). Sayangnya masalah masih sama. Memiliki kesulitan googling kasus serupa dalam hal ini, jadi semoga Anda dapat membimbing saya ke jalan yang benar? :)
connery
1
Benar-benar masalah yang sama atau pesan kesalahan lain (seperti CA yang tidak diketahui atau serupa)? Silakan kirim bagian penting dari sertifikat, misalnya openssl x509 -textdari sertifikat yang dipasang di server. Harap periksa juga openssl s_clientbahwa server mengembalikan sertifikat yang diharapkan dan gunakan -CApathdengan s_client untuk memeriksa bahwa rantai kepercayaan dapat diverifikasi terhadap CA yang dikonfigurasi.
Steffen Ullrich
Saya berhasil membuatnya bekerja. Saya menempatkan subjectAltName di bagian yang salah. Metode kerja: Pada dasarnya saya mengedit openssl.cnf, pada bagian [v3_ca] saya menambahkan 'subjectAltName = IP: 192.168.2.107'. Menghasilkan sertifikat baru dan ditambahkan ke server + klien. Terima kasih atas bantuan Anda! :)
connery
9

Ada skrip untuk membuat sertifikat yang tepat untuk penebang yang disebutkan pada tiket logstash github: Jabat tangan SSL gagal karena IP SAN hilang

Unduh file:

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

...bangun itu:

go build lc-tlscert.go

..dan lari:

./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",
michaelbn
sumber
1
Ini menghemat banyak waktu saya hari ini ... meskipun untuk gitlab-runner. Terima kasih!
Matt Messersmith
6

Saya punya masalah nyata dengan ini. Saya tidak menggunakan logstash, saya hanya mencoba untuk mendapatkan IP SAN untuk bekerja dengan buruh pelabuhan. Saya akan membuat sertifikat seperti yang dijelaskan dalam artikel buruh pelabuhan di https ( https://docs.docker.com/articles/https/ ), lalu ketika saya akan terhubung dari klien buruh pelabuhan:

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

Saya akan mendapatkan kesalahan ini:

...
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 

yang membuatku gila. Saya akui, saya tersandung di semua hal openssl, jadi, semua orang mungkin sudah tahu apa yang saya temukan. Contoh subjectAltName di sini (dan setiap tempat lainnya) menunjukkan pembaruan file openssl.cnf. Saya tidak bisa membuatnya bekerja. Saya melakukan pencarian di openssl.cnf, salin ke direktori lokal, lalu buat perubahan. Ketika saya memeriksa sertifikat itu tidak mengandung ekstensi:

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

Perintah yang digunakan untuk membuat sertifikat itu ada di sini (dari artikel buruh pelabuhan):

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

Anda tidak dapat menambahkan baris -config openssl.cnf ke perintah ini, ini tidak valid. Anda juga tidak dapat menyalin file openssl.cnf ke direktori saat ini, memodifikasinya, dan berharap membuatnya berfungsi seperti itu. Beberapa baris kemudian saya perhatikan bahwa sertifikat 'client' menggunakan extfile.cnf -extfile. Jadi, saya mencoba ini:

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

dan itu memperbaikinya. Jadi, untuk alasan apa pun versi openssl saya tidak memungkinkan saya untuk memodifikasi file openssl.cnf, tetapi, saya dapat menentukan subjectAltName seperti ini. Bagus sekali!

Anda dapat menentukan sejumlah alamat IP, seperti IP: 127.0.0.1, IP: 127.0.1.1 (juga bukan localhost).

Greg
sumber
Ah-Ha! Terima kasih, saya melakukan hal yang sama seperti Anda dengan buruh pelabuhan dan menyelesaikan masalah ini. Saya akan mencoba saran Anda sekarang.
Mark Jones