研究这个玩意也有几天的时间了,刚学C 因为不熟悉编译折腾了不少时间,终于弄通了,发个随笔给研究openssl https的同学一点提示吧。

环境:

==========================================================

UBUNTU 12.04

OPENSSL 1.0.2d

SSL:SSL2(同学们可以研究下使用TSL和SSL3,我还木有研究好)

TOOL: code::blocks

==========================================================

测试结果截图:

CODE:

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include "openssl/bio.h"
  4. #include "openssl/ssl.h"
  5. #include "openssl/err.h"
  6.  
  7. char* join(char *s1, char *s2);
  8. int main()
  9. {
  10. BIO *sbio, *out;
  11. int len;
  12. char tmpbuf[1024];
  13. SSL_CTX *ctx;
  14. SSL *ssl;
  15.  
  16. //ERR_load_crypto_strings();
  17. ERR_load_SSL_strings();
  18. //OpenSSL_add_all_algorithms();
  19. SSL_library_init();
  20.  
  21. //如果系统平台不支持自动进行随机数种子的设置,这里应该进行设置(seed PRNG)
  22. ctx = SSL_CTX_new(SSLv23_client_method());
  23.  
  24. //ctx = SSL_CTX_new(TLS_client_method());
  25. //SSL_CTX_set_cipher_list(ctx,"EXP-RC4-MD5");
  26.  
  27. //通常应该在这里设置一些验证路径和模式等,因为这里没有设置,所以该例子可以跟使用任意CA签发证书的任意服务器建立连接
  28. sbio = BIO_new_ssl_connect(ctx);
  29.  
  30. BIO_get_ssl(sbio, &ssl);
  31.  
  32. if(!ssl)
  33. {
  34. fprintf(stderr, "Can't locate SSL pointer/n");
  35. ERR_print_errors_fp(stderr);
  36. }
  37.  
  38. /* 不需要任何重试请求*/
  39. SSL_set_mode(ssl, SSL_MODE_AUTO_RETRY);
  40.  
  41. //这里你可以添加对SSL的其它一些设置
  42.  
  43. BIO_set_conn_hostname(sbio, "106.39.167.232:443");
  44.  
  45. out = BIO_new_fp(stdout, BIO_NOCLOSE);
  46. if(BIO_do_connect(sbio) <= 0)
  47. {
  48. fprintf(stderr, "Error connecting to server/n");
  49. ERR_print_errors_fp(stderr);
  50. }
  51. printf("SSL connection using %s\n",SSL_get_cipher(ssl));
  52. //SSL_CTX_set_cipher_list(ctx,SSL_get_cipher(ssl));
  53.  
  54. X509 *cert = SSL_get_peer_certificate(ssl);
  55.  
  56. printf ("Server certificate:\n");
  57. char *str = X509_NAME_oneline(X509_get_subject_name(cert),0,0);
  58. printf ("\t subject: %s\n", str);
  59.  
  60. OPENSSL_free(str);
  61.  
  62. str = X509_NAME_oneline(X509_get_issuer_name(cert),0,0);
  63. printf ("\t issuer: %s\n", str);
  64. OPENSSL_free(str);
  65.  
  66. X509_free(cert);
  67.  
  68. if(BIO_do_handshake(sbio) <= 0)
  69. {
  70. fprintf(stderr, "Error establishing SSL connection/n");
  71. ERR_print_errors_fp(stderr);
  72. }
  73.  
  74. /* 这里可以添加检测SSL连接的代码,得到一些连接信息*/
  75.  
  76. const char *http_req_hdr_tmpl = "GET %s HTTP/1.1\r\n"
  77. "Accept: image/gif, image/jpeg, text/json,text/html */*\r\nAccept-Language: zh-cn\r\n"
  78. "Accept-Encoding: gzip, deflate\r\nHost: %s\r\n"
  79. "User-Agent: %s <0.1>\r\nConnection: Keep-Alive\r\n\r\n";
  80. int bufsize = 1024;
  81. char header_get[bufsize];
  82.  
  83. len = sprintf(header_get,http_req_hdr_tmpl,"/routerjson","api.jd.com","User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/46.0.2490.71 Safari/537.36");
  84.  
  85. //BIO_puts(sbio, header_get);
  86. BIO_write(sbio,header_get,len);
  87. for(;;)
  88. {
  89. len = BIO_read(sbio, tmpbuf, 1024);
  90. if(len <= 0) break;
  91. BIO_write(out, tmpbuf, len);
  92. }
  93. BIO_free_all(sbio);
  94. BIO_free(out);
  95.  
  96. return 0;
  97. }

如果不知道怎么编译链接或者出错的同学请看我的另一篇随笔

解决引用openssl静态库libcrypto.a和libssl.a出现undefined reference to错误的问题

