由于缺少示例,以下代码可能对某些人有用。
# openssl_pkcs7_sign() 和 openssl_pkcs7_encrypt() 的演示代码,用于对 Paypal EWP 进行签名和加密。
#
# 生成并自签名证书
# % openssl genrsa -out my-private-key.pem 2048
# % openssl req -new -key my-private-key.pem -x509 -days 3650 -out my-public-key.pem
#
function demo_paypal_encrypt( $webform_hash )
{
$MY_PUBLIC_KEY = "file:///usr/local/etc/paypal/my-public-key.pem";
$MY_PRIVATE_KEY = "file:///usr/local/etc/paypal/my-private-key.pem";
$PAYPAL_PUBLIC_KEY = "file:///usr/local/etc/paypal/paypal_cert_pem.txt";
// 为 PayPal 支持分配构建符号
$webform_hash['bn']= 'MyWebRef.PHP_EWP2';
$data = "";
foreach ($webform_hash as $key => $value)
if ($value != "")
$data .= "$key=$value\n";
$file_msg = sprintf( "/tmp/pp-msg-%d.txt", getmypid() );
$file_sign = sprintf( "/tmp/pp-sign-%d.mpem", getmypid() );
$file_bsign = sprintf( "/tmp/pp-sign-%d.der", getmypid() );
$file_enc = sprintf( "/tmp/pp-enc-%d.txt", getmypid() );
if ( file_exists( $file_msg ) ) unlink( $file_msg );
if ( file_exists( $file_sign ) ) unlink( $file_sign );
如果 ( 文件存在 ( $file_bsign ) ) 则删除 ( $file_bsign );
如果 ( 文件存在 ( $file_enc ) ) 则删除 ( $file_enc );
$fp = fopen( $file_msg, "w" );
如果 ( $fp ) {
fwrite($fp, $data );
fclose($fp);
}
// 签署 HTML 表单消息的一部分
openssl_pkcs7_sign(
$file_msg,
$file_sign,
$MY_PUBLIC_KEY,
数组 ( $MY_PRIVATE_KEY, "" ), /// 私钥,密码
数组 (),
PKCS7_BINARY
);
// 将 PEM 转换为 DER
$pem_data = file_get_contents( $file_sign );
$begin = "Content-Transfer-Encoding: base64";
$pem_data = trim( substr($pem_data, strpos($pem_data, $begin)+strlen($begin)) );
$der = base64_decode( $pem_data );
$fp = fopen( $file_bsign, "w" );
如果 ( $fp ) {
fwrite($fp, $der );
fclose($fp);
}
// 你可以通过以下方式验证 DER 签名是否正确
// % openssl smime -verify -CAfile $MY_PUBLIC_KEY -inform DER -in $file_bsign
// 使用 PayPal 公钥加密消息
openssl_pkcs7_encrypt(
$file_bsign,
$file_enc,
$PAYPAL_PUBLIC_KEY,
数组 (),
PKCS7_BINARY,
OPENSSL_CIPHER_3DES );
$data = file_get_contents( $file_enc );
$data = substr($data, strpos($data, $begin)+strlen($begin));
$data = "-----BEGIN PKCS7-----\n". trim( $data ) . "\n-----END PKCS7-----";
// 清理
if ( file_exists( $file_msg ) ) unlink( $file_msg );
if ( file_exists( $file_sign ) ) unlink( $file_sign );
如果 ( 文件存在 ( $file_bsign ) ) 则删除 ( $file_bsign );
如果 ( 文件存在 ( $file_enc ) ) 则删除 ( $file_enc );
返回 ( $data );
}