记录一次php对接RSA验签的接口

加密
秘钥:秘钥长度2048位。
算法:模式为ECB,填充方式为PKCS1Padding。算法/模式/填充为:RSA/ECB/PKCS1Padding(java的JCE默认参数)
编码:明文数据采用UTF-8编码,密文使用BASE64编码。

对接方给的证书格式是pfx, keystore类型(keystoreType)为PKCS12,keystore保护密码已提供. 我们要做的是从pfx格式证书导出私钥文件.

openssl pkcs12 -in ******.pfx -nodes -out server.pem

打开pem文件, 里面

-----BEGIN PRIVATE KEY-----

...

-----END PRIVATE KEY-----

就是我们要用的私钥.

记录私钥加密的关键代码:

    $privary = openssl_pkey_get_private('私钥字符串');
    $content = ($input);//需要加密内容的
    openssl_sign($content, $encryptData, $privary, "SHA1");
    return $encryptData;//返回密文

对接方另外给了网关证书, 需要我们从中自行导出网关公钥来验签回调参数.
网关证书是一个以.cer结尾的文件, 内容如下:

-----BEGIN CERTIFICATE-----

...

-----END CERTIFICATE-----

这里我们把证书安装到系统, 打开ie, ->internet选项->内容->证书, 找到需要的证书, 点击导出, 选择DER 编码二进制X.509格式.
导出公钥:

openssl x509 -inform der -in der编码.cer -pubkey -noout > rsa_public_key.pem

rsa_public_key.pem里面就是我们要用的公钥

记录公钥验签的关键代码

$pubvary = openssl_pkey_get_public('公钥字符串');
$result = (bool)openssl_verify('需要验签的字符串(除去签名字符串)', base64_decode('回调的签名字符串'), $pubvary);
return $result;//返回true or false

如果遇到openssl_pkey_get_public 或者openssl_pkey_get_private 返回false的情况. 可能是密钥的格式不正确, 记录格式化的关键代码

$search = [
            "-----BEGIN PUBLIC KEY-----",
            "-----END PUBLIC KEY-----",
            "\n",
            "\r",
            "\r\n"
        ];
        $public_key = str_replace($search, "", '密钥字符串');
        $public_key = $search[0] . PHP_EOL . wordwrap($public_key, 64, "\n", true) . PHP_EOL . $search[1];
        return $public_key;//格式化之后的密钥字符串
Last modification:November 28th, 2018 at 04:10 pm
If you think my article is useful to you, please feel free to appreciate