如何在PHP中定义X509证书的特定用途

5
如何在 PHP 5.x 中将 X.509 证书的用途设置为 X509_PURPOSE_ANY
下面的代码会输出以下警告:

Warning: openssl_csr_new() [function.openssl-csr-new.php]: dn: X509_PURPOSE is not a recognized name in /home/www/index.php on line 45

PHP 脚本:
$Configs = array(       
        'config' => 'test.cnf',
        'digest_alg' => 'sha1',
        'x509_extensions' => 'v3_ca',
        'req_extensions' => 'v3_req',
        'private_key_bits' => 2048,
        'private_key_type' => OPENSSL_KEYTYPE_RSA,
        'encrypt_key' => true,
        'encrypt_key_cipher' => OPENSSL_CIPHER_3DES);

$ExtraAttribs = array('X509_PURPOSE' => 'X509_PURPOSE_ANY');

//create cert
$dn      = array('commonName' => 'Chief');
$privkey = openssl_pkey_new($Configs);
$csr     = openssl_csr_new($dn, $privkey, $Configs, $ExtraAttribs);

最后一行是第45行。

1
你尝试过从$ExtraAttribs数组中删除单引号'吗? - Tarek Fadel
1
不起作用。错误信息:“使用未定义的常量X509_PURPOSE - 假定为'X509_PURPOSE'”。 - Mike
4
我找不到证据表明X509证书有一个"purpose"(目的)。我只能找到"Basic Constraints"(基本限制),"Key Usage"(密钥用途)和"Enhanced Key Usage"(增强型密钥用途)。您能否在命令行上使用OpenSSL执行此操作? - Martin
2
@Martin:我认为你是对的,那就是答案。所以,当我创建一个没有“基本限制”的证书时,它必须返回“X509_PURPOSE_ANY”。我会尽快检查它。 - Mike
2
好的,我不知道如何在创建证书时使用PHP添加“基本约束”,但是如果没有设置任何特殊属性,则该证书(根据PHP函数“openssl_x509_parse”)将被创建为以下用途:“sslclient、sslserver、nssslserver、smimesign、smimeencrypt、crlsign、any、ocsphelper、timestampsign”。所以我认为你是正确的。 - Mike
2个回答

5
我找不到任何证明X509证书具有“目的”的迹象。我只能找到“基本约束”、“密钥用途”和“增强密钥用途”。
最接近的是我找到的http://www.openssl.org/docs/apps/verify.html,它说:
为了与以前版本的SSLeay和OpenSSL兼容,没有信任设置的证书被认为对所有目的都有效。

4

目的在于签名 - 不在CSR中。快速查看php文档表明API不支持此操作 - 但您可以通过调用openssl x509 from the shell来实现。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接