Проверка того, является ли определенный корневой 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!'