Созданный сертификат из phpseclib действителен, но не распознается браузерами после отправки KEYGEN

Я пытаюсь создать простую инфраструктуру PKI для внутреннего использования, и я хочу использовать HTML <keygen> тег.

Я знаю, что этот тег отправляет SPKAK на сервер, который должен будет подписать его. Так как я не могу использовать exec чтобы запустить openssl и иметь php 5.5, единственный способ обработать SPKAK — использовать phpseclib.

Это мой код:

<?PHP
if(isset($_POST['key'])){
header('Content-type: application/x-x509-user-cert');
header('Content-disposition: attachment; filename=user.crt');
include('File/X509.php');

$capem = file_get_contents('root-ca.crt');

$subject = new File_X509();
$subject->loadCA($capem);
$subject->loadSPKAC($_POST['key']);
$subject->setDN('CN=Username');

$issuer = new File_X509();
$issuer->loadX509($capem);
$cakey = new Crypt_RSA();
$cakey->setPassword('SECRETPASSWORD');
$cakey->loadKey(file_get_contents('root-ca.key'));
$issuer->setPrivateKey($cakey);

$x509 = new File_X509();
$cert = $x509->sign($issuer, $subject);

$x509->loadX509($cert);
$x509->setExtension('id-ce-keyUsage', array('digitalSignature', 'keyEncipherment'));
$x509->setStartDate('-1 day');
$x509->setEndDate('+ 3 year');
$x509->setSerialNumber('1235', 10);
$cert = $x509->sign($issuer, $x509);

echo $x509->saveX509($cert);
}else{
?>
<form method="POST">
<keygen name="key" keytype="RSA" challenge="ucert">
<button>SEND</button>
</form>
<?PHP
}
?>

Странно то, что сгенерированный сертификат действителен (Windows распознает его), но браузер (и Chrome, и Firefox в моих тестах) не распознает его, выдав ошибку 201 INVALID CERT, поэтому он не связан с закрытым ключом, хранящимся в браузере. ,

Какой правильный способ сделать это?

1

Решение

<?php
include('File/X509.php');
include('Crypt/RSA.php');

// create private key / x.509 cert for stunnel / website
$privKey = new Crypt_RSA();
extract($privKey->createKey());
$privKey->loadKey($privatekey);

$pubKey = new Crypt_RSA();
$pubKey->loadKey($publickey);
$pubKey->setPublicKey();

$subject = new File_X509();
$subject->setDNProp('id-at-organizationName', 'phpseclib demo cert');
$subject->setPublicKey($pubKey);

$issuer = new File_X509();
$issuer->setPrivateKey($privKey);
$issuer->setDN($subject->getDN());

$x509 = new File_X509();

$x509->loadX509($x509->saveX509($x509->sign($issuer, $subject)));

$x509->setExtension('id-ce-keyUsage', array('digitalSignature', 'keyEncipherment', 'dataEncipherment'));
$x509->setExtension('id-ce-extKeyUsage', array('id-kp-serverAuth', 'id-kp-clientAuth'));

$result = $x509->sign($issuer, $x509);

file_put_contents('key.pem', $privKey->getPrivateKey() . "\r\n" . $x509->saveX509($result));

exec('openssl pkcs12 -export -out file.pfx -in key.pem');

Мне удалось импортировать полученный файл file.pfx в Google Chrome. Теперь он отображается как «Персональный сертификат».

0

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

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

По вопросам рекламы [email protected]