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

时间:2012-03-05 16:37:56

标签: php openssl certificate x509

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

官方PHP Manual说:

  

默认情况下,系统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);

修改

PHP Manual的用户贡献说明中,为什么他们总是指定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,
);

3 个答案:

答案 0 :(得分:11)

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

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

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

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

distinguished_name  = req_distinguished_name
[req_distinguished_name]
[v3_req]
[v3_ca]

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

答案 1 :(得分:6)

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

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

  

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

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

答案 2 :(得分:2)

在没有OpenSSL的PHP​​中创建自签名证书(需要phpseclib, a pure PHP X.509 implementation)...

<?php
include('File/X509.php');
include('Crypt/RSA.php');

// create private key / x.509 cert for stunnel / website
$privKey = new Crypt_RSA();
extract($privKey->createKey());
$privKey->loadKey($privatekey);

$pubKey = new Crypt_RSA();
$pubKey->loadKey($publickey);
$pubKey->setPublicKey();

$subject = new File_X509();
$subject->setPublicKey($pubKey);
$subject->setDNProp('id-at-organizationName', 'phpseclib demo cert');
$subject->setDomain('www.whatever.com');

$issuer = new File_X509();
$issuer->setPrivateKey($privKey);
$issuer->setDN($subject->getDN());

$x509 = new File_X509();
$x509->setStartDate('-1 month');
$x509->setEndDate('+1 year');
$x509->setSerialNumber(chr(30));

$result = $x509->sign($issuer, $subject);
echo "the stunnel.pem contents are as follows:\r\n\r\n";
echo $privKey->getPrivateKey();
echo "\r\n";
echo $x509->saveX509($result);
echo "\r\n";