2013-02-20 62 views
2

我有以下的PHP函数验证证书:验证在node.js中的PHP证书

<?php 

function raven_check_sig($data, $sig) { 
    $key_path = '/path/to/pubkey.crt'; 
    $key_crt = file_get_contents($key_path); 
    $key = openssl_get_publickey($key_crt); 

    $result = openssl_verify($data, base64_decode($sig), $key); 

    openssl_free_key($key); 

    if ($result == 1) { 
     return TRUE; 
    } else { 
     return FALSE; 
    } 
} 

我在移植我的应用程序的Node.js的过程,但我不知道如何来实现这个功能。

我曾尝试:

function checkSignature(data, sig, kid) { 
    var keyPath = '/path/to/pubkey.crt'; 
    var key = fs.readFileSync(keyPath); 

    var verifier = crypto.createVerify('RSA-SHA256'); 
    verifier.update(data); 
    var res = verifier.verify(key, sig, 'base64'); 

    if (res) { 
    return true; 
    } else { 
    return false; 
    } 
} 

但这似乎总是返回false。我有两个问题,我想可能是什么原因导致这种失败:

  1. 我不知道RSA-SHA256是否是正确的算法来验证证书,因为我可以不知道是什么openssl_verify一样。
  2. 我不知道等价于致电openssl_get_publickey是什么,假设我确实需要类似的东西。

文件pubkey.crt的内容是:

-----BEGIN CERTIFICATE----- 
MIIDrTCCAxagAwIBAgIBADANBgkqhkiG9w0BAQQFADCBnDELMAkGA1UEBhMCR0Ix 
EDAOBgNVBAgTB0VuZ2xhbmQxEjAQBgNVBAcTCUNhbWJyaWRnZTEgMB4GA1UEChMX 
VW5pdmVyc2l0eSBvZiBDYW1icmlkZ2UxKDAmBgNVBAsTH0NvbXB1dGluZyBTZXJ2 
aWNlIFJhdmVuIFNlcnZpY2UxGzAZBgNVBAMTElJhdmVuIHB1YmxpYyBrZXkgMjAe 
Fw0wNDA4MTAxMzM1MjNaFw0wNDA5MDkxMzM1MjNaMIGcMQswCQYDVQQGEwJHQjEQ 
MA4GA1UECBMHRW5nbGFuZDESMBAGA1UEBxMJQ2FtYnJpZGdlMSAwHgYDVQQKExdV 
bml2ZXJzaXR5IG9mIENhbWJyaWRnZTEoMCYGA1UECxMfQ29tcHV0aW5nIFNlcnZp 
Y2UgUmF2ZW4gU2VydmljZTEbMBkGA1UEAxMSUmF2ZW4gcHVibGljIGtleSAyMIGf 
MA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQC/9qcAW1XCSk0RfAfiulvTouMZKD4j 
m99rXtMIcO2bn+3ExQpObbwWugiO8DNEffS7bzSxZqGp7U6bPdi4xfX76wgWGQ6q 
Wi55OXJV0oSiqrd3aOEspKmJKuupKXONo2efAt6JkdHVH0O6O8k5LVap6w4y1W/T 
/ry4QH7khRxWtQIDAQABo4H8MIH5MB0GA1UdDgQWBBRfhSRqVtJoL0IfzrSh8dv/ 
CNl16TCByQYDVR0jBIHBMIG+gBRfhSRqVtJoL0IfzrSh8dv/CNl16aGBoqSBnzCB 
nDELMAkGA1UEBhMCR0IxEDAOBgNVBAgTB0VuZ2xhbmQxEjAQBgNVBAcTCUNhbWJy 
aWRnZTEgMB4GA1UEChMXVW5pdmVyc2l0eSBvZiBDYW1icmlkZ2UxKDAmBgNVBAsT 
H0NvbXB1dGluZyBTZXJ2aWNlIFJhdmVuIFNlcnZpY2UxGzAZBgNVBAMTElJhdmVu 
IHB1YmxpYyBrZXkgMoIBADAMBgNVHRMEBTADAQH/MA0GCSqGSIb3DQEBBAUAA4GB 
AFciErbr6zl5i7ClrpXKA2O2lDzvHTFM8A3rumiOeauckbngNqIBiCRemYapZzGc 
W7fgOEEsI4FoLOjQbJgIrgdYR2NIJh6pKKEf+9Ts2q/fuWv2xOLw7w29PIICeFIF 
hAM+a6/30F5fdkWpE1smPyrfASyXRfWE4Ccn1RVgYX9u 
-----END CERTIFICATE----- 

回答

2

原来正确的算法是SHA1:

function checkSignature(data, sig) { 
    var keyPath = '/path/to/pubkey.crt'; 
    var key = fs.readFileSync(keyPath); 

    var verifier = crypto.createVerify('SHA1'); 
    verifier.update(data); 
    var res = verifier.verify(key, sig, 'base64'); 

    if (res) { 
    return true; 
    } else { 
    return false; 
    } 
} 

所以现在一切工作:)

+0

对不起把这个提起来,但checkSignarute(data,sig,kid)''中的'kid'参数会是什么? – user1576978 2015-07-24 18:10:58

+1

它没有被使用,我已经从这个例子中删除它。 'kid'是keyID,并且允许使用这个函数来检查原始代码中的一组公共密钥中的一个,但是我删除了该功能,因为它没有被实际使用。 – ForbesLindesay 2015-08-25 14:12:49

+0

无论如何,谢谢你,它帮了我很多! – user1576978 2015-08-25 17:35:24