用curl访问HTTPS站点并登录

Posted csfreebird

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了用curl访问HTTPS站点并登录相关的知识,希望对你有一定的参考价值。

开发网站,少不了测试。现在的网站为了加强安全性,都启用了HTTPS协议。所谓HTTPS,也就是HTTP文本在SSL协议中传输。用curl命令行来测试HTTPS站点是个很有用的功能,写点脚本,就可以做功能测试。

假定Ubuntu系统运行着一个HTTPS站点,用CppCMS编写,nginx配置了SSL证书,通过FastCGI和CppCMS编写的后台进程连接在一起。

第一步,安装:

apt-get install curl
我的Ubuntu是13.04, 因此安装的curl版本很新,下面的命令检查版本号和其他信息:

curl -V
curl 7.29.0 (x86_64-pc-linux-gnu) libcurl/7.29.0 OpenSSL/1.0.1c zlib/1.2.7 libidn/1.25 librtmp/2.3
Protocols: dict file ftp ftps gopher http https imap imaps ldap ldaps pop3 pop3s rtmp rtsp smtp smtps telnet tftp 
Features: GSS-Negotiate IDN IPv6 Largefile NTLM NTLM_WB SSL libz TLS-SRP
我们可以看到启用了SSL, 并且openssl版本是1.0.1c。


第二步,访问HTTP站点:

curl http://www.baidu.com
<!DOCTYPE html><!--STATUS OK--><html><head><meta http-equiv="content-type" content="text/html;charset=utf-8"><title>百度一下,你就知道<unction()var _t=new Date().getTime();document.cookie = "WWW_ST=" + _t +";expires=" + new Date(_t + 10000).toGMTString())catch(e)</script></html><!--b5d54ba904675fbf-->
返回了百度的网页内容。内容太多,裁剪了。


第三步,查看详细信息,用-v参数。

 curl -v http://www.baidu.com
