Apakah lansiran “SSL3_READ_BYTES: sslv3 sertifikat buruk lansiran” yang menunjukkan bahwa SSL gagal

17

Saat menjalankan perintah di bawah ini openssl s_client -host example.xyz -port 9093

Saya mendapatkan kesalahan berikut:

139810559764296:error:14094412:SSL routines:SSL3_READ_BYTES:sslv3 alert bad certificate:s3_pkt.c:1259:SSL alert number 42
39810559764296:error:140790E5:SSL routines:SSL23_WRITE:ssl handshake failure:s23_lib.c:184:

Tetapi pada akhirnya saya mendapat "Verify return code: 0 (ok)"pesan.

Pertanyaan saya adalah apa yang ditandakan oleh peringatan di atas, dan apakah SSL benar-benar berhasil. Terima kasih banyak atas bantuannya sebelumnya.

SSL handshake has read 6648 bytes and written 354 bytes
New, TLSv1/SSLv3, Cipher is AES128-SHA
Server public key is 2048 bit
Secure Renegotiation IS supported
Compression: NONE
Expansion: NONE
SSL-Session:
Protocol  : TLSv1.2
Cipher    : AES128-SHA
Session-ID: xx
Session-ID-ctx:
Master-Key: xx
Key-Arg   : None
Krb5 Principal: None
PSK identity: None
PSK identity hint: None
Start Time: 1475096098
Timeout   : 300 (sec)
**Verify return code: 0 (ok)**
kris433
sumber

Jawaban:

25

"Kegagalan jabat tangan" berarti jabat tangan gagal, dan tidak ada koneksi SSL / TLS. Anda harus melihat bahwa opensslkeluar ke shell (atau CMD dll) dan tidak menunggu data input dikirim ke server. "Verifikasi kode pengembalian 0" berarti bahwa tidak ada masalah yang ditemukan dalam sertifikat server, baik karena tidak diperiksa sama sekali atau karena sudah diperiksa dan baik (sejauh pemeriksaan OpenSSL berjalan, yang tidak mencakup semuanya); dalam hal ini dengan mengetahui protokol kita dapat menyimpulkan kasus terakhir berlaku.

Menerima peringatanbad certificate (kode 42) berarti server meminta Anda untuk mengautentikasi dengan sertifikat, dan Anda tidak melakukannya, dan itu menyebabkan kegagalan jabat tangan. Beberapa baris sebelum baris, SSL handshake has read ... and written ...Anda akan melihat garis yang Acceptable client certificate CA namesbiasanya diikuti oleh beberapa baris yang mengidentifikasi CA, mungkin diikuti oleh garis awal Client Certificate Typesdan mungkin beberapa tentang Requested Signature Algorithmstergantung pada versi OpenSSL Anda dan protokol yang dinegosiasikan.

Temukan sertifikat yang dikeluarkan oleh CA di daftar 'dapat diterima', atau jika kosong cari dokumentasi di atau tentang server yang mengatakan CA mana yang dipercayai atau hubungi operator server atau pemilik dan tanyakan kepada mereka, ditambah kunci pribadi yang cocok , keduanya dalam format PEM, dan tentukan dengan -cert $file -key $file; jika Anda memiliki keduanya dalam satu file, seperti yang dimungkinkan dengan PEM, gunakan saja-cert $file. Jika Anda memilikinya dalam format yang berbeda, tentukan itu, atau cari di sini dan mungkin superuser dan keamanan. sudah ada banyak T&J tentang mengonversi berbagai format sertifikat dan privatekey. Jika sertifikat Anda memerlukan sertifikat "rantai" atau "perantara" (atau bahkan lebih dari satu) untuk diverifikasi, seperti yang sering terjadi untuk sertifikat dari CA publik (versus yang di dalam) tergantung pada bagaimana server dikonfigurasi, s_clientmembutuhkan trik: tambahkan sertifikat rantai ke truststore sistem Anda, atau buat truststore lokal / sementara yang berisi sertifikat CA yang perlu Anda verifikasi server PLUS dengan sertifikat rantai yang perlu Anda kirim.

