专栏中心

EEPW首页 > 专栏 > openssl https 单向认证连接成功示例

openssl https 单向认证连接成功示例

发布人:电子禅石 时间:2020-07-25 来源:工程师 发布文章

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

环境:

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

UBUNTU 12.04

OPENSSL 1.0.2d

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

TOOL: code::blocks

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

测试结果截图:

13.png

#include <stdio.h>
#include <stdlib.h>
#include "openssl/bio.h"
#include "openssl/ssl.h"
#include "openssl/err.h"
 
char* join(char *s1, char *s2);
int main()
{
    BIO *sbio, *out;
    int len;
    char tmpbuf[1024];
    SSL_CTX *ctx;
    SSL *ssl;
 
    //ERR_load_crypto_strings();
    ERR_load_SSL_strings();
    //OpenSSL_add_all_algorithms();
    SSL_library_init();
 
    //如果系统平台不支持自动进行随机数种子的设置,这里应该进行设置(seed PRNG)
    ctx = SSL_CTX_new(SSLv23_client_method());
 
    //ctx = SSL_CTX_new(TLS_client_method());
    //SSL_CTX_set_cipher_list(ctx,"EXP-RC4-MD5");
 
 
    //通常应该在这里设置一些验证路径和模式等,因为这里没有设置,所以该例子可以跟使用任意CA签发证书的任意服务器建立连接
    sbio = BIO_new_ssl_connect(ctx);
 
    BIO_get_ssl(sbio, &ssl);
 
    if(!ssl)
    {
        fprintf(stderr, "Can't locate SSL pointer/n");
        ERR_print_errors_fp(stderr);
    }
 
    /* 不需要任何重试请求*/
    SSL_set_mode(ssl, SSL_MODE_AUTO_RETRY);
 
    //这里你可以添加对SSL的其它一些设置
 
    BIO_set_conn_hostname(sbio, "106.39.167.232:443");
 
    out = BIO_new_fp(stdout, BIO_NOCLOSE);
    if(BIO_do_connect(sbio) <= 0)
    {
        fprintf(stderr, "Error connecting to server/n");
        ERR_print_errors_fp(stderr);
    }
    printf("SSL connection using %s\n",SSL_get_cipher(ssl));
    //SSL_CTX_set_cipher_list(ctx,SSL_get_cipher(ssl));
 
    X509 *cert = SSL_get_peer_certificate(ssl);
 
    printf ("Server certificate:\n");
    char *str = X509_NAME_oneline(X509_get_subject_name(cert),0,0);
    printf ("\t subject: %s\n", str);
 
    OPENSSL_free(str);
 
    str = X509_NAME_oneline(X509_get_issuer_name(cert),0,0);
    printf ("\t issuer: %s\n", str);
    OPENSSL_free(str);
 
    X509_free(cert);
 
    if(BIO_do_handshake(sbio) <= 0)
    {
        fprintf(stderr, "Error establishing SSL connection/n");
        ERR_print_errors_fp(stderr);
    }
 
    /* 这里可以添加检测SSL连接的代码,得到一些连接信息*/
 
    const char *http_req_hdr_tmpl = "GET %s HTTP/1.1\r\n"
    "Accept: image/gif, image/jpeg, text/json,text/html */*\r\nAccept-Language: zh-cn\r\n"
    "Accept-Encoding: gzip, deflate\r\nHost: %s\r\n"
    "User-Agent: %s <0.1>\r\nConnection: Keep-Alive\r\n\r\n";
    int bufsize = 1024;
    char header_get[bufsize];
 
 
    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");
 
    //BIO_puts(sbio, header_get);
    BIO_write(sbio,header_get,len);
    for(;;)
    {
        len = BIO_read(sbio, tmpbuf, 1024);
        if(len <= 0) break;
        BIO_write(out, tmpbuf, len);
    }
    BIO_free_all(sbio);
    BIO_free(out);
 
 
    return 0;
}

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

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


专栏文章内容及配图由作者撰写发布,仅供工程师学习之用,如有侵权或者其他违规问题,请联系本站处理。 联系我们

关键词:

相关推荐

CITE 2026 圆满闭幕|前沿科技汇聚鹏城,世界级产业集群动能澎湃

消费电子 2026-04-14

JavaScript源代码集

Nordic Semiconductor 重磅亮相 Bluetooth Asia 2026 以全域物联网全栈能力开启无线创新篇章

慕尼黑上海电子展热点追踪:从\"强制配储\"到\"十万亿支柱\",储能产业的价值重生

MSP430 学习套件(五)

视频 2010-03-17

英飞凌持续巩固全球车用半导体市场领导地位

MSP430 学习套件(六)

视频 2010-03-17

MSP430 学习套件(四)

视频 2010-03-17

Molex 莫仕通过一站式光学互连架构以及首次推出的高基数光电路交换机平台,加速 AI 集群部署

MSP430 学习套件(二)

视频 2010-03-17

MSP430 学习套件(三)

视频 2010-03-17

意法半导体集成保护功能的氮化镓栅极驱动器

Stryten 推出E系列AGM电池 提升电信与公用事业供电可靠性

Internet协议代码(BSD4.4)

GSMGPRS通信在配电自动化系统中的应用

IEEE802.11网络中服务质量支持机制的研究

亚马逊推出商用飞机高速卫星互联网天线

KS8999 以太网络交换机芯片

赋能智能车与机器人技术转型:大联大世平集团携手AutoSys举办线上研讨会

FRDM Automotive:基于S32汽车处理平台,加速开发进程

更多 培训课堂
更多 焦点
更多 视频

技术专区