* About to connect() to www.baidu.com port 80 (#0)
*   Trying 61.135.169.125...
* Connected to www.baidu.com (61.135.169.125) port 80 (#0)
> GET / HTTP/1.1
> User-Agent: curl/7.29.0
> Host: www.baidu.com
> Accept: */*
> 
< HTTP/1.1 200 OK
< Date: Wed, 03 Jul 2013 13:55:45 GMT
< Server: BWS/1.0
< Content-Length: 10437
< Content-Type: text/html;charset=utf-8
< Cache-Control: private
< Set-Cookie: BDSVRTM=24; path=/
< Set-Cookie: H_PS_PSSID=2757_1457_2704_2726_1788_2249_2702; path=/; domain=.baidu.com
< Set-Cookie: BAIDUID=5E81F8E70C5DE6EDB5C24088E3E56359:FG=1; expires=Wed, 03-Jul-43 13:55:45 GMT; path=/; domain=.baidu.com
< Expires: Wed, 03 Jul 2013 13:55:45 GMT
< P3P: CP=" OTI DSP COR IVA OUR IND COM "
< Connection: Keep-Alive
< 
<!DOCTYPE html><!--STATUS OK--><html><head><meta http-equiv="content-type" content="text/html;charset=utf-8"><title>百度一下,你就知道</title><style >html,bodyheight:100%htmloverflow-y:auto#wrapperposition:relative;_position:;min-height:100%#contentpadding-bottom:100px;text-align:center#ftConheight:100px;position:absolute;bottom:44px;text-align:center;width:100%;margin:0 auto;z-index:0;overflow:hidden#ftConwwidth:720px;margin:0 autobodyfont:12px arial;text-align:;background:#fffbody,p,form,ul,limargin:0;padding:0;list-style:nonebody,form,#fmposition:relativetdtext-align:leftimgborder:0acolor:#00ca:activecolor:#f60#ucolor:#999;padding:4px 10px 5px 0;text-align:right#u amargin:0 5px#u .regmargin:0#mwidth:720px;margin:0 auto#nv a,#nv b,.btn,#lkfont-size:14px#fmpadding-left:110px;text-align:left;z-index:1inputborder:0;padding:0#nvheight:19px;font-size:16px;margin:0 0 4px;text-alig

这样详细的信息都显示出来了。-v参数很有用,一般调试时都打开。

如果只想查看头部信息,用-i代替-v.


第四步,访问本地HTTPS站点

curl --insecure https://localhost/your_site/login_page

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
  <head>
    <meta http-equiv="content-type" content="text/html; charset=utf-8">
      <meta http-equiv="pragma" content="no-cache">
	<meta http-equiv="cache-control" content="no-cache">

---insecure表示忽略校验步骤。

我试过用--cacert选项指定server.crt文件,也就是我的nginx使用的那个文件。但是报错。所以直接忽略算了。


第五步,调用HTTPS的login API登录

curl -v --insecure -d "email=gche@yousite.com&pwd=123456&language=en" https://localhost/your_site/login
* About to connect() to localhost port 443 (#0)
*   Trying 127.0.0.1...
* Connected to localhost (127.0.0.1) port 443 (#0)
* successfully set certificate verify locations:
*   CAfile: none
  CApath: /etc/ssl/certs
* SSLv3, TLS handshake, Client hello (1):
* SSLv3, TLS handshake, Server hello (2):
* SSLv3, TLS handshake, CERT (11):
* SSLv3, TLS handshake, Server key exchange (12):
* SSLv3, TLS handshake, Server finished (14):
* SSLv3, TLS handshake, Client key exchange (16):
* SSLv3, TLS change cipher, Client hello (1):
* SSLv3, TLS handshake, Finished (20):
* SSLv3, TLS change cipher, Client hello (1):
* SSLv3, TLS handshake, Finished (20):
* SSL connection using ECDHE-RSA-AES256-SHA
* Server certificate:
* 	 subject: C=AU; ST=Some-State; O=Internet Widgits Pty Ltd
* 	 start date: 2013-06-02 07:24:53 GMT
* 	 expire date: 2014-06-02 07:24:53 GMT
* 	 issuer: C=AU; ST=Some-State; O=Internet Widgits Pty Ltd
* 	 SSL certificate verify result: self signed certificate (18), continuing anyway.
> POST /your_site/login HTTP/1.1
> User-Agent: curl/7.29.0
> Host: localhost
> Accept: */*
> Content-Length: 51
> Content-Type: application/x-www-form-urlencoded
> 
* upload completely sent off: 51 out of 51 bytes
< HTTP/1.1 200 OK
< Server: nginx/1.5.1
< Date: Wed, 03 Jul 2013 14:02:38 GMT
< Content-Type: text/html; charset=utf-8
< Transfer-Encoding: chunked
< Connection: keep-alive
< X-Powered-By: CppCMS/1.0.3
< Set-Cookie: cml_session=518b7fc5117e87bce28f2444; Max-Age=36000; Path=/; Version=1
< 
* Connection #0 to host localhost left intact
"message":"Login succeeded!","status":0,"value":""

-d "...&..." 的参数是通过POST方法发送参数。服务端最终回复一个JSON格式的字符串,表示登录成功。并且拿到了cml_session的值,也就是cookie.


第六步,用cookie访问HTTP网页。后面的网页只需要HTTP访问,提供正确的cookie即可。

curl -v --cookie "cml_session=518b7fc5117e87bce28f2444" http://localhost/your_site/home
* About to connect() to localhost port 80 (#0)
*   Trying 127.0.0.1...
* Connected to localhost (127.0.0.1) port 80 (#0)
> GET /your_site/home HTTP/1.1
> User-Agent: curl/7.29.0
> Host: localhost
> Accept: */*
> Cookie: cml_session=518b7fc5117e87bce28f2444
> 
< HTTP/1.1 200 OK
< Server: nginx/1.5.1
< Date: Wed, 03 Jul 2013 14:06:43 GMT
< Content-Type: text/html; charset=utf-8
< Transfer-Encoding: chunked
< Connection: keep-alive
< X-Powered-By: CppCMS/1.0.3
< 

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
  <head>
    <meta http-equiv="content-type" content="text/html; charset=utf-8">
      <meta http-equiv="pragma" content="no-cache">
	<meta http-equiv="cache-control" content="no-cache">
	  <meta http-equiv="expires" content="0">
	    <title>CML Cloud</title>
	    <link type="text/css" href="../style/reset.css" rel="stylesheet"/>
	    <link type="text/css" href="../style/style.css" rel="stylesheet"/>










以上是关于用curl访问HTTPS站点并登录的主要内容,如果未能解决你的问题,请参考以下文章

如何从 php curl 访问洋葱站点? [复制]

如何为自己的WordPress站点安装SSL证书开启https访问

无法从 Apple 终端访问 SSL 站点和神秘的 curl 错误

怎样用php中的curl模拟登陆

我无法通过curl登录该站点

PHP curl - 发布 asp.net 视图状态值