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

Posted

技术标签:

【中文标题】OpenSSL 真的需要到 openssl.conf 的路径吗?【英文标题】:Does OpenSSL really need a path to openssl.conf? 【发布时间】:2012-03-23 03:25:52 【问题描述】:

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

官方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,
);

【问题讨论】:

.conf 文件用于指定默认值,因此您不必为您创建的每个证书一遍又一遍地输入相同的内容。不使用默认值很好,只是更乏味。 我不是 PHP/OpenSSL 专家,但似乎某些配置设置无法通过 PHP 脚本定义/更改。有人可以确认/驳回这一点吗? 【参考方案1】:

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

如果不指定替代的openssl配置文件,会自动采用默认的openssl.cnf。

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

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

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

看来这4行是openssl.cnf必须包含的最低限度。

【讨论】:

【参考方案2】:

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

从某种意义上说,这可能有点像重新制作 session_id

我的问题:我是否有理由明确指定 openssl.conf 的路径,因为没有它似乎可以正常工作:

这里没有创建自签名证书,而是重新创建它。因此,当您不提供路径时,它很好,因为它已经有来自 Apache 的路径。

【讨论】:

如果我指定一个不包含所有配置值的配置文件怎么办:它是否采用默认配置文件中的默认值? 老实说,我不确定这会如何影响 PHP OpenSSL,理论上不可能正确继承这些属性。但是 PHP 可能足够聪明。但是我会回避它并保留您自己的参数 - 您很容易在浏览器中收到无效证书警告【参考方案3】:

在没有 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";

【讨论】:

以上是关于OpenSSL 真的需要到 openssl.conf 的路径吗?的主要内容,如果未能解决你的问题,请参考以下文章

如何将OpenSSL添加到Xcode项目中

OpenSSL(私有CA)

php的openssl扩展版本兼容问题

在 OS X 上构建多架构 OpenSSL

Windows上部署Cygwin运行环境之---TAR/OPENSSL

如何将 OpenSSL ECDSA 密钥加载到 C# 中?