OpenSSL真的需要openssl.conf的路径吗?

Rol*_*and 15 php openssl certificate x509

我想在PHP 5.x中创建一个自签名证书.使用我自己的(替代)openssl配置,应该由我的PHP代码定义.PHP脚本将在不同的环境(共享托管Web服务器)上运行.

官方PHP手册说:

默认情况下,系统openssl.conf中的信息用于初始化请求; 您可以通过设置configargs的config_section_section键来指定配置文件部分.您还可以通过将config键的值设置为要使用的文件的路径来指定备用openssl配置文件.如果configargs中存在以下键,则表现为openssl.conf中的等效键,如下表所示.....

我的问题:我有必要明确指定openssl.conf的路径,因为没有它它似乎工作正常:

$Configs = array(       
    'digest_alg' => 'sha1',
    'x509_extensions' => 'v3_ca',
    'req_extensions' => 'v3_req',
    'private_key_bits' => 1024,
    'private_key_type' => OPENSSL_KEYTYPE_RSA,
    'encrypt_key' => true,
    'encrypt_key_cipher' => OPENSSL_CIPHER_3DES
);

$privkey = openssl_pkey_new();
$csr = openssl_csr_new($dn, $privkey, $Configs);
$sscert = openssl_csr_sign($csr, null, $privkey, 365, $Configs);
Run Code Online (Sandbox Code Playgroud)

编辑:

PHP手册的用户贡献说明中,为什么他们总是指定openssl.cnf的路径?例如:

$configargs = array(
    'config' => '/etc/ssl/openssl.cnf',
    'digest_alg' => 'md5',
    'x509_extensions' => 'v3_ca',
    'req_extensions'   => 'v3_req',
    'private_key_bits' => 666,
    'private_key_type' => OPENSSL_KEYTYPE_RSA,
    'encrypt_key' => false,
);
Run Code Online (Sandbox Code Playgroud)

Hom*_*der 11

OpenSSL中有许多配置设置无法通过$ configargs在PHP中定义(传递给OpenSSL函数的PHP参数).

如果您没有指定替代的openssl配置文件,它将自动采用默认的openssl.cnf.

建议:由于您的脚本将在不同的服务器上运行,因此您应始终使用自己的openssl.cnf.

只需创建一个简单的文本文件,并在其中放入以下4行.然后将路径传递给您正在使用的OpenSSL函数(请查看上面的第二个示例).

distinguished_name  = req_distinguished_name
[req_distinguished_name]
[v3_req]
[v3_ca]
Run Code Online (Sandbox Code Playgroud)

似乎这4行是openssl.cnf必须包含的最小行.


con*_*ers 6

对此的回答与SSL的作用有关.它是围绕客户端和服务器之间的html/http对话的"shell".Apache运行它.它并非真正"在"PHP领域.当你选择重新创建密钥对时,你真正在做的就是在shins中踢Apache,迫使客户端/服务器用一对新的SSL密钥对重新启动他们的对话.

在某些意义上,这可能被视为有点像重新构建session_id

我的问题:我有必要明确指定openssl.conf的路径,因为没有它它似乎工作正常:

这里没有创建自签名证书,重新创建它.因此,当你不提供路径时,它就可以了,因为它已经有了Apache的路径.

  • 如果我指定的配置文件不包含所有配置值,该怎么办:它是否采用默认配置文件中的默认值? (2认同)