免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 8413 | 回复: 0
打印 上一主题 下一主题

OpenSSL中的SSL_write的问题 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2009-02-26 12:35 |只看该作者 |倒序浏览
我想向一个HTTPS服务器提交一个表单,但是在调用SSL_write这个函数的时候出错了。
各位帮忙看一下,谢谢。

  1. static char *REQUEST =
  2.         "POST /SSL/user/PasswordUserLogin HTTP/1.1\r\n"
  3.         "Accept: image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, application/x-shockwave-flash, application/vnd.ms-excel, application/vnd.ms-powerpoint, application/msword, application/QVOD, application/x-ms-application, application/x-ms-xbap, application/vnd.ms-xpsdocument, application/xaml+xml, */*\r\n"
  4.         "Referer: [url]https://192.168.3.229/SSL/user/PasswordLogin.jsp[/url]\r\n"
  5.         "Accept-Language: zh-cn\r\n"
  6.         "Content-Type: application/x-www-form-urlencoded\r\n"
  7.         "UA-CPU: x86\r\n"
  8.         "Accept-Encoding: gzip, deflate\r\n"
  9.         "User-Agent: Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; .NET CLR 2.0.50727; .NET CLR 3.0.04506.648; .NET CLR 3.5.21022; MAXTHON 2.0)\r\n"
  10.         "Host: 192.168.3.229\r\n"
  11.         "Content-Length: 132\r\n"
  12.         "Connection: Keep-Alive\r\n"
  13.         "Cache-Control: no-cache\r\n\r\n"
  14.   "Host=192.168.3.229&LoginName=cXV4aWFueWFuZw%3D%3D&LoginPassword=cXV4aWFueWFuZw%3D%3D&LoginNameX=quxianyang&LoginPasswordX=quxianyang\r\n";

  15. static char *host;
  16. static int port;

  17. static int http_request(SSL *ssl)
  18. {
  19.         char *request = 0;
  20.         char buf[BUFSIZZ];
  21.         int r;
  22.         int len,request_len;
  23.         FILE *fw1;
  24.        

  25.         request_len = strlen(REQUEST);
  26.         request = (char *)malloc(request_len);
  27.         snprintf(request,request_len,REQUEST);
  28.    
  29.         printf("request1:%s",request);

  30.         r = SSL_write(ssl,request,request_len);
  31.         switch(SSL_get_error(ssl,r)){
  32.                 case SSL_ERROR_NONE:
  33.                         if(request_len != r)
  34.                                 err_exit("Incomplete write!");
  35.                                 break;
  36.                         default:
  37.                                 berr_exit("SSL write problem!");
  38.         }

  39.         if((fw1 = fopen("response1.txt","w")) == NULL)
  40.                 return 1;

  41.         while(1){
  42.                 r = SSL_read(ssl,buf,BUFSIZZ);
  43.                 switch(SSL_get_error(ssl,r)){
  44.                         case SSL_ERROR_NONE:
  45.                                 len = r;
  46.                                 break;
  47.                         case SSL_ERROR_WANT_READ:
  48.                                 goto done;
  49.                         case SSL_ERROR_ZERO_RETURN:
  50.                                 goto done;
  51.                         case SSL_ERROR_SYSCALL:
  52.                                 fprintf(stderr,"SSL Error:Premature close\n");
  53.                                 goto done;
  54.                         default:
  55.                                 berr_exit("SSL read problem");
  56.                 }

  57.                 len = r;
  58.                 fwrite(buf,1,len,fw1);
  59.         }       

  60.         done:
  61.                 fclose(fw1);
  62.                 free(request);
  63.                 return 0;
  64. }

  65. int main(int argc,char *argv[])
  66. {
  67.     SSL_CTX *ctx;
  68.     SSL *ssl;
  69.     BIO *sbio;
  70.     int sock;
  71.     extern char *optarg;
  72.     int c;
  73.     SSL_SESSION *sess;
  74.     int r;
  75.    
  76.     while((c=getopt(argc,argv,"h:p:ia:r"))!=-1){
  77.       switch(c){
  78.         case 'h':
  79.           if(!(host=strdup(optarg)))
  80.             err_exit("Out of memory");
  81.           break;
  82.         case 'p':
  83.           if(!(port=atoi(optarg)))
  84.             err_exit("Bogus port specified");
  85.           break;
  86.       }
  87.     }

  88.     /* Build our SSL context*/
  89.     ctx=initialize_ctx(KEYFILE,PASSWORD);

  90.     /* Connect the TCP socket*/
  91.     sock=tcp_connect(host,port);

  92.     /* Connect the SSL socket */
  93.     ssl=SSL_new(ctx);
  94.           SSL_set_fd(ssl,sock);
  95.     sbio=BIO_new_socket(sock,BIO_NOCLOSE);

  96.     if(SSL_connect(ssl)<=0)
  97.       berr_exit("SSL connect error");
  98.    

  99.     /* Now make our HTTP request */
  100.     //http_request(ssl);
  101.         http_request(ssl);
  102.    
  103.         SSL_free(ssl);
  104.     r=SSL_shutdown(ssl);
  105.     switch(r){
  106.       case 1:
  107.         break; /* Success */
  108.       case 0:
  109.       case -1:
  110.       default:
  111.         berr_exit("Shutdown failed");
  112.     }

  113.     /* Shutdown the socket */
  114.     destroy_ctx(ctx);
  115.     close(sock);

  116.     exit(0);
  117.   }
复制代码

其中REQUEST 中的“cXV4aWFueWFuZw”是“quxianyang”的Base64编码后的字符串。
调用SSL_write后打印出了"SSL write problem!",我获取错误信息时得到的又是error=null,实在不知道是哪里错了。
我这个SSL的初始化应该没有错误,因为我试过用GET请求获取一个页面,是可以成功的。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP