Как на PHP проверить подпись PKCS7? С помощью CryproPro Browser Plugin подписываем данные (данные в подпись не включаются) и передаем данные и подпись на сервер. Как на backend'е с помощью PHP проверить подпись? Тестовый пример: Подписываемые данные: MTIz Подпись: MIIHrwYJKoZIhvcNAQcCoIIHoDCCB5wCAQExDDAKBgYqhQMCAgkFADALBgkqhkiG9w0BBwGgggWO MIIFijCCBTmgAwIBAgIKFa5nHQAAAAAAEzAIBgYqhQMCAgMwVzELMAkGA1UEBhMCUlUxSDBGBgNV BAMTP0NlbnRlci1JbmZvcm0gVGVzdCBHb3N0IENBIGZvciBBdXRvbWF0ZWQgQ2VydGlmaWNhdGlv biBTZXJ2aWNlczAeFw0xNjA0MjkxMTU2MDBaFw0xNjA1MjkxMjA2MDBaMIICATEYMBYGCCqFAwOB DQEBEgo3ODI3MDEwMDAwMRYwFAYFKoUDZAMSCzE0MTQ2NTk0NDYwMRgwFgYFKoUDZAESDTEwMzc4 MDAwMDY1MjkxGjAYBggqhQMDgQMBARIMMDAwMDAwMDAwMDAwMSgwJgYJKoZIhvcNAQkBFhlrLnZh Z25lckBjZW50ZXItaW5mb3JtLnJ1MQswCQYDVQQGEwJSVTEtMCsGA1UECAwkNzgg0LMuINCh0LDQ vdC60YIt0J/QtdGC0LXRgNCx0YPRgNCzMQowCAYDVQQHDAEwMTMwMQYDVQQKDCrQntCe0J4gIjEy 0KLQtdGB0YLQvtCy0LDRjyDQktCw0LPQvdC10YAxMiIxCjAIBgNVBAsMATAxMzAxBgNVBAMMKtCe 0J7QniAiMTLQotC10YHRgtC+0LLQsNGPINCS0LDQs9C90LXRgDEyIjEKMAgGA1UECQwBMDEwMC4G CSqGSIb3DQEJAgwhMDAwMDAwMDAwMC03ODA0MDEwMTItNzAxNzA4OTAzMzA3MSwwKgYDVQQMDCPQ ktC10LTRg9GJ0LjQuSDRgdC/0LXRhtC40LDQu9C40YHRgjEsMCoGA1UEKgwj0JrRgdC10L3QuNGP INCT0YDQuNCz0L7RgNGM0LXQstC90LAxFTATBgNVBAQMDNCS0LDQs9C90LXRgDBjMBwGBiqFAwIC EzASBgcqhQMCAiQABgcqhQMCAh4BA0MABEDQ+qVSBmQT0pLQktgaiF4eYRhHCkj4dgysTY6yGwqY f3YO5ErwQEP551bi2cUWSAD56nUtMCmRSVdm/LTwXNgvo4ICNzCCAjMwDgYDVR0PAQH/BAQDAgTw MFYGA1UdJQRPME0GCCsGAQUFBwMCBggrBgEFBQcDBAYHKoUDAgIiBgYHKoUDAwcIAQYIKoUDAwcB AQEGBiqFAwMHAQYKKwYBBAGCNxQCAgYHKoUDAwYAATARBgUqhQNkbwQIDAZmZ2JkZmcwJwYDVR0R BCAwHqQcMBoxGDAWBggqhQMDgQ0BARMKNzgyNzAxMDAwMDAdBgNVHQ4EFgQUcptDmJmnjCYFiHYT qUV3uzpe154wHwYDVR0jBBgwFoAUu5WQXMfu/Sh+KvktbnKGhg+UzbowgYQGA1UdHwR9MHsweaB3 oHWGc2ZpbGU6Ly9XSU4tVkgzMDBRUTFPRTEvY2VydGVucm9sbC9DZW50ZXItSW5mb3JtJTIwVGVz dCUyMEdvc3QlMjBDQSUyMGZvciUyMEF1dG9tYXRlZCUyMENlcnRpZmljYXRpb24lMjBTZXJ2aWNl cy5jcmwwgaMGCCsGAQUFBwEBBIGWMIGTMIGQBggrBgEFBQcwAoaBg2ZpbGU6Ly9XSU4tVkgzMDBR UTFPRTEvY2VydGVucm9sbC9XSU4tVkgzMDBRUTFPRTFfQ2VudGVyLUluZm9ybSUyMFRlc3QlMjBH b3N0JTIwQ0ElMjBmb3IlMjBBdXRvbWF0ZWQlMjBDZXJ0aWZpY2F0aW9uJTIwU2VydmljZXMuY3J0 MCAGBSqFA2RwBBcwFQwEZGZnYgwDZmdiDANmZ2IMA2RmZzAIBgYqhQMCAgMDQQDrI0ZZv4spqkAE FgMctJ0u/alxpARIoas+EykdxXHNhsI+qo6dNUvlDcU6iumt2vneS1Roae5JpXxONR0xhCAaMYIB 6DCCAeQCAQEwZTBXMQswCQYDVQQGEwJSVTFIMEYGA1UEAxM/Q2VudGVyLUluZm9ybSBUZXN0IEdv c3QgQ0EgZm9yIEF1dG9tYXRlZCBDZXJ0aWZpY2F0aW9uIFNlcnZpY2VzAgoVrmcdAAAAAAATMAoG BiqFAwICCQUAoIIBHDAYBgkqhkiG9w0BCQMxCwYJKoZIhvcNAQcBMBwGCSqGSIb3DQEJBTEPFw0x NjA1MjMxMDU5NTlaMC8GCSqGSIb3DQEJBDEiBCBe8YSJYXui2NLX4No4mqpP8CKtAaOVEqT+oajE XkORSDCBsAYLKoZIhvcNAQkQAi8xgaAwgZ0wgZowgZcwCAYGKoUDAgIJBCAgZs3V6/iQi9GkX/56 BRMSGZJBQzzqS5IumTyjlmWxuTBpMFukWTBXMQswCQYDVQQGEwJSVTFIMEYGA1UEAxM/Q2VudGVy LUluZm9ybSBUZXN0IEdvc3QgQ0EgZm9yIEF1dG9tYXRlZCBDZXJ0aWZpY2F0aW9uIFNlcnZpY2Vz AgoVrmcdAAAAAAATMAoGBiqFAwICEwUABED8RT4JumVC2gUtGoMaemycUrRoysXZ7NOw++429MDg Yj/k8VjwJdqvrNMiWnrEThkiQXLufj5fyADrtv6W5R9p
Обратите внимание, что в данном коде используется временное сохранение данных и подписи в файлах для проверки. В реальной ситуации это может быть оптимизировано, например, через использование встроенных функций для работы с потоками.
Для проверки подписи PKCS7 на PHP можно использовать функцию openssl_pkcs7_verify. Пример кода для проверки подписи:
// Подписываемые данные$data = 'MTIz';
// Подпись
$signature = 'MIIHrwYJKoZIhvcNAQcCoIIHoDCCB5wCAQExDDAKBgYqhQMCAgkFADALBgkqhkiG9w0BBwGgggWOMIIFijCCBTmgAwIBAgIKFa5nHQAAAAAAEzAIBgYqhQMCAgMwVzELMAkGA1UEBhMCUlUxSDBGBgNVBAMTP0NlbnRlci1JbmZvcm0gVGVzdCBHb3N0IENBIGZvciBBdXRvbWF0ZWQgQ2VydGlmaWNhdGlvbiBTZXJ2aWNlczAeFw0xNjA0MjkxMTU2MDBaFw0xNjA1MjkxMjA2MDBaMIICATEYMBYGCCqFAwOB...
// Конвертируем данные в нужный формат
$data = base64_decode($data);
$signature = base64_decode($signature);
// Сохраняем данные и подпись во временные файлы
$fileData = tempnam(sys_get_temp_dir(), 'data');
file_put_contents($fileData, $data);
$fileSignature = tempnam(sys_get_temp_dir(), 'signature');
file_put_contents($fileSignature, $signature);
// Проверяем подпись
$certificates = [];
$empty = [];
$result = openssl_pkcs7_verify($fileData, PKCS7_NOINTERN | PKCS7_NOCERTS, $fileSignature, $certificates, $empty);
if ($result) {
echo "Подпись верна";
} else {
echo "Подпись не верна";
}
// Удаляем временные файлы
unlink($fileData);
unlink($fileSignature);
Обратите внимание, что в данном коде используется временное сохранение данных и подписи в файлах для проверки. В реальной ситуации это может быть оптимизировано, например, через использование встроенных функций для работы с потоками.