【发布时间】:2014-11-24 08:25:10
【问题描述】:
我正在尝试创建一个简单的 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,所以它与私钥无关存储在浏览器上。
这样做的正确方法是什么?
【问题讨论】:
-
您是使用 X509 证书进行身份验证还是只是为特定网站建立 https 连接?如果是后者,您可能需要指定网站。例如。
$subject->setDomain('www.google.com', 'www.yahoo.com')什么的。此外,如果您想将其用作 CA,您需要执行$x509->makeCA();。 idk 是否回答了你的问题。 -
我想要用于客户端身份验证的证书。我已经构建了 CA 证书,即使使用此脚本,我也可以成功创建新的有效证书。问题是 Chrome 给出了错误 201 而不是将生成的证书与其私钥相关联
-
我的猜测是它缺少一些需要的扩展。或者可能需要一个 keyUsage 字段。当我回到家时,我可以玩这个,但如果你可以,你自己生成一个示例 X509 证书,你可以使用它登录,然后通过 pastebin.com 链接将其发布在这里,我也许可以在我在工作身份证。
标签: php phpseclib html5-keygen spkac