openssl https 单向认证连接成功示例的更多相关文章

  1. java https单向认证(忽略认证)并支持http基本认证

    https单向认证(忽略认证)并支持http基本认证, 温馨提示 1,jar包要导入对 2,有匿名类编译要注意 3,欢迎提问,拿走不谢!背景知识 Https访问的相关知识中,主要分为单向验证和双向验证 ...

  2. Tomcat添加HTTPS单向认证和双向认证

    前言 前一段时间有了解如何配置Tomcat服务为Https单向认证和双向认证,当时也做了一些记录,今天开始写博客,就把以前的记录拿出来整理下,分享给大家.本文没有介绍证书如何生成,会在下一篇博文里介绍 ...

  3. java实现HTTPS单向认证&TLS指定加密套件

    1.HTTPS介绍 由于HTTP是明文传输,会造成安全隐患,所以在一些特定场景中,必须使用HTTPS协议,简单来说HTTPS=HTTP+SSL/TLS.服务端和客户端的信息传输都是通过TLS进行加密. ...

  4. tomcat 配置https (单向认证)

    1.单向认证,就是传输的数据加密过了,但是不会校验客户端的来源 2.双向认证,如果客户端浏览器没有导入客户端证书,是访问不了web系统的,找不到地址 如果只是加密,单向就行 如果想要用系统的人没有证书 ...

  5. https单向认证和双向认证区别

    关于证书 1.每个人都可以使用一些证书生成工具为自己的站点生成证书(比如jdk的keytool),大家称它为“自签名证书”,但是自己生成的证书是不被互联网承认的,所以浏览器会报安全提示,要求你手动安装 ...

  6. Https单向认证和双向认证介绍

    一.Http HyperText Transfer Protocol,超文本传输协议,是互联网上使用最广泛的一种协议,所有WWW文件必须遵循的标准.HTTP协议传输的数据都是未加密的,也就是明文的,因 ...

  7. 图解 https 单向认证和双向认证!

    来源: 一.Http HyperText Transfer Protocol,超文本传输协议,是互联网上使用最广泛的一种协议,所有WWW文件必须遵循的标准.HTTP协议传输的数据都是未加密的,也就是明 ...

  8. Rest接口加Https单向认证

    背景: 接到一个需求,客户要求某个模块的rest接口都得通过https访问,客户提供证书. 步骤: Server端证书生成 刚开始还没拿到客户的证书,所以通过jdk自带的keytools自己先生成了一 ...

  9. https单向认证和双向认证

    单向认证: .clinet<--server .clinet-->server .client从server处拿到server的证书,通过公司的CA去验证该证书,以确认server是真实的 ...

随机推荐

  1. JavaScript(获取或设置html元素的宽,高,坐标),确定和判断鼠标是否在元素内部,二级导航菜单鼠标离开样式问题解决

    设置: document.getElementById('id').style.width=value    document.getElementById('id').style.height=va ...

  2. 仿微信小红圈消息提示App消息红圆点提示

    代码: <div class="wrap"> <div class="img"></div> <div class=& ...

  3. html禁止浏览器默认行为,让页面更像应用。

    在html或body行内写入:oncontextmenu="return false" ondragstart='return false;' onselectstart=&quo ...

  4. AOSP编译

    AOSP编译 1 编译环境Win10系统安装VMplayer14,主机16G内存,I3-4170 ,虚拟机ubuntu-16.04.1-desktop-amd64,12G内存. 2 软件安装sudo ...

  5. Socket编程(一):建立与客户端的连接并接受数据

    我们这里利用Socket在模拟一个客户端与服务器通信,其实客户端与服务端通信就像人与人打电话一样,想要给一个人打电话,我们首先必须要有手机,必须知道对方的手机号码,这里Socket就好比一部手机,而短 ...

  6. 【BZOJ 2054】 2054: 疯狂的馒头 (并查集特技)

    Input 第一行四个正整数N,M,p,q Output 一共输出N行,第i行表示第i个馒头的最终颜色(如果最终颜色是白色就输出0). Sample Input 4 3 2 4 Sample Outp ...

  7. codevs 1102 采药 2005年NOIP全国联赛普及组

    1102 采药 2005年NOIP全国联赛普及组  时间限制: 1 s  空间限制: 128000 KB gold   题目描述 Description 辰辰是个天资聪颖的孩子,他的梦想是成为世界上最 ...

  8. [BZOJ4560][JLOI2016]字符串覆盖(贪心+DP)

    先用KMP求出所有可以放的位置,然后两个值分别处理. 最大值: 贪心,4!枚举放的先后位置顺序,2^3枚举相邻两个串是否有交. 若有交,则后一个的起始位置一定是离前一个的结束位置最近的位置,无交也一样 ...

  9. HDU4405 Aeroplane chess 飞行棋 期望dp 简单

    http://acm.hdu.edu.cn/showproblem.php?pid=4405   题意:问从起点到终点需要步数的期望,1/6的概率走1.2.3.4.5.6步.有的点a有路可以直接到b, ...

  10. [待码][BZOJ1858]SCOI2010序列操作 jzyzoj1655

    待码的线段树.....太长了看上去不是很想写 [ 什么破理由啊摔,不要脸 ] 嗯先水几道再写