Проверка того, является ли определенный корневой CA доверенным в системе

Моя цель - проверить, доверяет ли определенный корневой центр сертификации активному пользователю. В настоящее время у меня есть рабочее решение, которое мне удалось собрать, используя несколько других ответов 1, 2, но оно мне кажется очень запутанным, поэтому я прошу альтернативные (или, по крайней мере, упрощенные) предложения от людей, которые (в отличие от меня) знать, что они делают.

Я предполагаю, что это будет выполнено непривилегированным пользователем (то есть тем, кто не может установить новые пакеты), поэтому я хотел бы использовать утилиты, которые, вероятно, поставляются в комплекте с большинством дистрибутивов unix/linux (в отличие, например, от certutil). По этой причине текущее решение использует awk, grep а также openssl, которые кажутся довольно универсальными.

Еще одна вещь, которую я должен отметить, это то, что меня не волнуют возможные последствия для безопасности, которые могут возникнуть при тестировании сертификатов, как я.

Вот мой текущий код:

awk -v cmd='openssl x509 -noout -issuer' '/BEGIN/{close(cmd)};{print | cmd}'
   < /etc/ssl/certs/ca-certificates.crt 
   | grep -F 'issuer=C = US, O = company, CN = localhost, OU = engineering'

Оно использует awk в сочетании с openssl перебирать все существующие сертификаты, выводя их Issuerзатем обвязать его grep проверить, существует ли требуемая строка.

Вывод, который я получаю в случае положительного совпадения, - это искомая строка, хотя все, что мне нужно, это двоичный ответ (true/false, yes/no, 1/0...)

Любое предложение о том, как достичь своей цели более простым и / или более универсальным способом?

1 ответ

Вы можете сэкономить вызов awk обработав все сертификаты, используя openssl в одиночестве. Согласно этому ответу о сбое сервера, следующее будет использовать промежуточное преобразование для предоставления того же объема информации (т. Е. Эмитента для каждого сертификата во входном файле), который можно отфильтровать для данных, которые вы ищете:

openssl crl2pkcs7 -nocrl -certfile /etc/ssl/certs/ca-certificates.crt \
   | openssl pkcs7 -print_certs -noout \
   | grep '^issuer=/C=US/O=company/CN=localhost/OU=engineering'

Я считаю это улучшением, потому что он не использует громоздкий вызов awk (что также будет другой зависимостью), и вывод pkcs7 кажется гораздо более машиночитаемым, чем исходный вывод из пробелов x509,

Обратите внимание, что вы можете использовать возвращаемое значение выше grep вызовите, чтобы сказать, является ли данный корневой CA доверенным:

openssl crl2pkcs7 -nocrl -certfile /etc/ssl/certs/ca-certificates.crt \
   | openssl pkcs7 -print_certs -noout \
   | grep -q '^issuer=/C=US/O=company/CN=localhost/OU=engineering' && echo 'Certificate found!'
Другие вопросы по тегам