系统访问由http变为https,先申请了CA证书,然后win下浏览器访问时没问题的,但是linux下通过curl的方式访问就报错:
curl:(51) SSLcertificate subject name '*.xxxxxx.com does not match target host name '10.10.xxx.xxx'。
意思是SSL证书使用者名称与目标主机名不匹配。
百度良久,基本修改方式有两种,
方法一:设定为不验证证书和host ,是一段php的代码,如下写法:
$url = 'https://www.jb51.net';
$curl = curl_init();
curl_setopt($curl, CURLOPT_URL, $url);
curl_setopt($curl, CURLOPT_HEADER, 1);
curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE); // https请求 不验证证书
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, FALSE);// https请求 不验证hosts
$data = curl_exec($curl); curl_close($curl); var_dump($data);
方法二:设定一个正确的证书,如下写法:
$curl = curl_init();
curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
curl_setopt($curl, CURLOPT_TIMEOUT, 500); // 为保证第三方服务器与微信服务器之间数据传输的安全性,所有微信接口采用https方式调用,必须使用下面2行代码打开ssl安全校验。 // 如果在部署过程中代码在此处验证失败,请到 http://curl.haxx.se/ca/cacert.pem 下载新的证书判别文件。
curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, true);
curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, true);
curl_setopt($curl,CURLOPT_CAINFO,dirname(__FILE__).'/cacert.pem');//这是根据http://curl.haxx.se/ca/cacert.pem 下载的证书,添加这句话之后就运行正常了
curl_setopt($curl, CURLOPT_URL, $url);
$res = curl_exec($curl);
curl_close($curl);
return $res;
但是我们的这个是自己openssl自建CA签发的证书,因此还有另一种方式,将证书放在linux下,访问的时候加上此证书,验证就能通过了。
我们最初生生成的证书格式为pfx,若服务端要求客户端认证,需要将pfx证书转换成pem格式。
openssl pkcs12 -clcerts -nokeys -in cert.pfx -out client.pem #客户端个人证书的公钥
openssl pkcs12 -nocerts -nodes -in cert.pfx -out key.pem #客户端个人证书的私钥
也可以转换为公钥与私钥合二为一的文件
openssl pkcs12 -in cert.pfx -out all.pem -nodes #客户端公钥与私钥,一起存在all.pem中
转换完成之后,将pem格式的证书放在/etc/pki/tls/certs下。
访问时的方式为: curl -k --cert www.pem https://xxxxxxxxxxx
使用-k是不对服务器的证书进行检查,这样就不必关心服务器证书的导出问题了。