PHP 8.4.0 RC4 available for testing

openssl_cms_encrypt

(PHP 8)

openssl_cms_encryptЗашифровывает CMS-сообщение

Описание

openssl_cms_encrypt(
    string $input_filename,
    string $output_filename,
    OpenSSLCertificate|array|string $certificate,
    ?array $headers,
    int $flags = 0,
    int $encoding = OPENSSL_ENCODING_SMIME,
    int $cipher_algo = OPENSSL_CIPHER_AES_128_CBC
): bool

Шифрует содержимое для одного или нескольких получателей на основе переданных ему сертификатов.

Список параметров

input_filename

Файл, который нужно зашифровать.

output_filename

Выходной файл.

certificate

Получатели, для которых производится шифрование.

headers

Заголовки, которые будут включены при использовании S/MIME.

flags

Флаги, передаваемые CMS_sign.

encoding

Кодировка для вывода. OPENSSL_ENCODING_SMIME, OPENSSL_ENCODING_DER или OPENSSL_ENCODING_PEM.

cipher_algo

Используемый алгоритм шифрования.

Возвращаемые значения

Функция возвращает true в случае успешного выполнения или false, если возникла ошибка.

Список изменений

Версия Описание
8.1.0 Алгоритм шифрования по умолчанию (cipher_algo) теперь AES-128-CBC (OPENSSL_CIPHER_AES_128_CBC). Ранее использовался алгоритм PKCS7/CMS (OPENSSL_CIPHER_RC2_40).
Добавить

Примечания пользователей 1 note

up
7
Sebastian
3 years ago
It took me a while to find out the correct way how to sign and encrypt data with these functions.
I needed that to communicate with German Health Insurance Providers as part of a DiGA. Maybe someone finds that useful.

<?php
function signAndEncrypt(string $rawData): string
{
$tempDir = __DIR__ . '/tmp';
$tempfileOriginal = tempnam($tempDir, 'original');
$tempfileSigned = tempnam($tempDir, 'signed');
$tempfileEncrypted = tempnam($tempDir, 'signedEncrypted');

file_put_contents($tempfileOriginal, $rawData);

// pick the correct certificate for the recipient
$recipientsCertificateFile = __DIR__ . '/recipientsCertificate.pem';
// -----BEGIN CERTIFICATE----- ...-----END CERTIFICATE-----
$recipientsCertificate = file_get_contents($recipientsCertificateFile);

// Certificate:
// Data:
// Version: 3 (0x2)...
$myCertificate = file_get_contents(__DIR__ . '/my.crt');
$myPrivateKey = openssl_pkey_get_private(
// -----BEGIN RSA PRIVATE KEY----- ... -----END RSA PRIVATE KEY-----
file_get_contents(__DIR__ . '/my.prv.key.pem')
);

openssl_cms_sign(
input_filename: $tempfileOriginal,
output_filename: $tempfileSigned,
certificate: $myCertificate,
private_key: $myPrivateKey,
headers: [],
encoding: OPENSSL_ENCODING_DER,
);

openssl_cms_encrypt(
input_filename: $tempfileSigned,
output_filename: $tempfileEncrypted,
certificate: $recipientsCertificate,
headers: [],
flags: OPENSSL_CMS_BINARY | OPENSSL_CMS_NOSIGS | OPENSSL_CMS_NOVERIFY,
encoding: OPENSSL_ENCODING_DER,
cipher_algo: OPENSSL_CIPHER_AES_256_CBC
);
return
file_get_contents($tempfileEncrypted);
}
To Top