研究微信公众平台,用虚拟机安装了一个微赞,自定义菜单出现ssl错误,其他授权都不行,错误如下:
获取微信公众号授权失败, 请稍后重试!错误详情: SSL connect error
很是郁闷,看了一下源码,文件位置:./framework/function/communication.func.php
curl_setopt($ch, CURLOPT_SSLVERSION, CURL_SSLVERSION_TLSv1);
打印CURL_SSLVERSION_TLSv1
看到其值为int(1)
phpinfo()
查看ssl版本为NSS/3.21 Basic ECC
cURL版本(cURL Information)为7.19.7
CURL_SSLVERSION_TLSv1
是在7.34.0
版本中加入的(看下文详细介绍中的描述),所以出错就对了。。。
查看curl文档,的值应为:
CURL_SSLVERSION_DEFAULT (0) CURL_SSLVERSION_TLSv1 (1) CURL_SSLVERSION_SSLv2 (2) CURL_SSLVERSION_SSLv3 (3) CURL_SSLVERSION_TLSv1_0 (4) CURL_SSLVERSION_TLSv1_1 (5) CURL_SSLVERSION_TLSv1_2 (6)
中的其中一个。
还有个提示:你最好别设置这个值,让它使用默认值。设置为 2
或 3
比较危险,在 SSLv2
和 SSLv3
中有弱点存在。
所以根据提示,现在设置的值为也就是CURL_SSLVERSION_TLSv1
的值为1
,出现了SSL connect error
,如果设置为2
和3
,文档提示比较危险,那就改为4
吧,代码为:
curl_setopt($ch, CURLOPT_SSLVERSION, 4);
改完之后要更新一下缓存,再打开自定义菜单设置项,发现问题已解决。
测试CURLOPT_SSLVERSION
的值设置为4
或5
都可以,6
会出错,其实这段代码删了也一样。。。
OK,再来看看为什么VPS不会出错
VPS查看ssl版本为:OpenSSL/1.0.2j
,CURL_SSLVERSION_TLSv1
的值为:int(1)
,cURL版本(cURL Information)为7.51.0
。
大致因为版本高吧,所以不会出错
搞不定了留言看看:)
另:虚拟机的SSL版本为NSS和VPS的SSL版本为openssl的区别,NSS 比 OpenSSL 大,并且需要其他外部库来对库进行编译,支持SSL v2和v3,TLS,PKCS # 5,PKCS # 7,PKCS # 11,PKCS # 12,S / MIME,X.509 v3证书,和其他安全标准。参考链接:https://developer.mozilla.org/zh-CN/docs/NSS
名称
CURLOPT_SSLVERSION - 设置首选TLS / SSL版本
概要
#include <curl / curl.h>
CURLcode curl_easy_setopt(CURL * handle,CURLOPT_SSLVERSION,long version);
描述
通过长参数来控制要使用哪个版本的SSL / TLS。
为此目的使用一个可用的定义。可用的选项有:
默认动作。这将试图找出远程SSL协议版本。
TLSv1.x
SSLv2
SSLv3
TLSv1.0(在7.34.0中添加)
TLSv1.1(在7.34.0中添加)
TLSv1.2(在7.34.0中添加)
TLSv1.3(在7.52.0中添加)
该标志将支持的最大TLS版本定义为TLSv1.2或SSL库中的默认值。只有NSS库目前允许一个获得最大支持的TLS版本。(在7.54.0中添加)
该标志将支持的最大TLS版本定义为TLSv1.0。(在7.54.0中添加)
该标志将支持的最大TLS版本定义为TLSv1.1。(在7.54.0中添加)
该标志将支持的最大TLS版本定义为TLSv1.2。(在7.54.0中添加)
该标志将支持的最大TLS版本定义为TLSv1.3。(在7.54.0中添加)
默认
CURL_SSLVERSION_DEFAULT
PROTOCOLS
所有基于TLS的协议:HTTPS,FTPS,IMAPS,POP3S,SMTPS等
例
CURL * curl = curl_easy_init();if(curl){ curl_easy_setopt(curl,CURLOPT_URL,“https://example.com”); / *请求libcurl使用TLS版本1.1或更高版本* / curl_easy_setopt(curl,CURLOPT_SSLVERSION,CURL_SSLVERSION_TLSv1_1 | CURL_SSLVERSION_MAX_DEFAULT); / *执行请求* / curl_easy_perform(卷曲);}
可用性
自7.18.1起,SSLv2默认禁用。其他SSL版本的可用性可能会因为使用哪个后端libcurl而有所不同。
返回值
返回CURLE_OK如果选项是支持的,并且不是CURLE_UNKNOWN_OPTION。