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版本,就可以升级了。

阅读剩余
THE END