Jika Anda tidak memiliki sertifikat seperti itu, Anda harus mendapatkannya, yang merupakan pertanyaan berbeda yang membutuhkan lebih banyak detail untuk dijawab, atau Anda perlu menemukan cara untuk terhubung ke server tanpa menggunakan otentikasi sertifikat; periksa lagi dokumentasi dan / atau tanya operator / pemilik.

EDIT: Tampaknya dari komentar Anda mungkin memiliki kunci klien dan rantai sertifikat serta jangkar server di Jawa. Saat memeriksa, saya tidak melihat jawaban yang ada untuk sepenuhnya menutupi kasus itu, jadi meskipun ini mungkin tidak akan mencari dengan baik:

# Assume Java keystore is type JKS (the default but not only possibility)
# named key.jks and the privatekey entry is named mykey (ditto)
# and the verify certs are in trust.jks in entries named trust1 trust2 etc.

# convert Java key entry to PKCS12 then PKCS12 to PEM files
keytool -importkeystore -srckeystore key.jks -destkeystore key.p12 -deststoretype pkcs12 -srcalias mykey 
openssl pkcs12 -in key.p12 -nocerts -out key.pem
openssl pkcs12 -in key.p12 -nokeys -clcerts -out cert.pem
openssl pkcs12 -in key.p12 -nokeys -cacerts -out chain.pem
# extract verify certs to individual PEM files
# (or if you 'uploaded' PEM files and still have them just use those)
keytool -keystore trust.jks -export -alias trust1 -rfc -file trust1.pem
keytool -keystore trust.jks -export -alias trust2 -rfc -file trust2.pem
... more if needed ...
# combine for s_client 
cat chain.pem trust*.pem >combined.pem
openssl s_client -connect host:port -key key.pem -cert cert.pem -CAfile combined.pem
dave_thompson_085
sumber
hai Dave; di bawah ini adalah prosedur yang kami ikuti. 1: Unggah root CA, dan sertifikat perantara ke dalam keystore. 2: Unggah sertifikat Comodo yang telah ditandatangani ke dalam keystore. 3: Unggah CA root, dan sertifikat perantara ke truststore. 4: Salin file keystore dan trustore ke setiap node di cluster (cassandra). Node menggunakan SSL untuk komunikasi, dan mereka tampaknya mengeluarkan data tanpa masalah. Namun ketika saya menjalankan perintah SSL yang disebutkan di atas, masalah muncul.
kris433
@ kris433: keystore apa itu? Prosedur yang Anda gambarkan terdengar seperti yang untuk Java jika (dan hanya jika) itu telah menghasilkan privatekey yang Anda peroleh (ed) 'sertifikat Comodo yang ditandatangani', walaupun jika Anda menggunakan instalasi Java standar, ia memiliki standar truststore yang termasuk Comodo, jadi Anda tidak perlu mengubahnya. OpenSSL tidak menggunakan Java keystore atau truststore dan secara default tidak menggunakan keystore sama sekali, itulah sebabnya Anda perlu menentukan file dengan -cert [-key]. Jika saya telah benar menafsirkan komentar Anda, lihat edit.
dave_thompson_085
Terima kasih banyak, Dave. Ini bekerja dengan sempurna. Anda menyelamatkan minggu saya. Jika Anda datang ke Philadelphia, steak keju dan Gelato ada di saya;). Terima kasih lagi.
kris433
@ kris433: sama-sama, tetapi StackExchange Official Way adalah menerima jawaban yang bermanfaat menggunakan tanda centang, sehingga sistem dapat secara otomatis menggunakan informasi ini dalam menampilkan hasil ke pertanyaan lain ; lihat 'tur' yang seharusnya Anda lihat ketika Anda datang ke situs ini, atau lebih khusus serverfault.com/help/someone-answers .
dave_thompson_085
0

Dalam kasus saya, saya mendapatkan kesalahan ini ketika kunci pribadi tidak cocok dengan sertifikat. Saya telah memperbarui sertifikat ketika sertifikat saya kedaluwarsa dan perlu membuat kunci pribadi baru. Namun, saya lupa untuk merujuknya di aplikasi saya. Ketika saya menunjuk ke kunci pribadi baru - kesalahan ini hilang.

Blake
sumber