2024 日本 PHP 研討會

openssl_cms_decrypt

(PHP 8)

openssl_cms_decrypt解密 CMS 訊息

描述

openssl_cms_decrypt(
    字串 $input_filename,
    字串 $output_filename,
    #[\SensitiveParameter] OpenSSLCertificate|字串 $certificate,
    #[\SensitiveParameter] OpenSSLAsymmetricKey|OpenSSLCertificate|陣列|字串|null $private_key = null,
    整數 $encoding = OPENSSL_ENCODING_SMIME
): 布林值

解密 CMS 訊息。

參數

input_filename

包含加密內容的檔案名稱。

output_filename

存放解密內容的檔案名稱。

certificate

包含收件者憑證的檔案名稱。

private_key

包含 PKCS#8 金鑰的檔案名稱。

encoding

輸入檔案的編碼。可選 OPENSSL_ENCODING_SMIMEOPENSSL_ENCODING_DEROPENSSL_ENCODING_PEM 其中之一。

回傳值

成功時回傳 true,失敗時回傳 false

新增註記

使用者貢獻的註記 1 則註記

Sebastian
3 年前
我花了一些時間才找到使用這些函式解密和驗證資料的正確方法。
我需要這個功能來與德國健康保險提供商進行通訊,作為 DiGA 的一部分。也許有人會覺得這很有用。

<?php
function decryptAndVerify($signedAndEncryptedRawData): string
{
$tempDir = __DIR__ . '/tmp';
$originalFile = tempnam($tempDir, 'original');
$decryptedFile = tempnam($tempDir, 'decrypted');
$verifiedFile = tempnam($tempDir, 'verified');

file_put_contents($originalFile, $signedAndEncryptedRawData);

// 將所有可能的憑證一個接一個放在同一個檔案中
// -----BEGIN CERTIFICATE----- ...-----END CERTIFICATE-----
$allPossibleSenderCertificates = __DIR__ . '/untrusted.pem';

// 憑證:
// 資料:
// 版本: 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_decrypt(
input_filename: $originalFile,
output_filename: $decryptedFile,
certificate: $myCertificate,
private_key: $myPrivateKey,
encoding: OPENSSL_ENCODING_DER
);

openssl_cms_verify(
input_filename: $decryptedFile,
flags: OPENSSL_CMS_BINARY | OPENSSL_CMS_NOSIGS | OPENSSL_CMS_NOVERIFY,
ca_info: [],
untrusted_certificates_filename: $allPossibleSenderCertificates,
content: $verifiedFile,
encoding: OPENSSL_ENCODING_DER
);
return
file_get_contents($verifiedFile);
}
To Top