Как проверить цифровой сертификат с помощью открытого ключа CA

Я изучаю цифровые сертификаты в PKI (Инфраструктура открытых ключей). Почти все руководства / страницы, касающиеся этого, дают следующие аналогичные шаги.

  1. Получите идентификатор субъекта + открытый ключ субъекта ((и / или хеш зашифрованного сообщения с закрытым ключом субъекта) и создайте сертификат.
  2. Подписать сертификат с закрытым ключом CA
  3. В месте назначения проверьте сертификат с открытым ключом CA

Теперь я могу найти путь в php (используя openssl lib) для 1-го и 2-го шага, который может сгенерировать сертификат и подписать его (необязательно, сгенерировать хэш подписи и подписать его тоже) через API openssl.

Но проблема с третьим шагом. Они не являются направляющей линией или вызовом функции, которые показывают, как проверить сертификат с открытым ключом CA.

Если я что-то упустил?

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

$data = 'my data';

//create new private and public key
$req_key = openssl_pkey_new(array(
"private_key_bits" => 2048,
"private_key_type" => OPENSSL_KEYTYPE_RSA,
));

$dn = array(
"countryName"            => "IN",
"stateOrProvinceName"    => "Delhi",
"organizationName"       => "example.net",
"organizationalUnitName" => "Security",
"commonName"             => "example.net");
$req_csr  = openssl_csr_new ($dn, $req_key);
$req_cert = openssl_csr_sign($req_csr, null, $req_key, 365);
openssl_x509_export ($req_cert, $out_cert);

echo $out_cert;

ПРЕДПОСЫЛКИ: Мне нужно реализовать обмен данными на основе PKI для некоторых приложений. Это будет связано с тем, что некоторый объект данных (объект данных будет иметь свой открытый и закрытый ключи) зашифрован на стороне источника, а затем отправляется по назначению. Затем место назначения расшифровывают и получают четкие данные. Но все это должно включать PKI, что означает цифровую подпись + внедрение цифрового сертификата вместе с.

3

Решение

Эта задача не так проста в PHP. На самом деле, PHP не очень хороший инструмент для реализации CA. Он поддерживает основные операции PKI, но это все. Я вижу три варианта:

  1. X.509 — это просто структура ASN.1 в кодировке DER. Вы можете проверить это с guiDumpASN-нг например. В мире PHP также есть несколько библиотек ASN.1. По сути, подпись CA находится внутри сертификата. Если вы сможете извлечь его, вы можете проверить цифровую подпись самостоятельно.

http://php.net/manual/en/function.openssl-verify.php#98282

  1. Попробуйте использовать функцию как OpenSSL-x509-checkpurpose это должно быть в состоянии проверить цепочка сертификатов.

  2. Попробуй использовать phpseclib — посмотрите сертификаты Validate X.509 -> validateSignature ().

Я надеюсь, что это поможет вам немного.

0

Другие решения

Не связывайтесь с проверкой сертификатов самостоятельно но обратите внимание на реализацию алгоритма CPV (Certification Path Validation), который включает в себя все проверки, необходимые для выполнения в цепочке сертификации, где проверка подписи сертификата является только одной из них.

Теперь я искал PHP API для выполнения CPV, но не нашел ни одного, поэтому прибегнул к выполнению следующей внешней команды OpenSSL из PHP:

exec("openssl verify -CAfile trusted_root_cas.pem -untrusted intermediate_cas.pem endentity_cert.pem", $output, $return_var);
if ($return_var == 0) {
echo "Certification path validation completed successfully";
} else {
echo "Certification path validation completed with errors";
}

Где все trusted_root_cas.pem, intermediate_cas.pem а также endentity_cert.pem это могут быть временные файлы, созданные только для выполнения предыдущей команды.

Теперь, если вы хотите знать, что openssl verify выполняет man verify:

Команда verify проверяет цепочки сертификатов.

0

По вопросам рекламы [email protected]