菜单

error:0906D064:PEM routines:PEM_read_bio:bad base64 decode

2019年2月1日 - Php

后天在动用easywechat对接集团打款到银行卡时,碰着了五个错误

打开终端:

 error:0906D064:PEM
routines:PEM_read_bio:bad base64 decode 和 error:0906D06C:PEM routines:PEM_read_bio:no start
line 。

base --help

base64 --help
Usage:  base64 [-hvD] [-b num] [-i in_file] [-o out_file]
  -h, --help     display this message
  -D, --decode   decodes input
  -b, --break    break encoded string into num character lines
  -i, --input    input file (default: "-" for stdin)
  -o, --output   output file (default: "-" for stdout)

那是因为想要正确的施用密钥,须求满意以下七个规范。

可以看出用法
-D 是decode 也就是解码,将base64 反解析
-b 就是每行的字符的个数
-i 就是点名输入文件的门道
-o 就是点名输出文件的不二法门

  1. 集体密钥的上马需求丰裕”—–BEGIN RSA PUBLIC
    KEY—–\n”,结尾须求添加”\n—–BEGIN RSA PUBLIC
    KEY—–\n”。不然会报 error:0906D06C:PEM
    routines:PEM_read_bio:no start line 。
  2. 公钥字符串每隔64隔字符要求加一个换行,负责会报 error:0906D06C:PEM routines:PEM_read_bio:no
    start line 。
  3. 如上2步应该可以知足有些语言的须求,但php不行,还要求讲以上PKCS#1
    格式密钥转换成PKCS#8 格式密钥。

示例:

下边看下具体操作。依照文档使用如下命令:

基本功标准:

留存一个文本: bs
内容: admin:password123

./vendor/bin/easywechat payment:rsa_public_key \
    --mch_id=14339221228 \
    --api_key=36YTbDmLgyQ52noqdxgwGiYy \
    --cert_path=/Users/overtrue/www/demo/apiclient_cert.pem \
    --key_path=/Users/overtrue/www/demo/apiclient_key.pem

1. 直接base64 指定文件内容,将会在命令行中直接突显结果

base64 bs
-> YWRtaW46cGFzc3dvcmQxMjM=

将会在时下目录生成一个 ./public-14339221228.pem 文件。

2. base64 指定文件到指定文件

base64 -i bs -o bs.base64

假使直白动用这几个public
key文件,会报一个野鸡的key错误,然后可以窥见easywechat有这么一段源码。

3. base64 指定文件到指定文件,每行3个

base64 -b 3 -i bs -o bs.base64
function rsa_public_encrypt($content, $publicKey)
{
    $encrypted = '';
    openssl_public_encrypt($content, $encrypted, openssl_pkey_get_public($publicKey), OPENSSL_PKCS1_OAEP_PADDING);

    return base64_encode($encrypted);
}

4. base64 解码 指定文件到指定文件,每行3个

base64 -D -b 3 -i bs -o bs.base64

报非法key是因为 openssl_pkey_get_public($publicKey) 再次回到的是false,那时,你可以加一行代码。

function rsa_public_encrypt($content, $publicKey)
{
    $encrypted = '';
    openssl_public_encrypt($content, $encrypted, openssl_pkey_get_public($publicKey), OPENSSL_PKCS1_OAEP_PADDING);
    var_dump(openssl_error_string());
    return base64_encode($encrypted);
}

那是会师到以下错误。

error:0906D06C:PEM routines:PEM_read_bio:no start line

这是因为easywechat直接扭转的 public-14339221228.pem
 文件中,key的格式是这么的。

-----BEGIN RSA PUBLIC KEY-----MIIBCgKCAQEAuVvw3DeWx4wdDl2/I0aAMma2bH3hhU89rqMhJWvQ41uRbatxZxMZ13iEMXg8UfTBR+UGl+NCzpkkTjjcVm/2TcIdWgZCLr3Rzo4XD5hRLs8ExI+uzKnmar......CmtgTKWkqkhCnLwr7bRRzBUi3po7UDLWPePrH1ICd83/wIDAQAB-----END RSA PUBLIC KEY-----

那种格式是一无所能的,不可能间接放到函数 openssl_pkey_get_public 中动用。需求对她展开格式化成如下形式。

-----BEGIN RSA PUBLIC KEY-----
MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAuVvw3DeWx4wdDl2/I0aA
Mma2bH3hhU89rqMhJWvQ41uRbatxZxMZ13iEMXg8UfTBR+UGl+NCzpkkTjjcVm/2
......
......
EXFyDtEykuiMuhn3A7WWNkc3voHML9C4kDWdJrX3wjQrwZbW3p3F1O/9pGHLNzn9
p3la2C9/Ve3jLdG8lEzvkCmtgTKWkqkhCnLwr7bRRzBUi3po7UDLWPePrH1ICd83
/wIDAQAB
-----END RSA PUBLIC KEY-----

率先行是 —–BEGIN RSA PUBLIC KEY—– ,最后一行是 —–END RSA
PUBLIC KEY—– ,然后中间的key每64个字符一行,可以用php的

wordwrap($key, 64, "\n", true)

函数处理。但那种是PKCS#1 格式密钥。php是函数 openssl_pkey_get_public 也无法利用。要求将其转移成PKCS#8
格式密钥。可以用如下命令

openssl rsa -RSAPublicKey_in -in public-14339221228.pem -out public.pem

那种就是在当前目录得到一个 public.pem 文件。里面存放的是PKCS#8
格式密钥。这种密钥格式是php可以使用的。密钥如下:

-----BEGIN PUBLIC KEY-----
MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAuVvw3DeWx4wdDl2/I0aA
Mma2bH3hhU89rqMhJWvQ41uRbatxZxMZ13iEMXg8UfTBR+UGl+NCzpkkTjjcVm/2
......
......
EXFyDtEykuiMuhn3A7WWNkc3voHML9C4kDWdJrX3wjQrwZbW3p3F1O/9pGHLNzn9
p3la2C9/Ve3jLdG8lEzvkCmtgTKWkqkhCnLwr7bRRzBUi3po7UDLWPePrH1ICd83
/wIDAQAB
-----END PUBLIC KEY-----

 

相关文章

发表评论

电子邮件地址不会被公开。 必填项已用*标注

网站地图xml地图