CURL使用SSL证书访问HTTPS

解决CURL访问HTTPS时SSL证书验证失败的完整指南 HTTPS作为保障网络通信安全的核心协议,其安全性建立在SSL/TLS证书的信任链验证机制之上。证书颁发机构(CA)作为受信的第三方,通过签发数字证书来验证服务器身份,构成了整个信任体系的基石。这一机制确保了数据传输的机密性、完整性和身份认证,是API调用、数据拉取、服务间通信等现代互联网应用不可或缺的技术保障。在实际工程实践中,开发者常会遇到CURL访问HTTPS时因CA证书问题导致的连接失败,例如在访问使用自签名证书或私有CA签发的内网服务时,系统因缺少对应的根证书而无法完成信任链验证。理解并掌握如何诊 阅读详情

在支付的交互过程中,安全绝对是需要考虑的重要因素之一。体现在对服务器交互数据的签名等环节,但有的时候为了能达到更高的安全级别,还需要用ssl证书,即web服务器有证书,浏览器客户端/请求端也需要安装证书来达到双向验证。

比如请求下面的财付通支付网关,用户向商户账户支付金额,仅仅是需要检查签名就行了

https://gw.tenpay.com/gateway/pay.htm

但是在退款这一步要请求财付通退款接口时,不仅要验证签名,还要双向验证SSL证书,一旦让自己出钱的时候就变得抠门谨慎了

https://mch.tenpay.com/refundapi/gateway/refund.xml

这个接口就需要安装在开通服务之后第三方给我们发送的安全证书了。

作为文件形式存在的证书一般有这几种格式:

1.带有私钥的证书

由Public Key Cryptography Standards #12,PKCS#12标准定义,包含了公钥和私钥的二进制格式的证书形式,以pfx作为证书文件后缀名。

2.二进制编码的证书

证书中没有私钥,DER 编码二进制格式的证书文件,以cer作为证书文件后缀名。

3.Base64编码的证书

证书中没有私钥,BASE64 编码格式的证书文件,也是以cer作为证书文件后缀名。

由定义可以看出,只有pfx格式的数字证书是包含有私钥的,cer格式的数字证书里面只有公钥没有私钥。

在pfx证书的导入过程中有一项是“标志此密钥是可导出的。这将您在稍候备份或传输密钥”。一般是不选中的,如果选中,别人就有机会备份你的密钥了。如果是不选中,其实密钥也导入了,只是不能再次被导出。这就保证了密钥的安全。

如果导入过程中没有选中这一项,做证书备份时“导出私钥”这一项是灰色的,不能选。只能导出cer格式的公钥。如果导入时选中该项,则在导出时“导出私钥”这一项就是可选的。

上图,如果要导出私钥(pfx),是需要输入密码的,这个密码就是对私钥再次加密,这样就保证了私钥的安全,别人即使拿到了你的证书备份(pfx),不知道加密私钥的密码,也是无法导入证书的。相反,如果只是导入导出cer格式的证书,是不会提示你输入密码的。因为公钥一般来说是对外公开的,不用加密
由于php的curl只支持pem格式、der、eng格式,而之前生成的是p12的格式,所以需要转换一下

PKCS#12 到 PEM 的转换

     
1
     
openssl pkcs12 -nocerts -nodes - in cert.p12 - out private.pem

验证

     
1
     
openssl pkcs12 -clcerts -nokeys - in cert.p12 - out cert.pem

curl请求部分代码

     
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
     
