【发布时间】:2018-07-30 04:31:02
【问题描述】:
我使用以下代码通过我自己的 CA 签署 CSR:
<?php
require_once("vendor/autoload.php");
$privKey = new \phpseclib\Crypt\RSA();
$privKey->setHash('sha512');
$keypair = $privKey->createKey(4096);
$privKey->loadKey($keypair['privatekey']);
$pubKey = new \phpseclib\Crypt\RSA();
$pubKey->loadKey($keypair['publickey']);
$pubKey->setPublicKey();
$subject = new \phpseclib\File\X509();
$subject->setPrivateKey($privKey);
$subject->setPublicKey($pubKey);
$subject->setDNProp("id-at-organizationName", "??");
$subject->setDNProp("id-at-organizationalUnitName", "?");
$subject->setDNProp("id-at-commonName", "127.0.0.1");
$subject->setDNProp("id-at-localityName", "?");
$subject->setDNProp("id-at-stateOrProvinceName", "?");
$subject->setDNProp("id-at-countryName", "??");
$subject->setDNProp("emailAddress", "?");
$subject->loadCSR($subject->saveCSR($subject->signCSR('sha512WithRSAEncryption')));
$subject->setExtension('id-ce-basicConstraints', array('cA'=>FALSE));
$subject->setExtension('netscape-cert-type', ['SSLServer']);
$subject->setExtension('id-ce-keyUsage', ['digitalSignature', 'keyEncipherment'], TRUE);
$subject->setExtension('id-ce-extKeyUsage', ['id-kp-serverAuth', 'id-kp-OCSPSigning'], TRUE);
$strCSR = $subject->saveCSR($subject->signCSR('sha512WithRSAEncryption'));
file_put_contents("a.csr", $strCSR);
$cakey = new \phpseclib\Crypt\RSA();
$cakey->setPassword(file_get_contents("private/passphrase.txt"));
$cakey->loadKey(file_get_contents("private/cakey.pem"));
$ca = new \phpseclib\File\X509();
$ca->loadX509(file_get_contents("cacert.pem"));
$ca->setPrivateKey($cakey);
$x509 = new \phpseclib\File\X509();
$x509->makeCA();
@$x509->setEndDate(new \DateTime("2018-08-08 08:08:08", new \DateTimeZone(@date_default_timezone_get())));
$x509->setSerialNumber(999, 10);
$sign_result = $x509->sign($ca, $subject, $subject->currentCert['signatureAlgorithm']['algorithm']);
$cert = $x509->saveX509($sign_result);
file_put_contents("a.crt", $cert);
但是,签名证书似乎有这样的问题:https://i.stack.imgur.com/F4p5I.png
谁能告诉我我做错了什么?
我的环境信息:
PHP 7.2.0
phpseclib 2.0
Windows 7
编辑: 我用openssl验证过,之后好像少了点什么 第二个“签名算法”……
Certificate:
Data:
***********
Signature Algorithm: sha512WithRSAEncryption
***************
X509v3 extensions:
***********
Signature Algorithm: sha512WithRSAEncryption
**(something is missing here, there's nothing after this point)**
编辑:我的 openssl.cnf
default_bits = 4096
default_md = sha512
dir = "."
[ca]
default_ca = CA_default
[CA_default]
serial = $dir/serial.txt
database = $dir/index.txt
new_certs_dir = $dir/newcerts
certificate = $dir/cacert.pem
private_key = $dir/private/cakey.pem
default_days = 3650
preserve = no
email_in_dn = no
nameopt = default_ca
certopt = default_ca
policy = policy_match
default_crl_days = 365
[policy_match]
countryName = optional
stateOrProvinceName = optional
organizationName = optional
organizationalUnitName = optional
commonName = supplied
emailAddress = supplied
[req]
string_mask = nombstr
distinguished_name = req_distinguished_name
req_extensions = v3_req
[req_distinguished_name]
............
[v3_ca]
basicConstraints = CA:TRUE
subjectKeyIdentifier = hash
authorityKeyIdentifier = keyid:always,issuer:always
keyUsage = critical, cRLSign, digitalSignature, keyCertSign
[v3_req]
........
【问题讨论】:
-
当我使用有效的私钥和有效的 CA 证书时,它对我来说很好。由于您没有发布 private/cakey.pem 或 cacert.pem 我想我的问题是......私钥是 RSA 私钥吗? phpseclib 目前不支持 ECDSA / DSA 密钥。私钥是否与证书对应?如果您可以使用测试私钥生成测试 CA 证书,并且如果您可以发布这些证书,我可以更好地重现该问题,但在那之前,我只能抓住稻草。
-
您的 CA 证书也可能没有作为 CA 证书安装在您的系统中..
-
我的 CA 证书是使用
openssl req -new -x509 -extensions v3_ca -keyout ca.key -out ca.crt -config ./openssl.cnf生成的;我确实尝试在浏览器中安装我的 CA,但仍然没有成功。 -
ca.key 是什么类型的密钥? ECDSA?动态搜索广告? RSA? ca.crt 中有哪些参数?我只是假设有一个示例 CA 证书和私钥可以重现该问题,因为没有它,我能做的最好的就是猜测。有了它,我可以在本地安装它并准确重现问题..
-
我的 ca.key 是 RSA。