我有一个生成 CSR 的脚本,可以与 Windows CA 集成进行签名,但我希望可以选择使用本地 CA 进行签名,因此我使用了 openssl_sign_csr 函数。它正在签署证书,但是,它不保留 x509 属性(即扩展密钥用法和主题备用名称)。
我将配置文件传递给它,并且尝试了在互联网上找到的一些示例,我包含的关键内容是
copy_extensions = copy
和 x509_extensions = usr_cert
以及 usr_cert 块具有:
basicConstraints=CA:FALSE
nsComment = "OpenSSL Generated Certificate"
subjectKeyIdentifier=hash
authorityKeyIdentifier=keyid,issuer
但是,任何不会导致错误的配置组合都不会携带任何扩展。
我知道 CSR 包含它们,因为当由 certsrv 签名时它就带有它们。
希望能够从过去已经实现此功能的任何人那里获得一些见解。 (此外,密钥用途将用于服务器识别,很少用于客户端识别,如果这对其有任何影响的话)
看看这是否对您有帮助:
<?php
$csr = file_get_contents('<your csr path and file>.csr');
$config = array(
'config' => '<openssl path configuration file>.cnf', // openssl config path
'digest_alg' => 'sha256', // hash algo
'x509_extensions' => 'usr_cert', // X.509 extension
'req_extensions' => 'req_ext', // CSR extension
'private_key_bits' => 2048, // Key size
);
$privateKey = openssl_pkey_new($config);
$signedCert = openssl_csr_sign($csr, null, $privateKey, 365, $config, time());
openssl_x509_export($signedCert, $certOut);
echo $certOut;
?>