/**
* 使用证书访问退款接口
*
*/
private static function _postCert($url)
{
$ch = curl_init( $url);
curl_setopt( $ch, CURLOPT_HEADER, 0);
curl_setopt( $ch, CURLOPT_CUSTOMREQUEST, "GET");
curl_setopt( $ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt( $ch, CURLOPT_SSL_VERIFYHOST, '2');
curl_setopt( $ch, CURLOPT_SSL_VERIFYPEER, '1');
curl_setopt( $ch, CURLOPT_SSLCERT, WECHAT_CERT);
curl_setopt( $ch, CURLOPT_SSLCERTTYPE, 'PEM');
curl_setopt( $ch, CURLOPT_USERAGENT, $_SERVER[ 'HTTP_USER_AGENT']);
$response = curl_exec( $ch);
return $response;
}

参数释义:

     
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
     
CURLOPT_TIMEOUT:超时时间
CURLOPT_RETURNTRANSFER:是否要求返回数据
CURLOPT_SSL_VERIFYPEER:是否检测服务器的证书是否由正规浏览器认证过的授权 CA颁发的
CURLOPT_SSL_VERIFYHOST:是否检测服务器的域名与证书上的是否一致
CURLOPT_SSLCERTTYPE:证书类型, "PEM" (default), "DER", and "ENG".
CURLOPT_SSLCERT:证书存放路径
CURLOPT_SSLCERTPASSWD:证书密码
CURLOPT_SSLKEYTYPE:私钥类型, "PEM" (default), "DER", and "ENG".
CURLOPT_SSLKEY:私钥存放路径

继续返回false 让输出错误显示:

Peer certificate cannot be authenticated with known CA certificates

说

对方的证书不能用已知的CA证书验证

其实和使用curl访问一个意思

     
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
     
➜ Certificate curl -v https://mch.tenpay.com
* Rebuilt URL to: https://mch.tenpay.com/
* Hostname was NOT found in DNS cache
* Trying 183.62 .126 .37...
* Connected to mch.tenpay.com ( 183.62 .126 .37) port 443 (# 0)
* successfully set certificate verify locations:
* CAfile: none
CApath: /etc/ssl/certs
* SSLv3, TLS handshake, Client hello ( 1):
* SSLv3, TLS handshake, Server hello ( 2):
* SSLv3, TLS handshake, CERT ( 11):
* SSLv3, TLS alert, Server hello ( 2):
* SSL certificate problem: self signed certificate in certificate chain
* Closing connection 0
curl: ( 60) SSL certificate problem: self signed certificate in certificate chain
More details here: http://curl.haxx.se/docs/sslcerts.html
curl performs SSL certificate verification by default, using a "bundle"
of Certificate Authority (CA) public keys (CA certs). If the default
bundle file isn 't adequate, you can specify an alternate file
using the --cacert option.
If this HTTPS server uses a certificate signed by a CA represented in
the bundle, the certificate verification probably failed due to a
problem with the certificate (it might be expired, or the name might
not match the domain name in the URL).
If you 'd like to turn off curl 's verification of the certificate, use
the -k ( or --insecure) option.

最后的一个解决方案

     
1
     
curl_setopt( $ch, CURLOPT_SSL_VERIFYPEER, false);

返回

     
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
     
<?xml version="1.0" encoding="UTF-8"?>
<root>
<input_charset>UTF-8 </input_charset>
<out_refund_no />
<out_trade_no />
<partner>1226251301 </partner>
<reccv_user_name />
<recv_user_id />
<refund_channel />
<refund_fee />
<refund_id />
<refund_status>-1 </refund_status>
<retcode>88222013 </retcode>
<retmsg>[20921191]退款总金额超出交易金额[20150313174732-183] </retmsg>
<sign>010651C7B3906F2863B3B1D2FB63A571 </sign>
<sign_key_index>1 </sign_key_index>
<sign_type>MD5 </sign_type>
<transaction_id />
</root>
CURL访问HTTPS报错SSL证书问题:从原理到实战的完整解决方案 HTTPS作为HTTP的安全扩展,其核心机制依赖于SSL/TLS协议建立的加密通道与身份认证体系。该协议通过非对称加密实现密钥交换,并借助数字证书验证服务器身份,其中证书颁发机构(CA)构成的信任链是安全通信的基石。在工程实践中,CURL作为广泛使用的网络传输工具,其证书验证行为直接依赖于本地CA证书包的配置。当遇到`unable to get local issuer certificate`等典型错误时,往往意味着信任链的断裂,这会影响从Docker镜像拉取到API调用的各类自动化流程。通过系统性地诊断 阅读详情

相关推荐

别再浪费HDRI了!D5渲染器环境光设置避坑指南(附天空球调试参数)

本文深入解析D5渲染器中HDRI环境光的高阶调试技巧,揭示90%渲染师常犯的错误认知。通过参数联动黄金法则、特殊材质应对方案及动态场景优化策略,帮助用户精准控制光子能量分布,实现建筑玻璃反射云层过渡等专业级效果。附赠天空球调试参数和商业项目验证案例,助您彻底释放HDRI潜力。

weixin_29216049的博客 495

curl命令忽略不受信任的https安全限制

【代码】curl命令忽略不受信任的https安全限制。

IChen.的博客 4592

避开这些坑!baostock获取股票数据时最容易犯的5个错误(Python实战)

本文针对使用Python和baostock库获取股票历史数据时常见的五大陷阱,提供了实战解决方案。重点剖析了登录状态验证、参数配置、数据解析、批量操作效率及数据一致性校验等关键环节,帮助开发者构建稳健高效的数据获取流程,避免因细节疏忽导致的数据错误或性能瓶颈。

websocket5live的博客 1440

curl 访问k8s https 证书和token 几种方式

[root@localhost ~]# curl https://172.16.10.87:6443/api/v1/namespaces curl: (60) Peer's Certificate issuer is not recognized. More details here: http://curl.haxx.se/docs/sslcerts.html curl performs SSL certificate verification by default, using a "bund...

码农崛起 1万+

【系统分析师】2025年下半年真题:论文及解题思路

摘要 本文探讨软件测试技术的应用,重点关注静态测试与动态测试的比较。静态测试在不运行程序的情况下,通过审查、走查等方式分析需求、设计文档和代码,能早期发现高层次缺陷,降低修复成本。动态测试通过实际运行程序,使用单元测试、集成测试等方法验证功能性能,是发现运行时错误的唯一途径。二者在缺陷类型、介入阶段和修复成本上具有互补性,建议项目实践中结合使用以提升软件质量。

数据知道的博客 5787

AI视频生成模型训练:从数据准备到部署全流程

咱们这次的目的就像是要建造一座超级厉害的AI视频生成魔法城堡。范围呢,就是从收集建造城堡的材料(数据准备)开始,到把城堡搭建起来(模型训练),再到让城堡能供大家使用(模型部署),涵盖了整个过程的方方面面。接下来我们会先给大家介绍一些重要的术语,就像认识冒险途中的关键道具一样。然后引入一个有趣的故事,带大家进入AI视频生成的奇妙世界,解释核心概念以及它们之间的关系。接着会详细讲解核心算法原理、数学模型和公式,还会有项目实战,带大家亲自体验代码的魅力。

小白菜的博客 399

linux下访问https站点问题:证书无效

curl: (60) Peer certificate cannot be authenticated with known CA certificates More details here: http://curl.haxx.se/docs/sslcerts.html linux 证书安装,https站点问题,证书无效

qq_29260989的博客 4105

Android 13.0 开机启动优化之PMS扫描apk耗时相关功能优化

在android13.0的系统rom定制化开发中,在系统中开发产品时,会根据客户要求内置第三方app,这时如果内置app过多,或者安装的app过多,在系统开机的过程中 在pms扫描安装app的时候,就会比较耗时,这时候就需要优化下pms扫描安装app这块的功能代码,用多线程来实现pms扫描安装app,来加快开机时间,接下来 来实现这个功能

安卓兼职framework和app工程师的博客 1333

curl: (60) SSL certificate problem

curl: (60) SSL certificate problem

程永强 1万+

某验SVG图标验证码识别思路(非训练)

本文提出了一种无需训练的某验SVG图标验证码识别方法。通过分析SVG文件结构,使用正则表达式提取静态图标数据,并借助CairoSVG库转换为PNG格式。随后采用坐标定位方式裁剪出12个固定位置的图标,最后利用ResNet50提取特征,通过余弦相似度匹配目标图标。该方法避免了训练目标检测模型,实现了高效准确的验证码识别。关键步骤包括SVG文件预处理、图标定位裁剪和基于预训练模型的相似度比对。

九月镇灵将的博客 418

MFC中的CMFCToolBar:自定义按钮提示消息

通过以上步骤,您可以在MFC应用程序中使用CMFCToolBar创建自定义按钮,并设置按钮的提示消息。通过以上步骤,您可以在MFC应用程序中使用CMFCToolBar创建自定义按钮,并设置按钮的提示消息。通过上述代码,您可以在MFC应用程序中添加一个名为"ID_BUTTON_CUSTOM"的自定义按钮,并将其提示消息设置为"自定义提示消息"。通过上述代码,您可以在MFC应用程序中添加一个名为"ID_BUTTON_CUSTOM"的自定义按钮,并将其提示消息设置为"自定义提示消息"。

PixelInk的博客 1084

自己制作ssl证书:自己签发免费ssl证书,为nginx生成自签名ssl证书 curl证书访问https

自己制作ssl证书:自己签发免费ssl证书,为nginx生成自签名ssl证书 这里说下Linux 系统怎么通过openssl命令生成 证书。 首先执行如下命令生成一个key openssl genrsa -des3 -out ssl.key 1024 然后他会要求你输入这个key文件的密码。不推荐输入。因为以后要给nginx使用。每次reload nginx配置时候都要你验证这个PAM密码的。 由...

tanyyinyu的博客 1650

摇骰子、抽奖转盘酒桌游戏 人生重启模拟器小程序源码分享-开通流量主躺着赚钱

摇骰子、抽奖转盘酒桌游戏 人生重启模拟器小程序源码分享-开通流量主躺着赚钱

向宇的博客,专注php/web全栈 unity游戏开发,欢迎大家评论纠错 1650

curl 无证书访问https_CURL使用SSL证书访问HTTPS

若服务端要求客户端认证,需要将pfx证书转换成pem格式openssl pkcs12 -clcerts -nokeys -in cert.pfx -out client.pem #客户端个人证书的公钥openssl pkcs12 -nocerts -nodes -in cert.pfx -out key.pem#客户端个人证书的私钥也可以转换为公钥与私钥合二为一的文件opensslpkc...

weixin_39724266的博客 477

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

PHP配置默认SSL CA证书,curl访问https地址错误cURL error 60

问题描述 项目中使用GuzzleHttp请求 https 时会报错: GuzzleHttp\Exception\RequestException : cURL error 60: SSL certificate problem: certificate has expired (see http://curl.haxx.se/libcurl/c/libcurl-errors.html)’ 下载新的CA证书 官网地址:https://curl.se/docs/caextract.html 下载地址:h

Climber813 1718

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

[PHP] curl访问https与CA证书问题

CA证书,用来在调用HTTPS资源的时候,验证对方网站是否是CA颁布的证书,而不是自己随便生成的 curl命令1.需要下载CA证书 文件地址是 http://curl.haxx.se/ca/cacert.pem2.把下载的文件放到这个位置 /etc/pki/tls/certs/ca-bundle.crt3.curl就可以访问https的资源了 php代码 function post($u...

weixin_34124651的博客 2526

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

curl访问使用私有证书https的网址报 (35) SSL connect error

举例用curl访问 12306会报错 [quote]curl: (60) Peer certificate cannot be authenticated with known CA certificates[/quote] 通过命令 :curl -v https://kyfw.12306.cn 验证证书库是否有效 正常的互联网证书可能会出现证书无效:Peer certificate...

firseve的专栏 4152

使用curl访问报错:cURL error 60: SSL certificate problem: unable to get local issuer certificate

报错: 解决方式: $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, $url); curl_setopt($ch, CURLOPT_POST, 1); curl_setopt($ch, CURLOPT_HEADER, 0); curl_setopt($ch...

robin_sky的博客 6105

curl 无证书访问https_SSL安全证书常见问题_Linux中使用curl命令访问https站点错误和解决方法 - 帮助文档 - 亿速云...

1、Peer’s Certificate issuer is not recognized代码如下:[root@jiankong ~]# curl -v https://wx.87th.cn- -CAfile: /etc/pki/tls/certs/ca-bundle.crtCApath: nonePeer's certificate issuer is not recognized: 'CN...

weixin_39854951的博客 1379
上一篇: Java 中使用内存映射文件需要考虑的 10 个问题
下一篇: Maven部署构件到Nexus时出现的Failed to transfer file错误
kobejayandy
博客等级 码龄18年 2853粉丝 43原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值