openssl:用ssl_get_peer_certification函数得到证书为空 5C

我用阻塞模式的socket做ssl连接就能得到证书,但是用非阻塞的socket得到证书就为空。
下面是代码:
void ShowCerts(SSL * ssl) //show the certification
{
X509 * cert;
char * line;
cert = SSL_get_peer_certificate(ssl);
if (cert != NULL)
{
line = X509_NAME_oneline(X509_get_subject_name(cert), 0, 0);
printf("certification: %s\n", line);
free(line);
line = X509_NAME_oneline(X509_get_issuer_name(cert), 0, 0);
printf("publisher: %s\n", line);
free(line);
X509_free(cert);
}
else
{
printf("no certification!\n");
}
}

int main(int argc, char * *argv)
{
if (argc != 3)
{
printf("parameter error1!\n");
exit(0);
}
int sockfd, len;
struct sockaddr_in dest;
//initialize ssl
SSL_CTX * ctx;
SSL * ssl;
SSL_library_init();
OpenSSL_add_all_algorithms();
SSL_load_error_strings();
ctx = SSL_CTX_new(SSLv23_client_method());

if (ctx == NULL) 
{
    ERR_print_errors_fp(stdout);
    exit(1);
}
//create socket
if ((sockfd = socket(AF_INET, SOCK_STREAM, 0)) < 0) 
{
    perror("Socket");
    exit(errno);
}
printf("socket created\n");

bzero( &dest, sizeof(dest));
dest.sin_family = AF_INET;

dest.sin_port = htons(atoi(argv[2]));

if (inet_aton(argv[1], (struct in_addr * ) &dest.sin_addr.s_addr) == 0) 
{
    perror(argv[1]);
    exit(errno);
}
printf("address created\n");
    int error=-1;
    len = sizeof(int);
    struct timeval tm;
    fd_set set;
    // set non-block socket
    unsigned long ul = 1;
    ioctl(sockfd,FIONBIO,&ul);
    // create tcp connection
    bool ret =false;
    if (connect(sockfd, (struct sockaddr * ) &dest, sizeof(dest)) == -1) 
    {
        tm.tv_sec =TIMEOUT;
        tm.tv_usec = 0;
        FD_ZERO(&set);
        FD_SET(sockfd,&set);
        if(select(sockfd+1,NULL,&set,NULL,&tm)>0) 
        {
            getsockopt(sockfd,SOL_SOCKET,SO_ERROR,&error,(socklen_t *)&len);
            if(error==0)
            {
                ret = true;     //connect successfully
            }
            else
            {
                ret = false;    //connect timeout
            }
        }
        else
        {
            ret = false;
        }
    }
    else
    {
        ret = true;
    }
    if(!ret)
    {
        close(sockfd);
        SSL_CTX_free(ctx);
        printf("tcp connection timeout!\n");
        exit(0);

    }

    printf("server connected\n");
    ssl = SSL_new(ctx);
    //bind socket and ssl
    SSL_set_fd(ssl, sockfd);
    int flag;
    int result;
    int ssl_conn_ret=0;

    if(1!=ssl_conn_ret)
    {   
        //non block ssl connection
        ssl_conn_ret=SSL_connect(ssl);
        fd_set fds;
        FD_ZERO(&fds);
        FD_SET(sockfd, &fds);

        int ssl_get_error_value = SSL_get_error(ssl,ssl_conn_ret);
        printf("ssl_get_error_value is %d\n",ssl_get_error_value);
        switch (ssl_get_error_value)
        {
            case SSL_ERROR_WANT_READ:
                result=select(sockfd + 1, &fds, NULL, NULL, &tm);
                if(0==result)
                {
                    flag=0;
                }
                else if(-1==result)
                {
                    flag=0;
                }
                else
                {
                    flag=1;  //connect successfully
                }

                break;
            case SSL_ERROR_WANT_WRITE:
                result=select(sockfd + 1, NULL, &fds, NULL, &tm);
                if(0==result)
                {
                    flag=0;
                }
                else if(-1==result)
                {
                    flag=0; //conncet failed
                }
                else
                {
                    flag=1;
                }   
                break;
            default:
                flag=0;
                break;
        }
    }
    if(0==flag)
    {
        printf("connection error!\n");

    }
    if(1==ssl_conn_ret||1==flag)
    {
        ShowCerts(ssl);
    }


    ul = 0;
    ioctl(sockfd, FIONBIO, &ul);

    SSL_shutdown(ssl);
    SSL_free(ssl);
    close(sockfd);
    SSL_CTX_free(ctx);
return 0;

}

