代码之家  ›  专栏  ›  技术社区  ›  BarsMonster

openssl\u验证和“错误:0906D06C:PEM公司例行程序:PEM\ U read\ U bio“:无起始行”

  •  11
  • BarsMonster  · 技术社区  · 14 年前

    当我试着 openssl_verify error:0906D06C:PEM routines:PEM_read_bio:no start line ,但函数本身工作正常(如果消息被修改,则返回0,如果消息完整,则返回1)。 openssl_sign

    我该怎么修?

    目前,我使用openssl生成的公钥:

    define("SC_MSG_PUBLIC", <<<EOD
    -----BEGIN PUBLIC KEY-----
    MFwwDQYJKoZIhvcNAQEBBQADSwAwSAJBALjPcOckMHDVLiUstcRwwx8kF5PzsiEs
    rskyndWisbXMLU9BHomXwL7Qg2L91jE+sNSobkzBDF41CbwDiNlofZUCAwEAAQ==
    -----END PUBLIC KEY-----
    EOD
    );
    

    你知道为什么会触发这个错误,但一切正常吗?

    试图从private中生成公钥,并使用它,但似乎完全相同,错误消息相同:-S

    $pkey = openssl_pkey_get_private(SC_MSG_PRIVATE);
    $keyDetails = openssl_pkey_get_details($pkey);
    file_put_contents('c:\publickey', $keyDetails['key']);
    

    此外,我还尝试安装了所有内容的更新版本(PHP5.3.1、OpenSSL 1.0.0a)-结果相同。我在窗户上。

    4 回复  |  直到 8 年前
        1
  •  16
  •   Arc    14 年前

    你打过电话吗 openssl\验证()

    据我所知,一些PHP OpenSSL函数并不正确地支持裸公钥,尽管尽管有错误,但它确实正确地进行了验证,这似乎很奇怪。

    <?php
    $private = openssl_pkey_get_private(file_get_contents('private'), 'passphrase');
    
    // This causes the "no start line" error when using a naked public key:
    $public  = openssl_pkey_get_public(file_get_contents('public')); // <-- this should be cert
    
    echo openssl_error_string()."\n";
    
    openssl_sign('Test', $sig, $private);
    var_dump(openssl_verify('Test', $sig, $public));
    
    echo openssl_error_string()."\n";
    ?>
    

    在Linux/UNIX shell(如bash)中将公钥转换为简单证书的示例(有关更多信息,请参阅OpenSSL文档或一些教程):

    # Create certificate request
    openssl req -new -days 3600 -key [PRIVATE-KEY-FILE] -out [REQUEST-TMP-FILE]
    
    # Create certificate from request
    RANDFILE=[RANDOM-TMP-FILE] openssl x509 -req -in [REQUEST-TMP-FILE] -signkey [PRIVATE-KEY-FILE] -out [CERTIFICATE-OUT-FILE]
    

    这还将创建您以后可能要删除的临时文件,即 [随机TMP文件] .

    PHP示例代码可以在 http://de.php.net/manual/en/function.openssl-csr-new.php .

        2
  •  4
  •   DomQ    14 年前

    如果其他所有人都有一个errno,它通过成功的操作自动重置为零,那么OpenSSL有一个“错误堆栈”,您需要手动清空它。参见函数 openssl_error_string 哪个是 implemented 依据 ERR_get_error . 很可能您看到的错误消息与您的代码无关;请尝试在代码之前添加以下内容:

    while ($msg = openssl_error_string()) {};
    

    while ($msg = openssl_error_string())
        echo "OpenSSL error when doing foo:" . $msg . "<br />\n";
    
        3
  •  2
  •   user437265 user437265    14 年前
        4
  •  0
  •   shamittomar    14 年前

    原因:

    可能的解决方案:

    1. 字符问题可能在您的键中,请尝试以下操作(不使用换行符等):

    .

    define("SC_MSG_PUBLIC", "MFwwDQYJKoZIhvcNAQEBBQADSwAwSAJBALjPcOckMHDVLiUstcRwwx8kF5PzsiEsrskyndWisbXMLU9BHomXwL7Qg2L91jE+sNSobkzBDF41CbwDiNlofZUCAwEAAQ==");