linux php openssl anaconda linux
Linux中使用curl命令访问https站点4种常见错误和解决方法
每一种客户端在处理https的连接时都会使用不同的证书库。IE浏览器和FireFox浏览器都可以在本浏览器的控制面板中找到证书管理器。在证书管理器中可以自由添加、删除根证书。
而Linux的curl使用的证书库在文件“/etc/pki/tls/certs/ca-bundle.crt”中。(CentOS)
以下是curl在访问https站点时常见的报错信息
1.Peer’s Certificate issuer is not recognized
复制代码代码如下:
[root@ip-172-31-32-208 Nginx]# curl
curl:(60) Peer's Certificate issuer is not recognized.
more details here:
此种情况多发生在自签名的证书,报错含义是签发证书机构未经认证,无法识别。
解决办法是将签发该证书的私有CA公钥cacert.pem文件内容,追加到/etc/pki/tls/certs/ca-bundle.crt。
我们在访问12306.cn订票网站时也报了类似的错误。
复制代码代码如下:
[root@ip-172-31-32-208~]# curl
curl:(60) Peer's certificate issuer has been marked as not trusted by the user.
More details here:
2.SSL routines:SSL3_GET_SERVER_CERTIFICATE:certificate verify failed
复制代码代码如下:
[root@GO-EMAIL-1 aa]# curl
curl:(60) SSL certificate problem, verify that the CA cert is OK. Details:
error:14090086:SSL routines:SSL3_GET_SERVER_CERTIFICATE:certificate verify failed
More details here:
此问题多是由于本地CA证书库过旧,导致新签发证书无法识别。
经排查,github.com证书是由GTE CyberTrust Root签发,现行证书时间是:
1.不早于(1998/8/13 0:29:00 GMT)
2.不晚于(2018/8/13 23:59:00 GMT)
而在我们的Redhat5.3系统中ca-bundle.crt文件发现,GTE CyberTrust Root的时间已经过期。
复制代码代码如下:
Issuer: C=US, O=GTE Corporation, CN=GTE CyberTrust Root
Validity
Not Before: Feb 23 23:01:00 1996 GMT
Not After: Feb 23 23:59:00 2006 GMT
解决办法是更新本地CA证书库。
方法一:
下载替换/etc/pki/tls/certs/ca-bundle.crt
方法二:
使用update-ca-trust更新CA证书库。(CentOS6,属于ca-certificates包)
3.unknown message digest algorithm
复制代码代码如下:
[root@WEB_YF_2.7~]#curl
curl:(35) error:0D0C50A1:asn1 encoding routines:ASN1_item_verify:unknown message digest algorithm
此问题多由证书本地openssl不能识别SSL证书签名算法所致。www.alipay.com使用了SHA-256 RSA加密算法。而openssl在OpenSSL 0.9.8o才加入此算法。
解决办法是升级本地openssl。
在我的操作系统RedHat5.3中,yum升级openssl到openssl-0.9.8e-22.el5就可以识别SHA-256算法。原因是Redhat每次都是给0.9.8e打补丁,而不是直接更换版本。在srpm包中我找到了这个补丁。
复制代码代码如下:
Summary: The OpenSSL toolkit
Name: openssl
Version: 0.9.8e
...
Patch89: openssl-fips-0.9.8e-ssl-sha256.patch
4.JAVA和PHP的问题
java和php都可以编程来访问https网站。例如httpclient等。
其调用的CA根证书库并不和操作系统一致。
JAVA的CA根证书库是在 JRE的$JAVA_HOME/jre/lib/security/cacerts,该文件会随着JRE版本的升级而升级。可以使用keytool工具进行管理。
PHP这边我没有进行测试,从php安装curl组件的过程来看,极有可能就是直接采用的操作系统curl一直的数据。
当然PHP也提供了 curl.cainfo参数(php.ini)来指定CA根证书库的位置。
php怎么开启openssl模块
php开启openssl的方法,大多数情况下openssl是没有开启的,要想启用需要进行下简单的设置
windows下开启方法:
1:首先检查php.ini中;extension=php_openssl.dll是否存在,如果存在的话去掉前面的注释符‘;',如果不存在这行,那么添加extension=php_openssl.dll。
2:讲php文件夹下的: php_openssl.dll, ssleay32.dll, libeay32.dll 3个文件拷贝到 WINDOWS\system32\文件夹下。
3:重启apache或者iis(iisreset/restart)
至此,openssl功能就开启了。
Linux下开启方法:
我使用的是锦尚数据的云主机,PHP版本:5.2.14
下面方案就以我的主机为例讲解为PHP添加openssl模块支持。
网上一些答案说要重新编译PHP,添加configure参数,增加openssl的支持。这里讲一个不需要重新编译的方法。
如果服务器上存在PHP安装包文件最好,如果已经删除,去下载和phpinfo页面显示版本一样的PHP安装文件,我这里是 php-5.2.14.tar.gz
推荐去搜狐镜像下载,网易镜像没有找到。地址为:
用ssh工具连接到主机。
#下载到/var/www/php5目录下
cd/var/www/php5
wget
#解压
tarzxvfphp-5.2.14.tar.gz
#进入PHP的openssl扩展模块目录
cdphp-5.2.14/ext/openssl/
/var/www/php5/bin/phpize#这里为你自己的phpize路径,如果找不到,使用whereisphpize查找
#执行后,发现错误无法找到config.m4,config0.m4就是config.m4。直接重命名
mvconfig0.m4config.m4
/var/www/php5/bin/phpize
./configure--with-openssl--with-php-config=/var/www/php5/bin/php-config
make
makeinstall
#安装完成后,会返回一个.so文件(openssl.so)的目录。在此目录下把openssl.so文件拷贝到你在php.ini中指定的extension_dir下(在php.ini文件中查找:extension_dir=),我这里的目录是var/www/php5/lib/php/extensions
#编辑php.ini文件,在文件最后添加
extension=openssl.so
#重启Apache即可
/usr/local/apache2/bin/apachectlrestart
Linux系统上用源码安装OpenSSL的方法
先下载openssl 1.0.1g版本,命令如下:
复制代码代码如下:#wget-c
再下载这个版本的md5校验包:
复制代码代码如下:#wget-c
然后校验下的openssl包是否被恶意修改过:
复制代码代码如下:#md5sum openssl-1.0.1g.tar.gz| awk'{print$1;}'| cmp- openssl-1.0.1g.tar.gz.md5
如果校验没问题,再接着解压包,命令:
复制代码代码如下:#tar-zvxf openssl-1.0.1g.tar.gz//解压openssl-1.0.1g.tar.gz
进入这个解压缩的目录:
复制代码代码如下:#cd openssl-1.0.1g
输入下面的命令进行编译,安装,我直接设置了一些重要的参数,因为其他的参数对于我来说就根本没用。如果需要参数,自己添加就是。输入:
复制代码代码如下:#./config shared zlib&& make&& make install
或者你什么参数都不加,完全用默认的:
复制代码代码如下:#./config&& make&& make install
话大概五六分中编译安装完。没出问题的话,继续输入下面的命令,手动软链新的openssl二进制文件:
复制代码代码如下:ln–s/usr/local/ssl/bin/openssl/usr/bin/openssl
ln–s/usr/local/ssl/include/openssl/usr/include/openssl
配置库文件搜索路径:
复制代码代码如下:#echo"/usr/local/ssl/lib">>/etc/ld.so.conf
#ldconfig-v
最后重启下服务器(重启进程麻烦的),输入:
复制代码代码如下:#reboot
重启后,输入下面的命令检测下openssl的版本:
复制代码代码如下:#openssl version
显示:
复制代码代码如下:OpenSSL 1.0.1g 7 Apr 2014
还有php编译时,是否制定了openssl目录。我们直接查看php探针,就是保存到a.php,然后放到你网站的根目录。在打开这个a.php文件。看显示openssl那几栏,如下:
复制代码代码如下:openssl
OpenSSL support enabled
OpenSSL Library Version OpenSSL 1.0.1g 7 Apr 2014
OpenSSL Header Version OpenSSL 1.0.1g 7 Apr 2014
如果不是1.0.1g版本,那就重新编译下php。指定openssl的目录。
可以使用下面的命令,查看php版本和编译参数:
复制代码代码如下:#php-v#查看php版本复制代码代码如下:#/usr/local/php/bin/php-i| grep configure#查看php编译所用的参数
用这个命令显示的编译结果都有单引号包住了,要删掉。同时将其中的--with-openssl改为:
复制代码代码如下:--with-openssl=/usr/local/ssl/
然后重新编译即可,只是编译参数变了,但不改变php的版本。
因为我用的军哥lnmp,懒得自己去下载了。直接用他的php升级脚本upgrade_php.sh来重新编译安装php。但是这个升级脚本不准升级到同版本。使用的时候会显示:
复制代码代码如下:#echo"Error: The upgrade PHP Version is the same as the old Version!!"
只要将
复制代码代码如下:if ["$php_version"=="$old_php_version" ]; then
echo"Error: The upgrade PHP Version is the same as the old Version!!"
exit 1
fi
cho"=================================================="
echo"You want to upgrade php version to$php_version"
echo"=================================================="
这几行用#注释掉就可以了。然后进入lnmp加压的目录,执行:
复制代码代码如下:#sh upgrade_php.sh
选择你要的php版本,就可以升级了。