Найдите, подписан ли сертификат самостоятельно или подписано 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 и вручную проверите эмитента.