首页 > 文章列表 > PHP如何实现与Java兼容的PKCS7签名及银行加签值排序?

PHP如何实现与Java兼容的PKCS7签名及银行加签值排序?

380 2025-03-22

PHP如何实现与Java兼容的PKCS7签名及银行加签值排序?

pkcs7 签名 php 实现

第三方 java 代码中使用的 pkcs7 签名,现需在 php 中对其进行实现。

php 实现方法

php 中使用 openssl_pkcs7_verify 函数进行验签,具体实现方法如下:

openssl_pkcs7_verify($certfile, $signfile, $datafile, pkcs7_detached);
  • $certfile:签名用的证书文件
  • $signfile:签名文件
  • $datafile:被签名的数据文件

加签值排列

中国银行和中信银行要求加签值升序排列,可以使用 asort($argarr, sort_string) 函数进行排序。

完整示例

<?php

function pkcs7Sign($data, $certFile, $privateKeyFile)
{
    // 导入证书和私钥
    $certData = file_get_contents($certFile);
    $privateKeyData = file_get_contents($privateKeyFile);

    $cert = openssl_x509_parse($certData);
    $privateKey = openssl_pkey_get_private($privateKeyData);

    // 签名数据
    $signature = openssl_pkcs7_sign($data, 'temp.pem', $cert, $privateKey);

    // 读取签名文件
    $signature = file_get_contents('temp.pem');
    unlink('temp.pem');

    // 将签名转成 base64 字符串
    $signature = base64_encode($signature);

    return $signature;
}

已完成代码中解除了对 / 路径分隔符转义,可选地址写法为 file:/tmp/cert.pem。

来源:1733008940