Я абсолютно плохо знаком с OpenSSL, и я читаю учебное руководство на программировании OpenSSL для соединения с сервером:
www.rtfm.com/openssl-examples/part1.pdf
www.rtfm.com/openssl-examples/part2.pdf
Somehow, настраивающий корректные сертификаты, более хитер, чем ожидалось... :(
Когда я тестирую сообщение с openssl s_client:
openssl s_client - соединяются 123.456.789.0:666-CAfile test.crt - отладка
Я получаю сообщение об ошибке
depth=2 C = ГБ, ST = Большой Манчестер, L = Солфорд, O = COMODO CA Limited, CN = Центр сертификации COMODO RSA проверяет, что error:num=20:unable для получения локального сертификата выпускающего проверяют return:0
и затем:
предупреждение error:14094412:SSL routines:SSL3_READ_BYTES:sslv3 плохой certificate:s3_pkt.c:1257:SSL предупреждает квитирование номер 42 140685406562208:error:140790E5:SSL routines:SSL23_WRITE:ssl failure: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 или самозаверяющего):
Итак, подходит ли ключ к сертификату, а сертификат - к 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, ...)