【问题标题】:Generate 2048 bit and password protected csr?生成2048位和密码保护的csr?
【发布时间】:2014-10-02 14:43:06
【问题描述】:

我正在尝试通过 PHP 生成 CSR。但是 CA 一直拒绝我的 CSR,因为他们说它不是 2048 位并且不受密码保护。但是当我查看函数 openssl_csr_new() 的 PHP 文档时,我找不到怎么做?

我当前的代码:

$dn = array(
                   'countryName' => $countryName,
                   'stateOrProvinceName' => $stateOrProvinceName,
                   'localityName' => $localityName,
                   'organizationName' => $organizationName,
                   'commonName' => $commonName,
                   'emailAddress' => $emailAddress
               );

               if(!empty($organizationalUnitName))
               $dn['organizationalUnitName'] = $organizationalUnitName;

               $csrSettings = array('private_key_bits' => 2048, 'private_key_type' => OPENSSL_KEYTYPE_RSA, 'encrypt_key' => true);

               // Generate a new private (and public) key pair
               $privkey = openssl_pkey_new($csrSettings);

               // Generate a certificate signing request
               $csr = openssl_csr_new($dn, $privkey, $csrSettings);
               openssl_csr_export($csr, $csrout);
               openssl_pkey_export($privkey, $pkeyout);

我做错了什么?

----- 更新代码:--------

$dn = array(
               'countryName' => $countryName,
               'stateOrProvinceName' => $stateOrProvinceName,
               'localityName' => $localityName,
               'organizationName' => $organizationName,
               'commonName' => $commonName,
               'emailAddress' => $emailAddress
           );

           if(!empty($organizationalUnitName))
           $dn['organizationalUnitName'] = $organizationalUnitName;

           $csrSettings = array('private_key_bits' => 2048, 'private_key_type' => OPENSSL_KEYTYPE_RSA, 'encrypt_key' => true);

           // Generate a new private (and public) key pair
           $privkey = openssl_pkey_new($csrSettings);

           // Generate a certificate signing request
           openssl_pkey_export($privkey, $pkeyout, 'test 1235 aaaaa');

           $csr = openssl_csr_new($dn, $pkeyout, $csrSettings);
           openssl_csr_export($csr, $csrout);

【问题讨论】:

  • 您需要输入密码作为 openssl_pkey_export() 的第三个参数,我认为这应该在您生成密码后立即完成,否则所有其他功能将使用不受密码保护的功能.
  • 谢谢,但这并不能解决问题。仍然保持相同的错误。现在的代码是:$csrSettings = array('private_key_bits' => 2048, 'private_key_type' => OPENSSL_KEYTYPE_RSA, 'encrypt_key' => true); // Generate a new private (and public) key pair $privkey = openssl_pkey_new($csrSettings); // Generate a certificate signing request openssl_pkey_export($privkey, $pkeyout, 'test 1235 aaaaa'); $private_key = $pkeyout; $csr = openssl_csr_new($dn, $pkeyout, $csrSettings); openssl_csr_export($csr, $csrout);
  • 尝试更新您的问题。我看不懂。
  • 据我所知,您无法使用密码保护您的 CSR。请参阅 RFC 2986,Certification Request Syntax Specification。您可以为其添加密码作为属性,但密码用于将来撤销已签名的证书。
  • 原来我正在使用的经销商有一个错误..所有方法都工作正常......

标签: php ssl openssl csr


【解决方案1】:

phpseclib, a pure PHP CSR implementation

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

$privKey = new Crypt_RSA();
extract($privKey->createKey(2048));
$privKey->loadKey($privatekey);

$x509 = new File_X509();
$x509->setPrivateKey($privKey);
$x509->setDNProp('id-at-organizationName', 'phpseclib demo cert');

$csr = $x509->signCSR();

echo $x509->saveCSR($csr);
?>

但是,您不能使用密码保护 CSR。您可以使用密码保护私钥,但无论如何您都不应该与 CA 共享私钥。

如果 CA 坚持您可以向他们询问如何通过 CLI 使用 OpenSSL 执行此操作的示例。也许他们只是不太清楚他们的意思,但有 CLI 命令会让我们肯定知道。

【讨论】:

  • 这令人困惑。目前尚不清楚 CSR 的创建位置。另外,外部 CA 将签署 CSR,因此 PHP 代码也签署 CSR 的原因并不明显。
  • @jww - 正在使用 $x509-&gt;saveCSR($csr) 命令创建 CSR。 CSR 是自签名的。见tools.ietf.org/html/rfc2986#page-8。 CA 所做的是从 CSR 中获取 DN,从中创建 X.509 tbsCertificate,然后从中进行签名。然后将签名算法 OID 和签名附加到 X.509 证书的 tbsCertificate 部分。 CA 没有理由签署 CSR。
