Найдите, подписан ли сертификат самостоятельно или подписано CA

У меня есть веб-приложение, которое позволяет пользователю загружать pkcs12. Я храню pkcs12 как двоичный файл в базе данных. Есть ли какой-либо способ узнать, подписан ли сертификат в pkcs12 или подписали CA?

Я запускаю веб-приложение Java на tomcat и имею в своем распоряжении openssl.

Ответы

Ответ 1

Изменение: сегодня есть два лучших ответа на этот вопрос:

Тем не менее, я думаю, что есть кое-что более важное, что нужно знать - зачем знать о самозаверяющих сертификатах. Какая цель? Какая проблема решается? Вероятно, попытка разбить сертификаты на две части, самоподписанные и не самоподписанные, является неправильным подходом для большинства ситуаций. Лучшим подходом почти наверняка будет проверка того, что любой данный сертификат имеет действительную цепочку подписей от доверенного центра сертификации и что все соединения, связанные с данным сертификатом, соответствуют сертификату.

Здесь остальная часть моего оригинального ответа. Это, вероятно, не то, что вы хотите.


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

Проверяя эту теорию, я провел несколько тестов; он работает примерно так:

cd /etc/ssl/certs
for f in *.0 ; do openssl x509 -in $f -issuer | head -1 > /tmp/$f.issuer ; openssl x509 -in $f -subject | head -1 > /tmp/$f.subject ; done
 cd /tmp
 sed -i -e s/issuer=// *.issuer
 sed -i -e s/subject=// *.subject
 cd /etc/ssl/certs/
 for f in *.0 ; do diff -u /tmp/$f.issuer /tmp/$f.subject ; done

Надеюсь, это поможет.

Ответ 2

В следующем потоке электронной почты точно указывается правильный способ проверить, является ли закодированный base64 сертификат (т.е. PEM) самоподписанным или нет: http://marc.info/?l=openssl-users&m=116177485311662&w=4

Ниже приведен фрагмент кода:

openssl verify -CAfile self_signed_cert.pem self_signed_cert.pem

должен вернуться:

self_signed_cert.pem: OK

ИЛИ сравните эмитенту и субъекту. Если они одинаковы, они самоподписываются

openssl x509 -in cert.pem -inform PEM -noout -subject -issuer

Ответ 3

Принятый ответ здесь не совсем корректен. Старый вопрос, но это первый результат в Google о том, "как определить, является ли сертификат самоподписанным", поэтому его необходимо очистить.

Сертификат почти всегда подписывается Self-, если поставщик и субъект совпадают, но это не гарантируется. Сертификат может быть "выдан Self-", если он имеет того же эмитента/субъекта, но подписан закрытым ключом, который не связан с открытым ключом в сертификате.

Первая часть ответа выше от NitinB является правильным способом проверки подписанного сертификата Self-:

openssl verify -CAfile self_signed_cert.pem self_signed_cert.pem

"Все сертификаты Self- подписаны Self-, но не все сертификаты Self- подписаны Self-".

Цитата: https://tools.ietf.org/html/rfc5280

"Self- выданные сертификаты являются сертификатами CA, в которых эмитент и субъект являются одним и тем же объектом. Self- выпущенные сертификаты создаются для поддержки изменений в политике или операциях. Self- подписанные сертификаты являются Self- выданными сертификатами, где цифровая подпись может быть проверено открытым ключом, привязанным к сертификату. "

Ответ 4

Вы пробовали BouncyCastle lib?

http://www.bouncycastle.org/wiki/display/JA1/Frequently+Asked+Questions

" Существуют конкретные примеры программ для работы с сертификатами атрибутов, PKCS12, SMIME и OpenPGP. Их можно найти в пакетах:

org.bouncycastle.jce.examples org.bouncycastle.mail.smime.examples org.bouncycastle.openpgp.examples Другим полезным источником примеров являются тестовые пакеты:

org.bouncycastle.crypto.test org.bouncycastle.jce.provider.test org.bouncycastle.cms.test org.bouncycastle.mail.smime.test org.bouncycastle.openpgp.test org.bouncycastle.cert.test org.bouncycastle.pkcs.test org.bouncycastle.tsp.test "

Ответ 5

Java не может анализировать PKCS12, чтобы преобразовать его в keystore с помощью openssl.

Здесь хранилище ключей имеет как закрытый ключ, так и сертификат X509 (или вы можете выбрать только для хранения сертификата). Затем получите эмитент от keystore с использованием стандартного JAVA API и вручную проверите эмитента.