从phpseclib生成的证书有效,但在提交KEYGEN后浏览器无法识别

从phpseclib生成的证书有效,但在提交KEYGEN后浏览器无法识别,php,phpseclib,html5-keygen,spkac,Php,Phpseclib,Html5 Keygen,Spkac,我正在尝试创建一个简单的PKI基础架构供内部使用,我想使用html标记 我知道这个标签会向服务器发送一个SPKAK,wich必须对它进行签名。由于我不能使用exec启动openssl,并且使用PHP5.5,因此处理SPKAK的唯一方法是使用phpseclib 这是我的代码: <?PHP if(isset($_POST['key'])){ header('Content-type: application/x-x509-user-cert'); hea

我正在尝试创建一个简单的PKI基础架构供内部使用,我想使用html
标记

我知道这个标签会向服务器发送一个SPKAK,wich必须对它进行签名。由于我不能使用
exec
启动openssl,并且使用PHP5.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无效证书,因此它与存储在浏览器上的私钥没有关联


正确的方法是什么?

您是使用X509证书进行身份验证,还是仅为特定网站建立https连接?如果以后你可能需要指定网站的名称。例如,
$subject->setDomain('www.google.com','www.yahoo.com')
或其他什么。此外,如果您想将其用作CA,则需要执行
$x509->makeCA()。idk,如果这回答了你的问题与否。我想要客户端身份验证的证书。我已经构建了CA证书,即使使用此脚本,我也可以成功创建新的有效证书。问题是Chrome给出了错误201,而不是将生成的证书与其私钥相关联。我猜它缺少了一些需要的扩展。或者可能需要一个keyUsage字段。我可以在回家后玩这个,但如果你能自己生成一个示例X509证书,你可以使用它登录,然后通过pastebin.com链接发布到这里,我可能可以在我工作的时候完成idk.nope。私钥由标记生成,因此它已经在浏览器上。我只需要签署CSR(在SPKAK内部),然后将其输出到浏览器。事实上,这是可行的,唯一的问题是chrome没有自动导入它,而是给了我错误201当我试图通过Google chrome运行你的脚本时,我得到了错误207,而不是错误201。idk atm是浏览器所期望的。我在浏览器CA中获得了签名证书,这似乎没有什么区别。谁知道呢?也许这会给你带来不同,因为你会犯不同的错误?另外,
$subject->loadCA()
也没有效果
loadCA()
仅用于验证证书,而不是创建证书。在Firefox中,我没有收到任何错误,只是被询问是否要下载该文件。我在207发布了一篇试图找出错误的文章
<?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');