Чи є сповіщення "SSL3_READ_BYTES: sslv3 попередження про поганий сертифікат", що вказує на те, що SSL не вдалося


17

Під час виконання наведеної нижче команди openssl s_client -host example.xyz -port 9093

Я отримую таку помилку:

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:

Але наприкінці я отримую "Verify return code: 0 (ok)"повідомлення.

Моє запитання - що означає вищезазначене попередження і чи справді SSL був успішним. Заздалегідь дякую за допомогу.

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)**

Відповіді:


25

"Помика рукостискання" означає, що рукостискання не вдалося, і немає з'єднання SSL / TLS. Ви повинні побачити, що він opensslвиходить до оболонки (або CMD тощо) і не чекає надсилання вхідних даних на сервер. "Перевірити код повернення 0" означає, що в сертифікаті сервера не було виявлено жодних проблем , або тому, що він взагалі не був перевірений, або тому, що він був перевірений і був хороший (що стосується перевірок OpenSSL, який не охоплює все); в цьому випадку, знаючи протокол, ми можемо зробити висновок про те, що застосовується останній випадок.

Отримання сповіщенняbad certificate (код 42) означає, що сервер вимагає підтвердити автентифікацію сертифікатом, а ви цього не зробили, і це призвело до відмови рукостискання. За кілька рядків перед рядком SSL handshake has read ... and written ...ви повинні побачити рядок, Acceptable client certificate CA namesза яким зазвичай слідує кілька рядків, що ідентифікують ЦС, можливо, за ним слід початок рядка, Client Certificate Typesа може бути, приблизно, Requested Signature Algorithmsзалежно від вашої версії OpenSSL та протоколу узгодженого погодження.

Знайдіть сертифікат, виданий CA в списку "прийнятний", або якщо він порожній, шукайте документацію на або про сервер із зазначенням, яким ЦС він довіряє, або зв'яжіться з операторами або власниками серверів і запитайте їх, а також відповідний приватний ключ , обидва в форматі PEM, і вказати їх з -cert $file -key $file; якщо у вас є обидва в одному файлі, як це можливо з PEM, просто використовуйте-cert $file. Якщо у вас їх є в іншому форматі, або вкажіть його, або шукайте тут, і можливо, суперпользователь і безпека.SX; вже багато запитань щодо перетворення різних форматів сертифікатів та приватних ключів. Якщо ваш сертифікат потребує "ланцюгової" або "проміжної" церт (або навіть більше ніж один) для перевірки, як це часто буває для церта з загальнодоступного центрального офісу (проти домашнього), залежно від налаштування сервера, s_clientвимагає хитрості: або додайте церковні cert (s) до вашої системної довіри магазину, або створіть локальну / тимчасову довірену сховище, що містить сертифікати CA, які вам потрібно перевірити на сервері ПЛЮС церт (-ів) ланцюга, які вам потрібно надіслати.

Якщо у вас немає такого сертифіката, вам або потрібно отримати його, це інше питання, на яке потрібно відповісти набагато детальніше, або вам потрібно знайти спосіб підключення до сервера без використання автентифікації сертифікатів; ще раз перевірте документацію та / або запитайте операторів / власників.

РЕДАКТУВАННЯ: З коментарів випливає, що у вас можуть бути клієнтський ключ та ланцюг cert, а також серверний якор (и)? Під час перевірки я не бачу хорошої існуючої відповіді, яка повністю висвітлює цей випадок, так що, мабуть, це не буде добре шукати:

# 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

привіт Дейв; нижче - процедура, яку ми дотримувались. 1: Завантажте кореневу службу CA та проміжні сертифікати в сховище ключів. 2: Завантажте підписаний сертифікат Comodo у сховище ключів. 3: Завантажте кореневий CA та проміжні сертифікати у сховище довіри. 4: Скопіюйте файли зберігання ключів та файли зберігання на кожен вузол кластеру (кассандра). Вузли використовують SSL для зв'язку, і вони, здається, викопують дані без проблем. Однак коли я запускаю вищезгадану команду SSL, проблема виникає.
kris433

@ kris433: що це за магазин брелоків? Процедура, яку ви описуєте, здається такою, як для Java, якщо (і лише якщо) вона вже створила приватну ключу, для якої ви отримуєте (ed) "підписаний сервер Comodo", хоча якщо ви використовуєте стандартну установку Java, вона має типовий довірений магазин, який включає Comodo, тому вам не потрібно змінювати це. OpenSSL не використовує жодного сховища Java чи довіри, і за замовчуванням він взагалі не використовує ніяких сховищ ключів, тому вам потрібно вказати файли за допомогою -cert [-key]. Якщо я правильно інтерпретував ваш коментар, див. Редагування.
dave_thompson_085

Дуже дякую Дейву. Це спрацювало чудово. Ти врятував мій тиждень. Якщо ви коли-небудь приїдете до Філадельфії, сирний стейк та Гелато на мене;). Ще раз дякую вам.
kris433

@ kris433: ласкаво просимо, але офіційний спосіб StackExchange повинен прийняти корисну відповідь за допомогою галочки, щоб система може автоматично використовувати цю інформацію для відображення результатів іншим клієнтам; перегляньте "тур", який ви повинні були подивитися, коли ви зайшли на цей сайт, а точніше serverfault.com/help/someone-answers .
dave_thompson_085

0

У моєму випадку я отримав цю помилку, коли приватний ключ не відповідав cert. Я оновив сертифікат, коли мій термін дії закінчився і мені потрібно було створити новий приватний ключ. Однак я забув посилатися на це у своєму додатку. Коли я вказав на новий приватний ключ - ця помилка пішла.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.