最近几天,我正在尝试使用openssl_sign
生成XML数据的签名,然后使用openssl_verify
进行验证。不幸的是,openssl_verify
一直在返回false。由于我不确定从我的证书中提取的私钥和公钥是否正常,我也尝试了a basic example。
openssl_sign
确实返回二进制签名。到目前为止一切顺利(使用从PEM证书中提取的私钥也是如此)。同样在示例openssl_verify
中返回false。我假设示例中的私钥和公钥是正确的。有关如何签名和验证的任何帮助?
<?php
$Data = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
// $key_private_id = openssl_get_privatekey(file_get_contents($ClientCertFile), $passphrase);
// $key_public_id = openssl_get_publickey(file_get_contents($ClientCertFile));
$key_private_id = <<<EOD
-----BEGIN RSA PRIVATE KEY-----
MIIBOgIBAAJBANDiE2+Xi/WnO+s120NiiJhNyIButVu6zxqlVzz0wy2j4kQVUC4Z
RZD80IY+4wIiX2YxKBZKGnd2TtPkcJ/ljkUCAwEAAQJAL151ZeMKHEU2c1qdRKS9
sTxCcc2pVwoAGVzRccNX16tfmCf8FjxuM3WmLdsPxYoHrwb1LFNxiNk1MXrxjH3R
6QIhAPB7edmcjH4bhMaJBztcbNE1VRCEi/bisAwiPPMq9/2nAiEA3lyc5+f6DEIJ
h1y6BWkdVULDSM+jpi1XiV/DevxuijMCIQCAEPGqHsF+4v7Jj+3HAgh9PU6otj2n
Y79nJtCYmvhoHwIgNDePaS4inApN7omp7WdXyhPZhBmulnGDYvEoGJN66d0CIHra
I2SvDkQ5CmrzkW5qPaE2oO7BSqAhRZxiYpZFb5CI
-----END RSA PRIVATE KEY-----
EOD;
$key_public_id = <<<EOD
-----BEGIN PUBLIC KEY-----
MFwwDQYJKoZIhvcNAQEBBQADSwAwSAJBANDiE2+Xi/WnO+s120NiiJhNyIButVu6
zxqlVzz0wy2j4kQVUC4ZRZD80IY+4wIiX2YxKBZKGnd2TtPkcJ/ljkUCAwEAAQ==
-----END PUBLIC KEY-----
EOD;
if(!openssl_sign($Data, $Signature, $key_private_id, OPENSSL_ALGO_SHA1 )) {
echo "Failed to sign data: $Data ";
}
if(!openssl_verify($Data, $Signature, $key_public_id, OPENSSL_ALGO_SHA1)) {
echo "Verify failed on signed data: $Data ";
}
答案 0 :(得分:0)
这是一个常见的错误。 PHP documentation for the heredoc format说:
警告请务必注意,带分钟标识符的行必须不包含除分号(;)以外的其他字符。这尤其意味着标识符可能没有缩进,并且在分号之前或之后可能没有任何空格或制表符。
确保在EOD;
之后没有任何尾随空格,并且事情将开始起作用。如果您启用了正确的PHP error logging,那么您将从赋值语句中获得“未定义的变量”通知。