curl模拟https登录,一直无法成功,返回登录页面

阿采 发布于 2016/05/25 11:07
阅读 426
收藏 1
 

用类似以下代码,此代码命名为test.php,然后打开这个页面,一直返回的是要curl过去的按个login.php,

我的理解应该时要返回登录成功之后的index.php页面,有没有大拿遇到过类似情况?感觉像是模拟登录一直无法成功所以一直调回登录页面一样。

<?php

function vpost($url,$data){ // 模拟提交数据函数
    $curl = curl_init(); // 启动一个CURL会话
    curl_setopt($curl, CURLOPT_URL, $url); // 要访问的地址
    curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, 0); // 对认证证书来源的检查
    curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, 1); // 从证书中检查SSL加密算法是否存在
    curl_setopt($curl, CURLOPT_USERAGENT, $_SERVER['HTTP_USER_AGENT']); // 模拟用户使用的浏览器
    curl_setopt($curl, CURLOPT_FOLLOWLOCATION, 1); // 使用自动跳转
    curl_setopt($curl, CURLOPT_AUTOREFERER, 1); // 自动设置Referer
    curl_setopt($curl, CURLOPT_POST, 1); // 发送一个常规的Post请求
    curl_setopt($curl, CURLOPT_POSTFIELDS, $data); // Post提交的数据包
    curl_setopt($curl, CURLOPT_TIMEOUT, 30); // 设置超时限制防止死循环
    curl_setopt($curl, CURLOPT_HEADER, 0); // 显示返回的Header区域内容
    curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1); // 获取的信息以文件流的形式返回
	curl_setopt($curl, CURLOPT_FOLLOWLOCATION, true);
	//curl_setopt($curl, CURLOPT_USERPWD, 'caipingt:Lion2016@'); 

    
	curl_setopt($curl, CURLOPT_HTTPHEADER, array("Content-Length: 61\n
	 Host: quality-mts.web.alcatel-lucent.com\n
	 Connection: keep-alive\n
	 Content-Type: application/x-www-form-urlencoded\n
	 Cache-Control: max-age=0\n
	 Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8\n
	 Origin: https://xxxxxx.xxxx.login.php\n
	 Upgrade-Insecure-Requests: 1\n
	 User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/48.0.2564.97 Safari/537.36\n
	 Content-Type: application/x-www-form-urlencoded\n
	 Referer: https://xxxxxx.xxxx.login.php\n
	 Accept-Encoding: gzip, deflate\n
	 Accept-Language: en-US,en;q=0.8\n
	 ")); 
	 
    $tmpInfo = curl_exec($curl); // 执行操作
	
var_dump("this is error---".curl_error($curl)."----------"); //此处错误一直是空
	
    if (curl_errno($curl)) {
       echo 'Errno'.curl_error($curl);//捕抓异常
    }
    curl_close($curl); // 关闭CURL会话
    return $tmpInfo; // 返回数据
}

$url = " https://xxxxxx.xxxx.login.php";
$username = urlencode('myname');
$passwd = urlencode('mypasswd@');

$data ="url_query=&username=$username&password=$username&login=Login";

$result = vpost($url,$data);
var_dump($result);
echo "aaaaa";
?>



加载中
0
qycms_cn
qycms_cn
需要php打开 openssl, 并配置cert  key
阿采
阿采
curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, 0); 这一行不是表示跳过证书认证么? 我如果把这个设置成true,把CURLOPT_SSLCERT和CURLOPT_SSLCERTPASSWD都设置上,会提示我Peer certificate cannot be authenticated with known CA certificates
0
qycms_cn
qycms_cn
我未试过可以跳过openssl,也没有做过不配openssl能访问https。
阿采
阿采
从php服务上看是有OPENSSL的,openssl OpenSSL support enabled OpenSSL Library Version OpenSSL 1.0.0-fips 29 Mar 2010 OpenSSL Header Version OpenSSL 1.0.0-fips 29 Mar 2010
0
東條・スペンサー・咲
東條・スペンサー・咲

建议检查一下是否能找到OpenSSL。虽然没做过PHP,不过最近刚刚解决了一个一直返回网络无法连接的错误。原因是程序找不到OpenSSL所以SSL相关函数都没用。

東條・スペンサー・咲
東條・スペンサー・咲
回复 @阿采 : 上面说的对,证书如果没有配置的话是没有意义的。根据返回的错误来看应该是证书链上哪个证书没被信任或者没有导入证书。检查一下这个吧。
qycms_cn
qycms_cn
回复 @阿采 : 还需要openssl 的证书cert配置。
東條・スペンサー・咲
東條・スペンサー・咲
回复 @阿采 : 它提示无法被已知证书验证,看一下证书链是否是齐的?
東條・スペンサー・咲
東條・スペンサー・咲
回复 @阿采 : 最后我是把OpenSSL的库直接复制到目录下了。(Windows下)或者配置环境变量都可以。如果都没有问题就应该不是OpenSSL的事儿了。
阿采
阿采
已经配置了OPENSSL,还需要做其他事情来配置程序能否找到openssl么?
0
阿采
阿采

不知道为啥问题无法编辑了,补充一下:@东条咲 @杨金焕

我如果使用

$testsh = curl_init("https://testweb.com/");
curl_setopt($testsh, CURLOPT_HEADER, 0);
curl_setopt($testsh, CURLOPT_RETURNTRANSFER, 1); 
curl_setopt($testsh, CURLOPT_SSL_VERIFYPEER, false);
$mydata = curl_exec($testsh);
这样是能正常返回首页数据的。

但是同样的代码,url换成login.php,

再加上

curl_setopt($login, CURLOPT_POST, 1); 
curl_setopt($login, CURLOPT_POSTFIELDS, $post); 

类似这样的,会一直返回login那个页面,看上去是login失败。

然后我加上改成下面三行:

curl_setopt($testsh, CURLOPT_SSL_VERIFYPEER, true);
curl_setopt($login, CURLOPT_SSL_VERIFYHOST, 2); 
curl_setopt($login, CURLOPT_CAINFO, getcwd() . "/CAcerts/myCA.crt"); 

就会一直提示ErrnoProblem with the SSL CA cert (path? access rights?)

尝试了重新安装openssl,重启apache,重启server机器等操作,都未能解决。


返回顶部
顶部