error:0906D064:PEM routines:PEM_read_bio:bad …
2018-09-05 07:57:19来源:博客园 阅读 ()
今天在使用easywechat对接企业打款到银行卡时,遇到了两个错误
error:0906D064:PEM routines:PEM_read_bio:bad base64 decode 和 error:0906D06C:PEM routines:PEM_read_bio:no start line 。
这是因为想要正确的使用密钥,需要满足以下三个条件。
- 公共密钥的开头需要加上"-----BEGIN RSA PUBLIC KEY-----\n",结尾需要加上"\n-----BEGIN RSA PUBLIC KEY-----\n"。不然会报 error:0906D06C:PEM routines:PEM_read_bio:no start line 。
- 公钥字符串每隔64隔字符需要加一个换行,负责会报 error:0906D06C:PEM routines:PEM_read_bio:no start line 。
- 以上2步应该可以满足有些语言的需求,但php不行,还需要讲以上PKCS#1 格式密钥转换成PKCS#8 格式密钥。
下面看下具体操作。按照文档使用如下命令:
./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
将会在当前目录生成一个 ./public-14339221228.pem
文件。
如果直接使用这个public key文件,会报一个非法的key错误,然后可以发现easywechat有这样一段源码。
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); }
报非法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-----
标签:
版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有
上一篇:ThinkPHP使用纯真IP获取物理地址时中文乱码问题
下一篇:Redis面试总结
- PHP中set error handler函数用法小结 2019-12-25
- php5.6 上传图片error代码为6 或者 报错“PHP Warning: File 2019-07-23
- PHP捕获异常register_shutdown_function和error_get_last的 2019-07-23
- php萌新|学习|排坑|のmysqli_error()方法的妙用 2019-04-30
- [PHP]日志处理error_log()函数和配置使用 2019-04-26
IDC资讯: 主机资讯 注册资讯 托管资讯 vps资讯 网站建设
网站运营: 建站经验 策划盈利 搜索优化 网站推广 免费资源
网络编程: Asp.Net编程 Asp编程 Php编程 Xml编程 Access Mssql Mysql 其它
服务器技术: Web服务器 Ftp服务器 Mail服务器 Dns服务器 安全防护
软件技巧: 其它软件 Word Excel Powerpoint Ghost Vista QQ空间 QQ FlashGet 迅雷
网页制作: FrontPages Dreamweaver Javascript css photoshop fireworks Flash