PHPSecLib с использованием сертификата openssl CA не проверяется

Привет всем пользователям phpseclib. Я бы разработал систему выдачи сертификатов для создания системы взаимной аутентификации с Apache. Используя openssl, все шаги и настройки легко доступны, и я смог это сделать. Но, зная phpseclib, я пытался сделать то же самое с ним, единственное, что у меня уже есть сертификат openssl ca, то есть я должен использовать его для подписи нового сертификата, выпущенного с phpseclib. Кажется, я смог это сделать, но когда я пытаюсь проверить сертификат или импортирую его в браузер, процедура выполняется правильно и сертификат импортирован (pkcs12), но, похоже, у меня нет действующего пригодного сертификата. в чем дело ?

вот результаты проверки:

root@me:/# openssl verify -verbose -CAfile /var/CA/CA/ca.crt  mario.rossi.crt
mario.rossi.crt: C = IT, ST = Lazio, O = MyOrg, OU = Users, CN = Mario ROSSI,    emailAddress = mario.rossi@myorg.lan
error 7 at 0 depth lookup:certificate signature failure
3073886360:error:04091077:rsa routines:INT_RSA_VERIFY:wrong signature    length:rsa_sign.c:175:
3073886360:error:0D0C5006:asn1 encoding routines:ASN1_item_verify:EVP    lib:a_verify.c:221:

здесь код, используемый для (взят из сети tne)

require_once("File/X509.php");
require_once("Crypt/RSA.php");

// Setup our CA
$CA = array();      // Store our certificate authority information
$CA["key"           ] = new Crypt_RSA();
$CA["key"           ]->loadKey( file_get_contents($cakey) ); // Load our CA key to sign with
$CA["key"           ]->setPassword('---****---');
$CA["asciicert"     ] = file_get_contents($cacert);
$CA["cert"          ] = new File_X509();
$CA["cert"          ]->loadX509( $CA["asciicert"] );        // Load our CA cert and public key
$CA["cert"          ]->setPrivateKey($CA["key"]);

// Create a new keypair
$DEVICE = array();
$DEVICE["keys"      ] = new Crypt_RSA();
$DEVICE["keypair"   ] = $DEVICE["keys"]->createKey(2048);
// Save our private key
$DEVICE["privkey"   ] = new Crypt_RSA();
$DEVICE["privkey"   ]->loadKey($DEVICE["keypair"]["privatekey"]);

// Save our public key
$DEVICE["pubkey"    ] = new Crypt_RSA();
$DEVICE["pubkey"    ]->loadKey($DEVICE["keypair"]["publickey"]);
// Create a new CSR
$DEVICE["csr"       ] = new File_X509();
$DEVICE["csr"       ]->setPrivateKey($DEVICE["privkey"]);
$DEVICE["csr"       ]->setPublicKey ($DEVICE["pubkey" ]);
$DEVICE["csr"       ]->setDN("C=IT, ST=Emilia Romagna, O=Virtual Forensics Ambient, OU=Users, CN={$NAME}/emailAddress={$USERNAME}@{$DEVICENAME}");
// Sign the CSR
$DEVICE["signedcsr" ] = $DEVICE["csr"]->signCSR("sha256WithRSAEncryption");
$DEVICE["asciicsr"  ] = $DEVICE["csr"]->saveCSR($DEVICE["signedcsr"]);
// CSR attributes
$DEVICE["cert"      ] = new File_X509();
$DEVICE["cert"      ]->loadCSR( $DEVICE["asciicsr"] );         // Now load it back up so we can set extended attributes
$DEVICE["cert"      ]->setPublicKey ($DEVICE["pubkey" ]);
$DEVICE["cert"      ]->setStartDate("-1 day");                  // Make it valid from yesterday...
$DEVICE["cert"      ]->setEndDate("+ 60 days");                 // Set a 5 year expiration on all device certs
$DEVICE["cert"      ]->setSerialNumber($ID, 10);                // Use our ID number in the DB, base 10 (decimal) notation
$DEVICE["cert"      ]->setExtension("id-ce-basicConstraints",   array("cA" => false                                                     ),  1   );
$DEVICE["cert"      ]->setExtension("id-ce-keyUsage"        ,   array("keyEncipherment"         ,"nonRepudiation"   ,"digitalSignature" ),  1   );
$DEVICE["cert"      ]->setExtension("id-ce-extKeyUsage"     ,   array("id-kp-emailProtection"   ,"id-kp-clientAuth"                     ),  1   );
$DEVICE["cert"      ]->setExtension("netscape-cert-type"    ,   array("Email"                   ,"SSLClient"                            ),  1   );
//CA sign the updated CSRc
$DEVICE["signedcert"] = $DEVICE["cert"]->sign($CA["cert"], $DEVICE["cert"], "sha256WithRSAEncryption"); // Sign the new certificate with our CA
$DEVICE["asciicert" ] = $DEVICE["cert"]->saveX509($DEVICE["signedcert"]);   // Ascii our certificate for presentation

1

Решение

Похоже, вы в значительной степени адаптируете пример в Сертификат пользователя phpseclib для аутентификации tls

Во всяком случае, несколько быстрых наблюдений.

// Setup our CA
$CA = array();      // Store our certificate authority information
$CA["key"           ] = new Crypt_RSA();
$CA["key"           ]->loadKey( file_get_contents($cakey) ); // Load our CA key to sign with
$CA["key"           ]->setPassword('---***---');

setPassword должен быть сделан до loadKey.

$DEVICE["cert"      ]->setEndDate("+ 60 days");                 // Set a 5 year expiration on all device certs

60 дней это не то же самое, что 5 лет;)

0

Другие решения

Других решений пока нет …