【解决方案2】:

您的顺序完全错误,并且由于某种原因您执行了两次openssl_pkey_new()。我强烈建议您阅读文档并真正了解所有这些功能可以做什么,因为您的网站的安全性取决于它。这就是你想要的:

$dn = array(
    'countryName' => $countryName,
    'stateOrProvinceName' => $stateOrProvinceName,
    'localityName' => $localityName,
    'organizationName' => $organizationName,
    'commonName' => $commonName,
    'emailAddress' => $emailAddress
);

$csrSettings = array('private_key_bits' => 2048, 'private_key_type' => OPENSSL_KEYTYPE_RSA, 'encrypt_key' => true);

// Generate a new private (and public) key pair
$privkey = openssl_pkey_new($csrSettings);

// Generate a certificate signing request
$csr = openssl_csr_new($dn, $privkey, $csrSettings);

openssl_csr_export($csr, $csrout);
openssl_pkey_export($privkey, $pkeyout, "test 1235 aaaaa");

echo $csrout . "\n" . $pkeyout;

输出示例:

-----BEGIN CERTIFICATE REQUEST-----
MIIC9DCCAdwCAQAwga4xCzAJBgNVBAYTAlVLMREwDwYDVQQIDAhTb21lcnNldDEU
MBIGA1UEBwwLR2xhc3RvbmJ1cnkxHzAdBgNVBAoMFlRoZSBCcmFpbiBSb29tIExp
bWl0ZWQxHzAdBgNVBAsMFlBIUCBEb2N1bWVudGF0aW9uIFRlYW0xFDASBgNVBAMM
C1dleiBGdXJsb25nMR4wHAYJKoZIhvcNAQkBFg93ZXpAZXhhbXBsZS5jb20wggEi
MA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDKxugfpijCe8iDfbGby4N9wzaZ
vM6KyWUYL+KtdQsc2O/2z/zoiiSe54ikcYO8Cw1evUP16MKnkV9DQJwsUvY8+4C3
IviXpcXRcJ7CsWxwApDHd5j6JbgyfYvrb5EEN1iLM2OZn62QV1XZc+z+5yruxJ6Q
q4M2xpgjtEUyz7d7U6ax+uWW3zop5SfsREAqpGedBmevFs3UIeComOzwKfFbw/a1
Bc6VZ9PXUOVjSYEe8aVkHfRlKsUVUnkYOMoX9PYD84exuIeei8Z9prKU/x31lRj8
ktieFohQJqB5ziA+BwKwwqpgn23awPJ+O3xzUVWYodU01rRrzfyUSfHNVCZrAgMB
AAGgADANBgkqhkiG9w0BAQQFAAOCAQEAinjiPwfIcoXcA7wcJ86QnOAIQEjvrbda
ndyP7n/ol7ROjS/QoEciFeSw7y3/NFE8C5O6Io2rLuMrncHc2PjMgw8C23xBecjb
L+Yf76ZndadOznTURTVrkFCtKKRgjcF+YOXWfGZb35wkaxth/DKPjaofcNkg9UQy
SrjNKyrhRD9bVPvCkBr5mpFo8WdQyEFLoHogDP2NbK2COAc1Ip4ZFfktv3lCcg7h
cnd2zEp4YmmomdE/1TVh+xF//pO+TP7HZtnEP7FysY7uYbF24bH/TO/WSrIAg+Ls
KUxufDlOhzwQPp1LAYGDAQal7lpXEyqMKJ4BsKDqiftnfC0OWXRyCg==
-----END CERTIFICATE REQUEST-----

