如何在使用openssl_sign_csr签署CSR时保留x509属性?
2024-03-06 06:48:38
使用 openssl_sign_csr 签署 CSR,同时保留 x509 属性
问题
签署证书签名请求 (CSR) 对于维护敏感数据的安全性和完整性至关重要。但是,使用 PHP 中的 openssl_sign_csr 函数可能会导致丢失 CSR 中的关键 x509 属性,例如扩展密钥用途和主题备用名称。
解决方法
要保留 x509 属性,我们需要修改 openssl.cnf 配置文件,并在其中添加 copy_extensions = copy
和 x509_extensions = usr_cert
指令。usr_cert
块包含所需的 x509 扩展,如下所示:
[ usr_cert ]
basicConstraints=CA:FALSE
nsComment = "OpenSSL Generated Certificate"
subjectKeyIdentifier=hash
authorityKeyIdentifier=keyid,issuer
步骤指南
1. 配置 openssl.cnf:
修改 openssl.cnf 配置文件,添加 usr_cert 块和必要的 x509 扩展。
2. 生成 CSR:
使用现有的脚本生成 CSR,并确保其包含所需 x509 属性。
3. 使用 openssl_sign_csr:
利用 openssl_sign_csr 函数签署 CSR,并指定修改后的 openssl.cnf 配置文件。
4. 验证扩展:
检查签署的证书以确保它包含保留的 x509 属性。
示例代码
$csr = file_get_contents('csr.pem');
$key = file_get_contents('private_key.pem');
$config = 'openssl.cnf';
$params = [
'config' => $config,
'digest_alg' => 'sha256',
'private_key_bits' => 2048,
'private_key_type' => OPENSSL_KEYTYPE_RSA,
'x509_extensions' => 'usr_cert',
];
$cert = openssl_csr_sign($csr, $key, $params);
if ($cert) {
file_put_contents('signed_cert.pem', $cert);
} else {
echo openssl_error_string();
}
结论
通过修改 openssl.cnf 配置文件并使用 copy_extensions = copy
和 x509_extensions = usr_cert
指令,我们可以使用 openssl_sign_csr 签署 CSR,同时保留 x509 属性。这对于确保签署证书的安全性、完整性和功能至关重要。
常见问题解答
1. 为什么需要保留 x509 属性?
x509 属性提供了关于证书的重要信息,例如其用途和颁发者。保留这些属性对于证书的正确功能至关重要。
2. copy_extensions = copy
和 x509_extensions = usr_cert
指令有什么作用?
copy_extensions = copy
允许我们将 CSR 中的扩展复制到签署的证书中。x509_extensions = usr_cert
指定包含所需 x509 扩展的配置文件部分。
3. 如何在签署的证书中检查 x509 属性?
可以使用 openssl x509 -noout -text
命令查看签署的证书中的 x509 属性。
4. 此方法仅适用于 PHP 吗?
这种方法也适用于使用 openssl 库的其他语言。
5. 还有其他保留 x509 属性的方法吗?
可以使用 openssl req -x509
命令直接签署 CSR,但这种方法要求提供更复杂的参数。