2017-03-21 62 views
1

私はopenssl_signを使用してXMLデータの署名を生成し、後でopenssl_verifyを使用して検証しようとしています。残念ながらopenssl_verifyはfalseを返し続けます。私の証明書から私の私有鍵と公開鍵を抽出したかどうか分からなかったので、a basic exampleも試しました。署名データがopenssl_signとopenssl_verifyを使用して一致しない

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

これはコードのコピー/貼り付けですか? 'EOD;'行の後ろに空白があり、問題が発生します。空白が削除されてもエラーは表示されません。 – miken32

+0

ありがとうmiken32、それは本当に働いている!証明書の掘り出しを開始 –

答えて

0

これは一般的な間違いです。 PHP documentation for the heredoc formatは言う:それは非常に重要である

警告は、終端IDがある行には、セミコロン以外の他の文字が含まれてはならないことに注意すること(;)。つまり、識別子はインデントされていない可能性があります。、セミコロンの前後にスペースやタブがないことがあります。

EOD;の後ろにスペースがないようにしてください。 PHP error loggingを有効にしていた場合は、代入文から「未定義変数」通知を受け取ることになります。

関連する問題