-----BEGIN ENCRYPTED PRIVATE KEY-----
MIIFDjBABgkqhkiG9w0BBQ0wMzAbBgkqhkiG9w0BBQwwDgQIJdTmCR5euNICAggA
MBQGCCqGSIb3DQMHBAhRp+IcQK5cnQSCBMgEwH8TIgADYq6/WZEHw7RfPdf5bnEi
oCBuqps0JtnIf8BolaqV71HQGVRszbPvjFrWVCjB0hX+RzhlGTJA6KQXSp+QFp3E
gIX+cWdfTrknuM6QoZH5DPhUCqZi+gF4Oe/nzaBdDY0bq+hKqDyHk2WFDx+JLujs
QN4Z/Q+5NzboUQuEHc2Ts09g6yyEyaZBfsaK/KbWxFe+UC/ahzbqWbv4eQYS3TmZ
gE/RzE2iU+SulHmiq1AXUFZE9uIAwRM53X/5lW1Tt3qRFB7jEnp0smOe+HCKDwTo
UcifAlMKj05S62DJAFSzc1TsGpGMJYMq/QcU70+J+DAZ6Pt/50DMNBMfhMxW1B2O
6FT8i/lDofNhQOuDD6xOvFHMaM6JoAGjC/lBulEfSOPysaRNb8ZO75CWjsVHeMfP
lSPyPfF4kAcQVV39xa0bi5tE4t2fUJ1FlhsNg/ooUDa3GV6rx8y+2+pQ/iW6DmYg
OcPDhwpGgUwfptHQcoQeR4imcsNWVAD/Hf53RrtqFCdHd9GsfdIegW6jFitpgICA
7wqIYS8OjBZxB6lzGZz/nfHUYqzxB1wI26ySUXjk3scRwupF0jLWWVpHZ4Sq4XiX
LN6PPsBZXqh1HbaP/CbiQyTRJPNMBY/+duwXzaUEWI7qGaEYWbiYLqyl3wq46ZXj
qFZXhysR5YnvKmeVrdMI+lsuPosS3v+d5fzt8IqVFIf9EwZoE9ZRw9r9oqYiJjSe
L4brzW9HBm6v9U1CGGlylpP9Q4auIs0rctyuM3kRWdPDsss0aoLBDDegHi9BQ1Ph
SUkaLpW2tQXGVhlAYd8M/6Oj70IVsKboNR2DjfY3Te9ltIHGoDxj3Gsdc9+kMwyl
20Cs86dQX5hQWVB0VY2YGItooOsCpvsMBfb9VUlgTCQjHwf4ClLlrxjTv/e81i8u
kdja1sbjeqYSrW3WS4k/jyrKuUVp4NjtYG2JWZjTzpOF2Fs/j9NJVAhtsBx81wXt
89jSiCGS4dniuoDJ9U+wXLpnpDdVRF3Og5Wss+iLBinGwNyvUVx1ph1MoLRbIedL
N79JaucEIV9pFfptM/je26HmNKbTpF1tYc8R4U22sUbms3+AOjDaU2Y6iT62RwnM
zDQEQ6890q/f8EFJkb3Y38j0tObolJM/dyMQigziqHysebfNEiwqg5Ij93kHzOK5
JQF5P/L3efUOV40Cn3ndkiKAtLWgFubqQ4fD0MOwSHIKBv+PxnY2eXJRb4/x3AEo
KvJwvN9HB1znueQN5bMx0OyqR/sdy5zZ4w4pDI+asgNy/+B7qk56Jf5WpXvsPGAi
Wd6TmGX3DY/u2cRJ7cjMmnAsJ1xT4s3z0vJYMcOrdA1hLv0sI7TyRkBJTua4QjIc
v+pz79LQt1CYHTdzG+qtL1X2SU+61bqlncgy+Yhn42g59KGYmGFGWH7CuuJCI5eg
VWwMCCWQgH2Tg2PZiptC2rVzgv8aM+H4QpaI8th40UszPJt17HK9Ad1pJ2TYqryI
77IBIcHWl8Yp+Zr5nGaIJxPNv/XAKOGo8VGHM9U0YnsaRsPW5z8bwKD3TIApRQBL
Ok60tTIlqDoBIB6/o9G02MLeTx9ycfssUVzTIUn9pQR6PBiERhtxb1Sh42xDJVof
zt4=
-----END ENCRYPTED PRIVATE KEY-----

【讨论】:

  • 相关:可以通过openssl req -in &lt;csr.pem&gt; -text -noout查看请求
  • 'commonName' =&gt; $commonName, - 从外观上看,DNS 名称(如www.example.com)在通用名称中。 IETF 和 CA/B 论坛均不赞成这样做,因此不应该这样做。相反,应将 DNS 名称放在主题备用名称 (SAN) 中。 SAN 似乎完全消失了。
  • @jww,也许您应该在php.net 上提交错误报告,因为该页面甚至没有提到使用 SAN。我的回答大部分来自那里。
猜你喜欢
  • 1970-01-01
  • 2016-12-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-04-08
  • 1970-01-01
  • 1970-01-01
  • 2016-11-01
相关资源
最近更新 更多