2017-10-14 2 views
0

J'ai essayé d'utiliser ce script PHP pour vérifier la clé privée SSL avec certificat SSL ou pas le résultat est match à chaque fois.SSL: match clé privée avec certificat en utilisant PHP (sans phpseclib)

error_reporting(E_ALL & ~E_NOTICE); 

if (!extension_loaded('OpenSSL')) { 
     $this->markTestSkipped("Need OpenSSL extension"); 
} 

$pkey = "-----BEGIN PRIVATE KEY----- 
MIIEvgIBADANBgkqhkiG9w0BAQEFAASCBKgwggSkAgEAAoIBAQDvwT54v2kQTRP3 
ZnJepfuBgEUfrEqBZ7zLm87s1NHwwJNNbwqGCYTIoCv4xDgRCK7X7NVmMyV2OWIn 
... 
-----END PRIVATE KEY-----"; 

$cert = "-----BEGIN CERTIFICATE----- 
MIIGRTCCBS2gAwIBAgIQVWcnF+whEw+mvnBlp/JMCzANBgkqhkiG9w0BAQsFADCB 
kDELMAkGA1UEBhMCR0IxGzAZBgNVBAgTEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4G 
... 
-----END CERTIFICATE-----"; 

$check_result = check_pkey_cert_match($pkey, $cert); 

if($check_result == true) { 
    echo "Match"; 
} else { 
    echo "Not Match"; 
} 

cette utilisation de la fonction OpenSSL par shell_exec il peut exporter des fichiers server.crt, server.key, server.csr

function check_pkey_cert_match($Private_Key, $Certificate) { 
    //checks if Private Key match Certificate 

    $random_blurp = rand(10,99999); 
    $tmp_dir = "/tmp/"; 

    if(openssl_x509_export_to_file($Certificate, $tmp_dir.$random_blurp.'.server.crt')) { 
    echo "Export Cert OK = ".$tmp_dir.$random_blurp.".server.crt"; 
    } else { 
    echo "Export Crt Error"; 
    } 

    if(openssl_pkey_export_to_file($Private_Key, $tmp_dir.$random_blurp.'.server.key')) { 
    echo "Export Pkey OK = ".$tmp_dir.$random_blurp.".server.key"; 
    } else { 
    echo "Export Pkey Error"; 
    } 

mais quand j'utilise cette shell_exec pour vérifier $ pkey_check & $ match de cert_check ou il ne résulte toujours pas match à chaque fois. Parce que $ pkey_check & $ cert_check = null

$pkey_check = shell_exec('openssl pkey -in 
'.$tmp_dir.$random_blurp.'.server.key -pubout -outform pem | sha256sum'); 

    $cert_check = shell_exec('openssl x509 -in 
'.$tmp_dir.$random_blurp.'.server.crt -pubout -outform pem | sha256sum'); 

// $csr_check = shell_exec('openssl req -in '.$tmp_dir.$random_blurp.'.server.csr -pubout -outform pem | sha256sum'); 


    //remove those temp files. 

    unlink($tmp_dir.'server.crt'); 

    unlink($tmp_dir.'server_key'); 

    //unlink($tmp_dir.'server.csr'); 

    //Check for match 

    if ($cert_check == $pkey_check) { 
    return true; 
    } else { 
    return false; 
    } 

Résultat du script ci-dessus

Export Cert OK = /tmp/41893.server.crt

Export = OK Pkey de /tmp/41893.server. clé

cert_check =

pkey_check =

match

J'ai essayer un autre shell_exec mais le même resutl

/* 
    $pkey_check = shell_exec('openssl rsa -noout -modulus -in server.key | openssl md5'); 
    $cert_check = shell_exec('openssl x509 -noout -modulus -in server.crt | openssl md5'); 
    $csr_check = shell_exec('openssl req -noout -modulus -in server.csr | openssl md5'); 
    */ 

    /* 
    $pkey_check = shell_exec('openssl rsa -modulus -in '.$tmp_dir.$random_blurp.'.server.key | openssl md5 2>&1'); 
    $cert_check = shell_exec('openssl x509 -modulus -in '.$tmp_dir.$random_blurp.'.server.crt | openssl md5 2>&1'); 
    $csr_check = shell_exec('openssl req -noout -modulus -in '.$tmp_dir.$random_blurp.'.server.csr | openssl md5 2>&1'); 
    */ 

    $pkey_check = shell_exec('openssl pkey -in '.$tmp_dir.$random_blurp.'.server.key -pubout -outform pem | sha256sum'); 
    $cert_check = shell_exec('openssl x509 -in '.$tmp_dir.$random_blurp.'.server.crt -pubout -outform pem | sha256sum'); 
// $csr_check = shell_exec('openssl req -in '.$tmp_dir.$random_blurp.'.server.csr -pubout -outform pem | sha256sum'); 

Répondre

0

(Posté le nom de l'auteur de la question).

Ce script simple permet de vérifier la clé privée & correspondance de certificat ou non.

error_reporting(E_ALL & ~E_NOTICE); 

if (!extension_loaded('OpenSSL')) { 
     $this->markTestSkipped("Need OpenSSL extension"); 
} 

Define $ cert et PKEY $ (ou utilisez $ _POST [$ cert] et $ _POST [pkey $] au lieu)

$pkey = "-----BEGIN PRIVATE KEY----- 
MIIEvgIBADANBgkqhkiG9w0BAQEFAASCBKgwggSkAgEAAoIBAQDvwT54v2kQTRP3 
ZnJepfuBgEUfrEqBZ7zLm87s1NHwwJNNbwqGCYTIoCv4xDgRCK7X7NVmMyV2OWIn 
... 
-----END PRIVATE KEY-----"; 

$cert = "-----BEGIN CERTIFICATE----- 
MIIGRTCCBS2gAwIBAgIQVWcnF+whEw+mvnBlp/JMCzANBgkqhkiG9w0BAQsFADCB 
kDELMAkGA1UEBhMCR0IxGzAZBgNVBAgTEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4G 
... 
-----END CERTIFICATE-----"; 

fonction d'appel check_pkey_cert_match() et le résultat.

$check_result = check_pkey_cert_match($pkey, $cert); 

if($check_result == true) { 
    echo "Match"; 
} else { 
    echo "Not Match"; 
} 

Il suffit d'utiliser la fonction openssl_x509_check_private_key()

function check_pkey_cert_match($Private_Key, $Certificate) { 

    //Check for match 
    if(openssl_x509_check_private_key ($Certificate , $Private_Key)) { 
     return true; 
    } else { 
    return false; 
    } 

} 
+0

@Jakkrit: intéressant, mais une fois que les gens ajoutent leur clé privée que pour le tester, il n'est plus privé, et ils auraient à se régénérer il. – halfer

+0

@JakkritHochoey: veuillez supprimer cela. Je ne souhaite pas être associé à votre projet, désolé. S'il vous plaît noter qu'il est commun (et attendu) de demander aux gens la permission avant d'utiliser leur nom d'une certaine manière, d'autant plus que cela peut constituer une approbation. – halfer

+1

J'ai déjà supprimé votre nom d'utilisateur. Vraiment désolé. –