Openssl проверяет с помощью связанного CA и связанного Cert

У меня есть цепочка сертификатов как: root CA -> intermediate CA -> org CA -> client Cert

Когда я проверяю сертификат клиента с CA как root CA -> intermediate CA -> org CA, он работает:

$ cat org_1_ca/ca_crt.pem intermediate_ca/ca_crt.pem root_ca/ca_crt.pem > /tmp/test123.pem $ openssl verify -CAfile /tmp/test123.pem client/client_crt.pem client_crt.pem: OK

Но когда я связал свой клиентский сертификат с ЦС организации (org CA -> client Cert) и получил остальную часть цепочки как ЦС (root CA -> intermediate CA), это не так:

$ cat intermediate_ca/ca_crt.pem root_ca/ca_crt.pem > /tmp/test12.pem $ openssl verify -CAfile /tmp/test12.pem client/org1_client_crt.pem client/org1_client_crt.pem: C = US, ST = CA, L = LA, O = PP, OU = TEST, CN = user error 20 at 0 depth lookup:unable to get local issuer certificate

Это что-то принципиально неправильное или openssl verify это не нравится? Я пробовал то же самое с nginx и openssl connect, и там не повезло. Любая помощь приветствуется.


person Amir    schedule 05.06.2017    source источник
comment
Stack Overflow — это сайт для вопросов по программированию и разработке. Этот вопрос кажется не по теме, потому что он не о программировании или разработке. См. раздел О каких темах я могу задать здесь в Справочном центре. Возможно, Суперпользователь или Unix & Linux Stack Exchange лучше спросить. См. также раздел Где размещать вопросы о Dev Ops?   -  person jww    schedule 06.06.2017
comment
Хороший вопрос, в следующий раз уделю больше внимания!   -  person Amir    schedule 06.06.2017


Ответы (1)


Операция openssl командной строки verify считывает только один сертификат, первый, из файла, заданного в качестве операнда, или из каждого файла, если задано более одного. Это отличается от файлов, указанных с параметрами -CAfile -trusted -untrusted, которые могут (и обычно содержат) несколько сертификатов.

Ваш файл client/org1_client_crt.pem предположительно содержит сертификат клиента и сертификат 'org CA' в указанном порядке. Используется только сертификат клиента, сертификат 'org CA' игнорируется, и в результате у вас нет действительной цепочки для проверки.

Если вы хотите использовать командную строку для имитации/проверки проверки, которую будет выполнять получатель (для клиентского сертификата, сервера), укажите конечный сертификат в качестве операнда и все другие переданные (цепные) сертификаты с -untrusted, а привязки ) плюс любые «известные» промежуточные звенья в хранилище доверенных сертификатов, явные или заданные по умолчанию.

Нет операции openssl connect; Я предполагаю, что вы имеете в виду openssl s_client с параметрами, включая -connect, поскольку это единственное место, где имеет смысл использовать цепочку сертификатов клиента. Параметр -cert для s_client аналогичным образом использует только первый сертификат в файле. В командной строке нет возможности указать цепочку клиентов, за исключением самой последней версии, 1.1.0, и даже там она не задокументирована, поэтому вам нужно внимательно прочитать справочное сообщение или код, хотя API/библиотека давно поддерживает это для кода, который вы пишете сами.

Через 1.0.2, если вы хотите отправить сертификат клиента с полной цепочкой на сервер (как вы должны в соответствии с RFC), предполагая, что сервер запрашивает аутентификацию клиента, которая не является обычной и не используется по умолчанию для nginx (среди прочего), у вас есть использовать хитрость: предоставить все сертификаты, необходимые для клиентской цепочки в магазине доверенных сертификатов, в дополнение к якорям, необходимым для проверки сервера, либо используя -CAfile, либо /или -CApath явно, или используя (при необходимости изменяя) хранилище доверенных сертификатов по умолчанию, если только ваша openssl не является более старой версией, отличной от RedHat, где хранилище доверенных сертификатов по умолчанию не работало только в s_client s_server s_time.

То же самое относится и к сертификату/цепочке сервера в s_server, за исключением того, что он используется почти всегда, а не очень редко.

person dave_thompson_085    schedule 05.06.2017