PHP Conference Japan 2024

openssl_cms_encrypt

(PHP 8)

openssl_cms_encrypt加密 CMS 消息

描述

openssl_cms_encrypt(
    字符串 $input_filename,
    字符串 $output_filename,
    OpenSSLCertificate|数组|字符串 $certificate,
    ?数组 $headers,
    整数 $flags = 0,
    整数 $encoding = OPENSSL_ENCODING_SMIME,
    整数 $cipher_algo = OPENSSL_CIPHER_AES_128_CBC
): 布尔值

此函数根据传递给它的证书将内容加密到一个或多个接收方。

参数

input_filename

要加密的文件。

output_filename

输出文件。

certificate

要加密到的接收方。

headers

使用 S/MIME 时要包含的标头。

flags

要传递给 CMS_sign 的标志。

encoding

要输出的编码。OPENSSL_ENCODING_SMIMEOPENSSL_ENCODING_DEROPENSSL_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 条注释

Sebastian
3 年前
我花了一些时间才找到使用这些函数正确签名和加密数据的方法。
我需要它与德国健康保险提供商进行通信,作为 DiGA 的一部分。也许有人会发现这很有用。

<?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);

// 选择接收方的正确证书
$recipientsCertificateFile = __DIR__ . '/recipientsCertificate.pem';
// -----BEGIN CERTIFICATE----- ...-----END CERTIFICATE-----
$recipientsCertificate = file_get_contents($recipientsCertificateFile);

// 证书:
// 数据:
// 版本: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