Я совершенно новичок в OpenSSL и читаю учебник по программированию OpenSSL для подключения к серверу:
www.rtfm.com/openssl-examples/part1.pdf
www.rtfm.com/openssl-examples/part2.pdf
Как-то настроить правильные сертификаты сложнее, чем ожидалось ... :(
Когда я тестирую сообщение с помощью openssl s_client:
openssl s_client -connect 123.456.789.0:666 -CAfile test.crt -debug
Я получаю сообщение об ошибке
depth = 2 C = GB, ST = Большой Манчестер, L = Salford, O = COMODO CA Limited, CN = COMODO RSA Certification Authority verify error: num = 20: невозможно получить подтверждение сертификата местного эмитента, возврат: 0
а потом:
ошибка: 14094412: подпрограммы SSL: SSL3_READ_BYTES: предупреждение sslv3, неверный сертификат: s3_pkt.c: 1257: номер предупреждения SSL 42 140685406562208: ошибка: 140790E5: подпрограммы SSL: SSL23_WRITE: сбой подтверждения ssl: s23_lib.c: 177:
Вот цепочка сертификатов:
Certificate chain
0
s:myself
i:/C=GB/ST=Greater Manchester/L=Salford/O=COMODO CA Limited/CN=COMODO RSA Organization Validation Secure Server CA
1
s:/C=GB/ST=Greater Manchester/L=Salford/O=COMODO CA Limited/CN=COMODO RSA Organization Validation Secure Server CA
i:/C=GB/ST=Greater Manchester/L=Salford/O=COMODO CA Limited/CN=COMODO RSA Certification Authority
2
s:/C=GB/ST=Greater Manchester/L=Salford/O=COMODO CA Limited/CN=COMODO RSA Certification Authority
i:/C=SE/O=AddTrust AB/OU=AddTrust External TTP Network/CN=AddTrust External CA Root
Я уже несколько часов пытаюсь заставить систему распознавать эти сертификаты как правильные, но безрезультатно ...
Что я пробовал до сих пор:
Операционная система - Fedora.
Есть ли структурированный способ решения этой проблемы?
Изменить: сертификат был создан следующим образом:
openssl req -new -x509 -sha256 -days 365 -key mykey.key -out test.crt
Обязательно включите все промежуточные сертификаты и убедитесь, что они актуальны. Если test.crt
на самом деле файл, содержащий только /C=SE/O=AddTrust AB/OU=AddTrust External TTP Network/CN=AddTrust External CA Root
, это правильный подход. Вы также можете включить корень, и большинство клиентов будут принимать такие цепочки, но некоторые будут подавляться.
Как правило, лучше всего включать все сертификаты от вашего до последнего перед корневым, на случай, если у клиента нет последнего промежуточного звена.
Также возможно, что test.crt
содержит вещи, отличные от правильной цепочки. OpenSSL не выполняет частичную проверку цепочки по умолчанию (в более старых версиях она вообще этого не делает). При работе в этом режиме ему все равно, что находится в / etc / ssl / certs.
В качестве альтернативы вы можете предъявить промежуточный сертификат с истекшим сроком действия. Центры сертификации часто повторно сертифицируют свои промежуточные звенья с тем же ключом; если они это сделают, просто загрузите обновленный сертификат промежуточного ЦС и замените просроченный сертификат в своей цепочке.
Наконец, с помощью openssl s_client вам нужно указать, против чего он проверяется. Например, используйте опцию -CApath /etc/ssl/certs
или -CAfile your_ca.crt
. Для первого варианта используйте хранилище доверенных сертификатов вашей системы, а для второго варианта укажите сертификат корневого ЦС.
Сравните файлы сертификатов друг с другом.
По умолчанию у нас есть 3 файла (на основе обычного ЦС или самозаверяющих):
Итак, подходит ли ключ к сертификату, а сертификат - к CA? Аннотация: хотя имена похожи на * .crt или * .key, формат - PEM
# (openssl x509 -noout -modulus \
-in /path/to/server.crt | \
openssl md5 ; openssl rsa -noout -modulus \
-in /path/to/server.key | openssl md5) | uniq
Ожидаемый результат - ровно 1 строка, например
(stdin)= a634dfd21796c72dcf8c809d3bacc966
Если вы видите 2 строки, значит ключ и сертификат НЕ совпадают.
Если все в порядке, продолжайте
# openssl verify -CAfile /path/to/ca.crt /path/to/server.crt
Ты хочешь увидеть
server.crt: OK
Если один из двух шагов завершится неудачно, рекомендуется воссоздать сертификаты / ключи. Если оба в порядке, вы знаете, что вам нужно искать в другом месте, чтобы устранить препятствия (разрешения, измененный CA, одна сторона работает с openssl, а другая - с GNUTls, ...)