【问题标题】:In PHP how do I get a CSR's public key?在 PHP 中,我如何获得 CSR 的公钥?
【发布时间】:2011-12-21 00:42:12
【问题描述】:

我有一个网页,它接受 CSR(证书签名请求)并对其进行签名。问题是:我不知道如何从 CSR 中提取公钥。我尝试了openssl_csr_get_public_key($request),其中 request 是保存 pem 编码请求的字符串,但这似乎不起作用。关于如何做到这一点的任何想法?

谢谢!

【问题讨论】:

    标签: php openssl x509 csr


    【解决方案1】:

    我发现phpseclib's pure PHP CSR implementation 通常更“容错”。例如。

    <?php
    include('File/X509.php');
    
    $x509 = new File_X509();
    $csr = $x509->loadCSR('...'); // see google.crt
    
    print_r($sr);
    ?>
    

    有了它,您应该能够从 CSR 访问您想要的任何内容!

    【讨论】:

    • 是的,我最终不得不切换到 phpseclib,因为无论如何我都想获取/设置 SAN,哈哈。但在这个问题中,问题在于格式。我认为 phpseclib 的 ASN1 解析器会因不正确的 base64 编码而烦恼。
    【解决方案2】:

    您不想签署公钥本身,而是签署 CSR,即签名包含 CSR 中的元数据,该元数据也与公钥一起签署。

    PHP 命令是 openssl_csr_sign.

    为了使其工作,您需要一个 CSR(由客户端提供)和一个 CAcert 文件(从服务器上的文件加载并作为字符串传递给您的命令)。要生成后者,请看这里:http://www.openssl.org/docs/apps/ca.html(官方)和这里(如何)http://www.freebsdmadeeasy.com/tutorials/freebsd/create-a-ca-with-openssl.php

    显然,如果您是“真正的”CA——例如您有一个由其他人信任的 CA 签名的证书——那么您已经有一个证书(由他们签名)。

    一般来说,签署他人提供的公钥并不是一个好习惯。您要做的是让您的客户提供 CSR 元数据,然后为他们生成他们的密钥,返回私钥和证书——这可以以 PKCS 12 格式完成(参见openssl_pkcs12_export--整个交换应该通过 SSL 进行。

    【讨论】:

    • “警告:openssl_csr_sign() [function.openssl-csr-sign]: cannot get CSR from parameter 1”是我将 csr 作为 pem 编码字符串的第一个参数放入时得到的
    • 您是使用 openssl_csr_new() 在本地生成 CSR,还是从外部提供?对于后者,它是如何生成和编码的?
    • 这可能是很多事情......但如果他正在制作文件,他应该使用 PEM_write_bio_X509_REQ(假设数据在线发送给您)或 PEM_write_X509_REQ()。 openssl c api 有点棘手。他可能想先在命令行中通过 openssl req -nodes -newkey rsa:2048 -keyout myserver.key -out server.csr 生成 CSR,然后把文件发给你看你能不能签名。
    • 现在我只是好奇——你的问题解决了吗?您的客户的定制汽车一代有问题吗?
    • 哇,我没看到你之前的评论,抱歉。第一个关于 cannot get the csr 的错误是 url 问题。事实证明,PHP 正在将 + 转换为导致问题的空格。客户最初签署了 csr,但在数据更改后没有辞职,导致第二个问题。
    【解决方案3】:

    确保 csr 格式正确。检查 PHP 是否没有将加号更改为空格或类似的东西。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-01-20
      • 1970-01-01
      • 2017-03-11
      • 2021-01-24
      • 2014-03-11
      • 2013-02-06
      • 2018-07-26
      相关资源
      最近更新 更多