Проверить цепочку сертификатов в формате PKCS # 7

Я извлек PKCS # 7, отформатированный в ASN1, и хотел бы проверить его цепочку сертификатов (это означает, что каждый сертификат был правильно подписан сертификатом над ним от корня до листа).

В openssl есть следующий API:

int PKCS7_verify(PKCS7 *p7, 
                 STACK_OF(X509) *certs, 
                 X509_STORE *store, 
                 BIO *indata, 
                 BIO *out, 
                 int flags);

Однако у меня нет надежного хранилища сертификатов.

У меня есть отдельная функция, которая проверяет целостность корневого сертификата, и мне этого достаточно.

Предполагая, что я уже доверяю корневому сертификату, зачем мне нужна структура сертификатов хранилища, чтобы убедиться, что цепочка подписана правильно?

Благодарность


person Zohar81    schedule 07.11.2018    source источник
comment
Обратите внимание, что X509_cert_verify, который PKCS7_verify вызывает (если вы не установите PKCS7_NOVERIFY, как заметил Рейнье), выполняет довольно полную проверку цепочки, которая намного больше, чем просто проверка подписи каждого сертификата его родителем. Он также проверяет срок действия, несколько расширений, если они есть, особенно BC и KU, и отзыв, если предоставлены списки отзыва сертификатов (что в настоящее время редко).   -  person dave_thompson_085    schedule 10.11.2018


Ответы (1)


Вопрос в том, зачем мне магазин, чтобы проверять, правильно ли подписана цепочка?

Вам не обязательно нужен параметр хранилища, вы также можете установить его в NULL и просто проверять подпись, а не всю цепочку сертификатов. В этом случае следует использовать флаг PKCS7_NOVERIFY, как описано в руководстве . для PKCS7_verify(). Однако, если вы также хотите проверить цепочку сертификатов, вам нужно будет каким-то образом предоставить механизм, чтобы сообщить OpenSSL, что вы доверяете корневому сертификату, и X509_STORE - способ добиться этого.

Однако у меня нет надежного магазина сертификатов.

Из вашего вопроса не совсем понятно, в какой у вас ситуации. Но вы же пишете, что у вас есть отдельная функция для «проверки целостности корневого сертификата».

В этом случае вы можете создать экземпляр объекта X509_STORE с помощью X509_STORE_new() и добавьте к нему свой доверенный сертификат. В дереве исходного кода OpenSSL есть пример того, что в setup_verify (), которая предназначена для случая, когда доверенный сертификат доступен в файле. Или вы можете использовать X509_STORE_add_cert (), если это лучше соответствует вашим целям. После добавления этого доверенного сертификата вы можете использовать хранилище в качестве параметра для своего PKCS7_verify() вызова.

person Reinier Torenbeek    schedule 07.11.2018
comment
Привет и спасибо за вашу драгоценную помощь. Чтобы уточнить, все, что я получил, это структура PKCS # 7 в формате asn1, извлеченная из PE-файла. Первый этап - это проверка корневого сертификата путем его хеширования и сравнения результата с предопределенным списком хэшей сертификатов. Затем я хотел бы убедиться, что все сертификаты в цепочке были правильно подписаны своим сертификатом верхнего уровня (за исключением, конечно, корневого). Итак, если добавить корневой сертификат в X509_store, этого будет достаточно, чтобы pkcs7_verify проверил всю цепочку, верно? - person Zohar81; 08.11.2018
comment
Чтобы получить структуру OpenSSL PKCS7 * из формата ASN.1, вам необходимо использовать _ 2_, но, возможно, вы это уже сделали. Но помимо этого: да, если вы доверяете этому корневому сертификату, вы можете добавить его в X509_STORE, и этого должно быть достаточно для PKCS7_verify(), чтобы проверить подпись, а также цепочку сертификатов до вашего доверенного сертификата. - person Reinier Torenbeek; 08.11.2018
comment
Спасибо, вы подтвердили мою теорию. - person Zohar81; 08.11.2018
comment
Не за что. Однако лучший способ получить подтверждение - это создать набор тестов :-) - person Reinier Torenbeek; 08.11.2018
comment
Привет, после того, как я попытался проверить свой pkcs # 7 этим методом, я получил следующую ошибку от ERR_print_error_fp: 140735569544136:error:21075075:lib(33):func(117):reason(117):pk7_smime.c:336:Verify error:unable to get local issuer certificate есть идеи, что это значит? Благодарность - person Zohar81; 10.11.2018
comment
Похоже, OpenSSL не может построить всю цепочку сертификатов до доверенного сертификата. Может быть, pkcs7 app (для проверки цепочек) или приложение smime (для проверки) может помочь вам проанализировать ситуация? - person Reinier Torenbeek; 10.11.2018
comment
Кроме того, является ли ваш доверенный сертификат самоподписанным? Если нет, то ознакомьтесь с описанием флага X509_V_FLAG_PARTIAL_CHAIN в документации на X509_VERIFY_PARAM_set_flags() - person Reinier Torenbeek; 10.11.2018
comment
Привет, я пробовал использовать эти инструменты и успешно получил цепочку с помощью openssl pkcs7. однако не удалось выполнить проверку по той же причине. Проблема объясняется в отдельном вопросе здесь: stackoverflow.com/questions/53243943/. может ты можешь взглянуть? - person Zohar81; 11.11.2018
comment
Я опубликовал ответ на этот вопрос. - person Reinier Torenbeek; 11.11.2018