返回

如何在使用openssl_sign_csr签署CSR时保留x509属性?

php

使用 openssl_sign_csr 签署 CSR,同时保留 x509 属性

问题

签署证书签名请求 (CSR) 对于维护敏感数据的安全性和完整性至关重要。但是,使用 PHP 中的 openssl_sign_csr 函数可能会导致丢失 CSR 中的关键 x509 属性,例如扩展密钥用途和主题备用名称。

解决方法

要保留 x509 属性,我们需要修改 openssl.cnf 配置文件,并在其中添加 copy_extensions = copyx509_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 = copyx509_extensions = usr_cert 指令,我们可以使用 openssl_sign_csr 签署 CSR,同时保留 x509 属性。这对于确保签署证书的安全性、完整性和功能至关重要。

常见问题解答

1. 为什么需要保留 x509 属性?

x509 属性提供了关于证书的重要信息,例如其用途和颁发者。保留这些属性对于证书的正确功能至关重要。

2. copy_extensions = copyx509_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,但这种方法要求提供更复杂的参数。