iphone开发 支付宝 报错 rsa_private read error : private key is NULL解决方法

原因

真机调试IOS支付宝功能GDB出现 rsa_private read error : private key is NULL提示

调试iOS 支付宝SDK的时候,运行demo,把
Partner(合作商户 ID)
Seller(账户 ID)
RSA public key(支付宝公钥)
RSA private key(商户私钥)

都放到plist文件了,运行的时候,报错 rsa_private read error : private key isNULL

我确定的是RSA private key肯定是有的,调试了下

    bio_private= BIO_new(BIO_s_file());
    BIO_read_filename(bio_private,private_key_file_path);
    rsa_private= PEM_read_bio_RSAPrivateKey(bio_private, NULL, NULL,"");    
    if(rsa_private != nil) {
这里,rsa_private 返回空, private_key_file_path 这些值都是有的

解决方法

将私钥转成PKCS8替换一下原私钥即可


1、生成私钥pem,  执行命令openssl genrsa -out rsa_private_key.pem 1024

2、生成公钥,执行命令openssl rsa -in rsa_private_key.pem -pubout -out rsa_public_key.pem

3RSA私钥转换成PKCS8格式,命令执行openssl pkcs8 -topk8 -inform PEM -in rsa_private_key.pem -outform PEM -nocrypt PHP服务端语言读取私钥不需要PKCS8转换。



### PEM_read_RSAPrivateKey 函数调用报错解决方案 当 `PEM_read_RSAPrivateKey` 调用出现问题时,通常是由于输入文件格式不匹配或密钥编码方式不符合预期所引起的。以下是几种常见原因及其对应的解决方法: #### 输入文件格式验证 确保使用的私钥文件是以 PKCS#1 或者 PKCS#8 编码的 PEM 文件,并且具有正确的头部和尾部标记。对于PKCS#1格式而言,应该看到如下形式的内容: ``` -----BEGIN RSA PRIVATE KEY----- ... -----END RSA PRIVATE KEY----- ``` 而对于PKCS#8,则应为: ``` -----BEGIN PRIVATE KEY----- ... -----END PRIVATE KEY----- ``` 如果发现实际文件中的标签不同(比如缺少 "RSA" 字样),那么可能是尝试使用了错误类型的解析器[^1]。 #### OpenSSL命令行工具生成兼容密钥 为了获得能够被顺利加载到程序里的私钥材料,在创建阶段就应当指定合适的参数来控制输出样式。例如通过OpenSSL可以这样操作以得到符合要求的形式: ```bash openssl genrsa -out private_key.pem 2048 # 创建新的未加密版本 openssl pkcs8 -topk8 -inform PEM -in private_key.pem -outform PEM -nocrypt -out private_key_pkcs8.pem # 将其转换成pkcs8格式而不加密码保护 ``` 上述指令会分别生产两种不同的私钥文档——前者遵循传统的PKCS#1标准;后者则是现代推荐采用的PKCS#8模式。 #### Java代码示例:处理PEM格式私钥并读取 在Java应用程序里边,可以通过BouncyCastle库或者其他支持此类功能的安全组件来进行相应的解码工作。下面给出了一段基于BC实现的例子,它可以从`.pem`文件中提取出所需的私钥对象以便后续应用逻辑调用。 ```java import org.bouncycastle.asn1.pkcs.PrivateKeyInfo; import org.bouncycastle.openssl.PEMParser; import org.bouncycastle.openssl.jcajce.JcaPEMKeyConverter; ... try (Reader reader = new FileReader("path/to/private/key")) { Object object = null; try (PEMParser pemParser = new PEMParser(reader)) { object = pemParser.readObject(); } JcaPEMKeyConverter converter = new JcaPEMKeyConverter().setProvider(new BouncyCastleProvider()); KeyPair kp; if(object instanceof PrivateKeyInfo){ kp=converter.getKeyPair((PrivateKeyInfo)object); }else{ throw new IllegalArgumentException("Invalid key format"); } } catch (IOException e) { System.out.println(e.getMessage()); } ``` 这段代码片段展示了如何利用第三方类库完成从磁盘上的PEM文本流直至内存内的JCE密钥实例之间的转变过程。注意这里假设传入的数据确实是有效的私钥描述符[^2]。 #### 常见问题排查清单 - **确认源文件路径无误** - **检查是否有权限访问目标位置下的资源** - **核实所提供的口令字符串是否为空白字符串或者是正确设置过的值**
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值