3个回答

非阻塞的时候,是不是连接等还没有建立好。获取的时间点有问题

非阻塞情况下,SSL_do_handshake, 别用SSL_connect, 返回1表示握手成功,这时用SSL_get_peer_certificate就没问题了

需要多次WHILE循环SSL_do_handshake的结果,直到返回1或小于0的值

Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
其他相关推荐
openssl证书相关函数
opensssl相关函数的应该,包括生成根证书,签发证书
用openssl为apache制作ssl证书
用openssl为apache制作ssl证书
openssl 证书
openssl证书 应用在 nginx配置https的时候使用 正式没有设置密码
Linux下用Openssl生成证书
用openssl签发ssl x.509证书 建立根证书: 制做服务器端的证书并用ca签名: 生成crt格式 生成cer格式
用openssl命令制作证书
一、制作根证书 1、准备工作(home目录下创建目录) 命令:mkdir demoCA && mkdir demoCA/certs && mkdir demoCA/newcerts && mkdir demoCA/private && mkdir demoCA/crl && touch index.txt serial && echo 01 > serial 2、生产根证书私钥 命令:op
为ListenAndServeTLS函数制作证书文件和私钥文件(openssl)
1.下载openssl 2.用命令行 进入openssl的bin目录 (以下是抛弃CA的自签名简易方法,仅适用于浏览器客户端忽略证书验证情况) 3.openssl genrsa -out server.pem 2048 4.openssl req -new -x509 -key server.pem -out server.crt - config ../openssl.cnf -d...
使用openssl转换pem为pfx证书
本来不值得一写,网上查来查去没一个完完整整写得正确的,pem证书转pfx证书分两种,一种带ca证书转换,一种不带ca证书转换 1.pem转pfx(不带ca证书) 以test.pem转test.pfx为例 openssl rsa -in test.pem -out test.key openssl x509 -in test.pem -out test.crt openssl pkcs12 -exp...
用openssl为苹果开发者账号gerneate证书申请
Afaria文档中提到可以用Mac电脑keychain或者Windows 2008 IIS生成证书申请。 但是IIS生成的证书申请,Apple不认,提示Invalid Certificate 用Mac生成,又太麻烦了。得,草民用openssl 生成。D:\openssl-0.9.8h-1-bin\bin>openssl genrsa -out afaria.key 2048提交Apple产生 i
C调用openssl关于证书的函数问题
如何从文件中获得证书的公私钥,怎么验证证书,怎么生成证书,怎么把证书写成文件?rn都涉及到openssl哪些头文件,用到什么函数,函数参数及返回都是什么?rn如果能有演示代码更好。rn不管会不会,您能看这个帖子就先谢谢你了。
openSSL创建三类证书
在widndows下,通过openSSL创建三类证书(自签名根证书,服务器证书,客户端证书)
openssl生成证书
使用openssl生成证书,有详细的步骤说明,亲测可用。还有一些关于证书的一些常用转换操作介绍
openssl 解析证书
使用openssl 解析 证书信息。 主要功能获得颁发者,颁发给,证书有效期等信息。
openssl证书数据加密和解密
<?php /** *open ssl 的使用 *Op_get_random_bytes() 随机生成指定长度的字符 *加密和解密是相反的 公钥加密就要私钥解密(反之亦然) *Op_encrypt() 加密函数 *Op_decrypt() 解密函数 *Op_base64() 特殊字符和十进制字符的转化 */ /*
OPENSSL X509证书验证
步骤: 1)初始化环境 a.新建证书存储区X509_STORE_new() b.新建证书校验上下文X509_STORE_CTX_new() 2)导入根证书 a.读取CA证书,从DER编码格式化为X509结构d2i_X509() b.将CA证书导入证书存储区X509_STORE_add_cert() 3)导入要校验的证书test a.读取证书test,从DER编码格式化为X5
openssl 生成SSL证书
注意: 制作签发证书的请求文件时,需要输入Common Name参数,此参数一定为当前主机的IP地址,否则将会显示证书错误。(我直接输入XX即可) 图解SSL协议(http://blog.csdn.net/wallezhe/article/details/50977337) 基于OpenSSL自建CA和颁发SSL证书(http://seanlook.com/2015/01/18/openssl-s
使用 openssl 生成证书
文章目录1. 前置知识2. 生成一份 CA 根证书1) 创建私钥2) 生成证书请求文件(CSR)3) 自签署证书3. 颁发服务器证书1) 创建服务器私钥2) 生成证书请求文件(CSR)3) 使用 CA 证书进行签署,生成 crt 文件4. 实践总结5. 对于 IIS 的设置6. 解决 Chrome 报 missing_subjectAltName 的问题7. 更多用法1) 通过配置文件,非交互式生...
OpenSSL生成证书
1. 下载并安装OpenSLL(链接: https://pan.baidu.com/s/1LizdMy7Bvu7oHHFHIECeSw 提取码: 7xbt) 2. 找到所安装目录的bin目录 ,如: D:\OpenSSL-Win64\bin, 将改目录配置到 path目录下即可 3. 制作CA证书 3.1产生 RSA 密钥 ca.key CA私钥:genrsa -des3 -out ca....
OpenSSL证书操作
OpenSSL证书操作
Openssl 生成证书
工具:windows powershell; .\openssl.exe genrsa -aes256 -passout pass:12345 -out rsa_aes_private.key 2 048 不加参数 -passout 回提示要输入密码; .\openssl.exe req -newkey rsa:2048 -keyout rsa_private.key -x50...
openssl 信任所有证书
在linux环境下使用socket和openssl来实现https协议。rn连接后,向服务器发送post消息,得不到回答。rnrn调查原因,没有找到。rn哥们儿帮忙使用java验证了下,设置为证书都可信任,就可以和服务器通信了。rnrn查了下openssl的接口,没有找到怎么设置证书可信任。rn这个有知道的老司机吗?rnrn猜测是不是用下面的方法?下面的思路对不对?rnrn1、创建和释放证书存储区rnX509_STORE *X509_STORE_new(void);rnrn2、向证书存储区添加证书rnInt X509_STORE_add_cert(X509_STORE *ctx, X509 *x);rn函数功能:添加信任的根证书到证书存储区。rn返回值:1成功,否则为0rnrn3、释放证书存储区rnVoid X509_STORE_free(X509_STORE *v);rn函数功能:创建和释放一个X509_STORE结构体, 主要用于验证证书。rnrn说明:证书在connect后,从ssl连接中取得。rnX509 *cert = SSL_get_peer_certificate(ssl);
OPenssl生成证书
可生成CA.crt等web服务器的加密证书等,方法很详细,适合做实验用。
openssl证书下载
在WINCE设备上用OPENSSL做了SSL通讯,最近客户的服务器更新了CA证书。rn想问一下,终端设备上有什么方法可以自动更新CA证书?是用OPENSSL自己的命令,还是要另外加FTP之类的?rn
linux下 openssl证书签发
在linux已经集成了openssl组件,因此博主利用例子讲解如何在linux系统下签发证书,因为个人证书时不受谷歌浏览器认可的,所以自签发证书只能在火狐浏览器下测试使用!
openssl 创建ssl证书
  http://han-zw.iteye.com/blog/640737 转自这里 前段时间接触webservice,需要建立基于ssl的webservice以保证安全性,并要提供数字的支持。关于这部分以前没有搞过,经过摸索总算有些收获。现在把我的一些经验share一下。一、 数字证书的相关准备 关于数字证书部分我是用openssl做的,也是个开源的软件,前不久刚刚发布了1.0版本(做了...
openssl证书验证
私钥和证书有不同的存储格式,在使用之前需要进行转换 .crt 证书文件 ,可以是DER(二进制)编码的,也可以是PEM( ASCII (Base64) )编码的 ,在类unix系统中比较常见。使用vi打开文件如果内容出现如下样式,则表明是PEM的。 -----BEGIN CERTIFICATE----- MIIF0TCCA7mgAwIBAgIJA ..... LMH9av0= --
openssl 验证证书 问题
最近在写一个MFC程序,想通过 openssl 连接到一个https 网站,连接已经成功,但不知道怎么去验证证书,求高手指教。。。。。
php7.2 OpenSSL证书问题
PHP warning: stream_socket_client(): SSL operation failed with code 1. OpenSSL Error messages:rnerror:14090086:SSL routines:SSL3_GET_SERVER_CERTIFICATE:certificate verify failed on line 1rnrn请教各位兄台这个问题怎么解决。由PHP5升级到PHP7出的问题。rnrnrn找了好多方案都没有解决!
linux下生成openssl证书
下载安装openssl,进入/bin/下面,执行命令(把ssl目录下的openssl.cnf 拷贝到bin目录下)1.首先要生成服务器端的私钥(key文件):openssl genrsa -des3 -out server.key 1024[root@airwaySSL openssl]# cd ssl/[root@airwaySSL ssl]# pwd/home/opens...
openssl生成https证书
openssl生成https证书 简介 本文主要介绍在Linux环境下通过openssl生成自己的ssl证书,并搭配nginx服务器启用https。我对证书的了解也不是很多,从网上搜罗一些资料,并在CentOS上成功搭建HTTPS服务器,通过本文整理如下: 准备工作 /etc/pki/CA/index.txt 跟踪已颁发的证书,初始为空。注意是0字节,不然会报出一个错误。 wrong num...
OpenSSL及证书服务
3.OpenSSL及证书服务 问题 本案例要求熟悉OpenSSL工具的基本使用,完成以下任务操作: 1)使用OpenSSL加密/解密文件 2)搭建企业自有的CA服务器,为颁发数字证书提供基础环境 方案 使用两台RHEL6虚拟机,其中svr5作为CA数字证书服务器,而pc205作为测试用客户机,如图-4所示。 步骤 实现此案例需要按照如下步骤进行。 步骤一:使用OpenSSL加密/解密文件 ...
openssl证书生成
下载安装openssl ./config make make test make install 下载地址:http://www.openssl.org/source/  进入程序执行路径下面(/data/gfj/openssl-1.0.1s/demos/ssl),将/data/gfj/openssl-1.0.1s/apps/openssl.cnf 拷贝到/data/gfj/opens
openssl证书使用说明02
openssl证书使用说明
OPENSSL操作及证书格式转换
本文主旨为使用openssl进行证书的创建与转换了解证书相关知识请访问:证书基础知识了解Keystroe或者keytool相关知识访问:keytool操作及证书转换OPENSSL 1 创建公私钥证书无密私钥openssl genrsa -out n_prikey.pem 1024 有密私钥,可以设置密码 openssl genrsa -des3 -out y_prikey.pem 1024公钥证书...
openssl证书命令行
openssl x509部分命令 打印出证书的内容: openssl x509 -in cert.pem -noout -text 打印出证书的系列号 openssl x509 -in cert.pem -noout -serial 打印出证书的拥有者名字 openssl x509 -in cert.pem -noout -subject 以RFC2253规定的格式打印出证书的拥有者
OpenSSL 生成证书
1.生成root key openssl genrsa -out ca.key 2048 2.根据private root key 生成根证书 openssl req -x509 -new -nodes -key ca.key -subj  "/CN=IP_LOCAL_ADDRESS" -days 10000 -out ca.crt 3.生成server key openssl genr
openssl检测证书
# Check a Certificate Signing Request (CSR)openssl req -text -noout -verify -in CSR.csr # Check a private keyopenssl rsa -in privateKey.key -check # Check a certificateopenssl x509 -in certificate.crt...
openssl证书文件
在win32平台下利用openssl编写ssl通信程序时需要进行加密证书的验证,本文档是客户端和服务端的证书文件。
OPENSSL证书操作
OPENSSL证书操作,涉及各种操作,十分有用,无论对那个阶层的人都可以看看,好的借鉴,不好的支出。
OpenSSL证书生成器
OpenSSL 证书生成器 可用于apache的ssl证书生成
Openssl命令制作证书
1.生成私钥openssl genrsa -out rsa_private.key 10242.使用私钥生成公钥openssl rsa -in rsa_private.key -pubout -out rsa_public.key3.生成自签名证书openssl req -new -x509 -days 365 -key rsa_private.key -out cert.cer -subj &quot;/...
相关热词 c# stream 复制 android c# c#监测窗口句柄 c# md5 引用 c# 判断tabtip 自己写个浏览器程序c# c# 字符串变成整数数组 c#语言编程写出一个方法 c# 转盘抽奖 c#选中treeview