重装R后调用API无法加载PEM证书:OpenSSL、HTTR R、CURL报错求助
问题排查:重装R环境后HTTR SSL证书认证失败
原本正常运行数周的R脚本,在彻底卸载重装R、RTools、RStudio后,无法通过HTTR的GET请求携带SSL证书调用API。已多次卸载重装HTTR、curl、openssl包及R本体,问题仍未解决。
相关代码
GET请求代码
conn <- GET(url = "testurl", add_headers(header2), config(sslcert = "my_cert.pem", sslkey = "my_key.pem"), content_type_json(), accept_json())
SSL证书生成代码
cert <- openssl::read_p12(file = "Data/certificate.pfx", password = "somepassword") my_cert.pem <- write_pem(cert$cert) my_key.pem <- write_pem(cert$key)
环境版本信息
- R版本:4.2.2
- RStudio:2022.07.2 - 576
- rtools42-5355-5357
- openssl包版本:2.0.4
- curl包版本:4.3.3
- httr包版本:1.4.4
排查与修复步骤
修正证书文件生成逻辑
当前证书生成代码存在致命问题:write_pem()默认仅将证书/密钥内容输出到控制台,并未写入到my_cert.pem和my_key.pem文件中。之前脚本能运行,大概率是旧环境中已存在现成的证书文件,重装后文件丢失,或是你遗漏了写入文件的代码。
修正代码,将证书和密钥写入实际文件:cert <- openssl::read_p12(file = "Data/certificate.pfx", password = "somepassword") # 将证书写入文件 openssl::write_pem(cert$cert, "my_cert.pem") # 将密钥写入文件(Linux/macOS需手动设置文件权限为600,Windows可忽略) openssl::write_pem(cert$key, "my_key.pem")直接用curl包测试底层调用
跳过HTTR的封装,直接用curl包测试证书是否能正常认证,排除HTTR的问题:library(curl) # 创建请求句柄 h <- new_handle() # 设置证书和密钥 handle_setopt(h, sslcert = "my_cert.pem", sslkey = "my_key.pem") # 设置请求头 handle_setheaders(h, .list = header2) # 设置请求URL和方法 handle_setopt(h, url = "testurl", customrequest = "GET") # 发送请求 resp <- curl_fetch_memory(h) # 查看响应内容 cat(rawToChar(resp$content))检查系统环境与工具兼容性
- 确认RTools的
bin目录已添加到系统环境变量中,R能调用到正确版本的curl工具。 - 在R控制台运行
system("curl --version"),检查输出的curl版本是否与R包依赖的版本匹配。
- 确认RTools的
验证证书文件有效性
用openssl命令行工具(RTools自带或系统安装的)检查生成的PEM文件是否完整有效:# 检查证书内容 openssl x509 -in my_cert.pem -text -noout # 检查密钥完整性 openssl rsa -in my_key.pem -check
内容的提问来源于stack exchange,提问作者tpscp
相关产品推荐
相关产品推荐

