免费注册 查看新帖 |

Chinaunix

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

openssl 求救!SSL_CTX_use_certificate_chain_file返回失败!!有全部工程代码 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2009-10-14 11:17 |只看该作者 |倒序浏览
10可用积分
大家看看

    if(!(SSL_CTX_use_certificate_chain_file(ctx, CERTF))){
          ERR_print_errors_fp(stderr);
        exit(-2);
    }
这个地方就返回失败了,下面是代码;附件是全部工程代码

int main ()
{
    int err;
    int sd;
    struct sockaddr_in sa;
    SSL_CTX* ctx;
    SSL* ssl;
    X509* server_cert;
    char* str;
    SSL_METHOD *meth;
    int seed_int[100]; /*存放随机序列*/

    WSADATA wsaData;

    if(WSAStartup(MAKEWORD(2,2),&wsaData) != 0){
        printf("WSAStartup()fail:%d\n",GetLastError());
        return -1;
    }

    OpenSSL_add_ssl_algorithms(); /*初始化*/

    SSL_library_init();
    SSL_load_error_strings(); /*为打印调试信息作准备*/

    meth=SSLv23_method();
    ctx = SSL_CTX_new (meth);
    CHK_NULL(ctx);

    SSL_CTX_set_default_passwd_cb_userdata(ctx, "password");

    if(!(SSL_CTX_use_certificate_chain_file(ctx, CERTF))){
          ERR_print_errors_fp(stderr);
        exit(-2);
    }
    
    if(!(SSL_CTX_use_PrivateKey_file(ctx, CERTF,SSL_FILETYPE_PEM))){
        ERR_print_errors_fp(stderr);
        exit(-3);
    }

    /* Load the CAs we trust*/
    if(!(SSL_CTX_load_verify_locations(ctx, CACERT,0))){
        printf("Load CA failed!\n");
        exit(-4);
    }


    /*构建随机数生成机制,WIN32平台必需*/
    srand( (unsigned)time( NULL ) );
&nbsp;&nbsp;&nbsp;&nbsp;for( int i = 0; i < 100;i++ )
&nbsp;&nbsp;&nbsp;&nbsp;seed_int[i] = rand();
&nbsp;&nbsp;&nbsp;&nbsp;RAND_seed(seed_int, sizeof(seed_int));

&nbsp;&nbsp;&nbsp;&nbsp;/*以下是正常的TCP socket建立过程 .............................. */
&nbsp;&nbsp;&nbsp;&nbsp;printf("Begin tcp socket...\n");

&nbsp;&nbsp;&nbsp;&nbsp;sd = socket (AF_INET, SOCK_STREAM, 0); CHK_ERR(sd, "socket");

&nbsp;&nbsp;&nbsp;&nbsp;memset (&sa, '\0', sizeof(sa));
&nbsp;&nbsp;&nbsp;&nbsp;sa.sin_family = AF_INET;
&nbsp;&nbsp;&nbsp;&nbsp;sa.sin_addr.s_addr = inet_addr (SERVER_ADDR); /* Server IP */
&nbsp;&nbsp;&nbsp;&nbsp;sa.sin_port = htons (PORT); /* Server Port number */

&nbsp;&nbsp;&nbsp;&nbsp;err = connect(sd, (struct sockaddr*) &sa,
&nbsp;&nbsp;&nbsp;&nbsp;sizeof(sa));
&nbsp;&nbsp;&nbsp;&nbsp;CHK_ERR(err, "connect");

&nbsp;&nbsp;&nbsp;&nbsp;/* TCP 链接已建立.开始 SSL 握手过程.......................... */
&nbsp;&nbsp;&nbsp;&nbsp;printf("Begin SSL negotiation \n");

&nbsp;&nbsp;&nbsp;&nbsp;ssl = SSL_new (ctx);
&nbsp;&nbsp;&nbsp;&nbsp;CHK_NULL(ssl);

&nbsp;&nbsp;&nbsp;&nbsp;SSL_set_fd (ssl, sd);

&nbsp;&nbsp;&nbsp;&nbsp;err = SSL_connect (ssl);
&nbsp;&nbsp;&nbsp;&nbsp;CHK_SSL(err);

&nbsp;&nbsp;&nbsp;&nbsp;/*打印所有加密算法的信息(可选)*/
&nbsp;&nbsp;&nbsp;&nbsp;printf ("SSL connection using %s\n", SSL_get_cipher (ssl));

&nbsp;&nbsp;&nbsp;&nbsp;/*得到服务端的证书并打印些信息(可选) */
&nbsp;&nbsp;&nbsp;&nbsp;server_cert = SSL_get_peer_certificate (ssl);
&nbsp;&nbsp;&nbsp;&nbsp;CHK_NULL(server_cert);
&nbsp;&nbsp;&nbsp;&nbsp;printf ("Server certificate:\n");

&nbsp;&nbsp;&nbsp;&nbsp;str = X509_NAME_oneline (X509_get_subject_name (server_cert),0,0);
&nbsp;&nbsp;&nbsp;&nbsp;CHK_NULL(str);
&nbsp;&nbsp;&nbsp;&nbsp;printf ("\t subject: %s\n", str);
&nbsp;&nbsp;&nbsp;&nbsp;free (str);

&nbsp;&nbsp;&nbsp;&nbsp;str = X509_NAME_oneline (X509_get_issuer_name (server_cert),0,0);
&nbsp;&nbsp;&nbsp;&nbsp;CHK_NULL(str);
&nbsp;&nbsp;&nbsp;&nbsp;printf ("\t issuer: %s\n", str);
&nbsp;&nbsp;&nbsp;&nbsp;free (str);

&nbsp;&nbsp;&nbsp;&nbsp;X509_free (server_cert); /*如不再需要,需将证书释放 */

&nbsp;&nbsp;&nbsp;&nbsp;/* 数据交换开始,用SSL_write,SSL_read代替write,read */
&nbsp;&nbsp;&nbsp;&nbsp;printf(



全部工程代码 testssl.rar (3.7 MB, 下载次数: 134)

最佳答案

查看完整内容

如果你需要做身份验证,就需要一堆证书,看看openssl的工具怎么生成证书吧。如果只是用ssl通信,则不需要加载证书。[ 本帖最后由 albeta 于 2009-10-14 12:15 编辑 ]

论坛徽章:
0
2 [报告]
发表于 2009-10-14 11:17 |只看该作者
原帖由 chary8088 于 2009-10-14 11:44 发表
客户端的证书 我也是不明白这个证书是怎么回事?还要手工下载吗?


如果你需要做身份验证,就需要一堆证书,看看openssl的工具怎么生成证书吧。

如果只是用ssl通信,则不需要加载证书。

[ 本帖最后由 albeta 于 2009-10-14 12:15 编辑 ]

论坛徽章:
0
3 [报告]
发表于 2009-10-14 11:36 |只看该作者
#define CERTF "client.pem" /*客户端的证书(需经CA签名)*/

你确定这个文件在当前目录下面吗?如果没有,肯定会失败的呀。

论坛徽章:
0
4 [报告]
发表于 2009-10-14 11:44 |只看该作者

回复 #2 naihe2010 的帖子

客户端的证书 我也是不明白这个证书是怎么回事?还要手工下载吗?

论坛徽章:
0
5 [报告]
发表于 2009-10-14 12:15 |只看该作者

回复 #3 chary8088 的帖子

呵呵,你在程序中要加载的证书,当然得在路径在有才行啊。

论坛徽章:
0
6 [报告]
发表于 2009-10-14 12:56 |只看该作者

回复 #5 naihe2010 的帖子

这是用来和GMAIL通信用的,应该不用证书吧,,代码是从网上找的,,,,帮忙看下,谢谢了

论坛徽章:
0
7 [报告]
发表于 2009-10-14 13:00 |只看该作者
如果把不用证书的函数去了,下面就会出异常??

论坛徽章:
0
8 [报告]
发表于 2009-10-14 13:19 |只看该作者
和gmail通信你直接SSL_connect就行了吧,好像不需要不用证书

论坛徽章:
0
9 [报告]
发表于 2009-10-14 14:10 |只看该作者
int main ()
{
&nbsp;&nbsp;&nbsp;&nbsp;int err;
&nbsp;&nbsp;&nbsp;&nbsp;int sd;
&nbsp;&nbsp;&nbsp;&nbsp;struct sockaddr_in sa;
&nbsp;&nbsp;&nbsp;&nbsp;SSL_CTX* ctx;
&nbsp;&nbsp;&nbsp;&nbsp;SSL* ssl;
&nbsp;&nbsp;&nbsp;&nbsp;X509* server_cert;
&nbsp;&nbsp;&nbsp;&nbsp;char* str;
&nbsp;&nbsp;&nbsp;&nbsp;SSL_METHOD *meth;
&nbsp;&nbsp;&nbsp;&nbsp;int seed_int[100]; /*存放随机序列*/

&nbsp;&nbsp;&nbsp;&nbsp;WSADATA wsaData;

&nbsp;&nbsp;&nbsp;&nbsp;if(WSAStartup(MAKEWORD(2,2),&wsaData) != 0){
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf("WSAStartup()fail:%d\n",GetLastError());
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return -1;
&nbsp;&nbsp;&nbsp;&nbsp;}

&nbsp;&nbsp;&nbsp;&nbsp;OpenSSL_add_ssl_algorithms(); /*初始化*/

&nbsp;&nbsp;&nbsp;&nbsp;SSL_library_init();
&nbsp;&nbsp;&nbsp;&nbsp;SSL_load_error_strings(); /*为打印调试信息作准备*/

&nbsp;&nbsp;&nbsp;&nbsp;meth=SSLv23_method();
&nbsp;&nbsp;&nbsp;&nbsp;ctx = SSL_CTX_new (meth);
&nbsp;&nbsp;&nbsp;&nbsp;CHK_NULL(ctx);

&nbsp;&nbsp;&nbsp;&nbsp;SSL_CTX_set_default_passwd_cb_userdata(ctx, "password");

&nbsp;/*   if(!(SSL_CTX_use_certificate_chain_file(ctx, CERTF))){
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ERR_print_errors_fp(stderr);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;exit(-2);
&nbsp;&nbsp;&nbsp;&nbsp;}
&nbsp;&nbsp;&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;if(!(SSL_CTX_use_PrivateKey_file(ctx, CERTF,SSL_FILETYPE_PEM))){
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ERR_print_errors_fp(stderr);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;exit(-3);
&nbsp;&nbsp;&nbsp;&nbsp;}

&nbsp;&nbsp;&nbsp;&nbsp;/* Load the CAs we trust*/

&nbsp;/*   if(!(SSL_CTX_load_verify_locations(ctx, CACERT,0))){
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf("Load CA failed!\n");
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;exit(-4);
&nbsp;&nbsp;&nbsp;&nbsp;}
*/


&nbsp;&nbsp;&nbsp;&nbsp;/*构建随机数生成机制,WIN32平台必需*/
&nbsp;&nbsp;&nbsp;&nbsp;srand( (unsigned)time( NULL ) );
&nbsp;&nbsp;&nbsp;&nbsp;for( int i = 0; i < 100;i++ )
&nbsp;&nbsp;&nbsp;&nbsp;seed_int[i] = rand();
&nbsp;&nbsp;&nbsp;&nbsp;RAND_seed(seed_int, sizeof(seed_int));

&nbsp;&nbsp;&nbsp;&nbsp;/*以下是正常的TCP socket建立过程 .............................. */
&nbsp;&nbsp;&nbsp;&nbsp;printf("Begin tcp socket...\n");

&nbsp;&nbsp;&nbsp;&nbsp;sd = socket (AF_INET, SOCK_STREAM, 0); CHK_ERR(sd, "socket");

&nbsp;&nbsp;&nbsp;&nbsp;memset (&sa, '\0', sizeof(sa));
&nbsp;&nbsp;&nbsp;&nbsp;sa.sin_family = AF_INET;
&nbsp;&nbsp;&nbsp;&nbsp;sa.sin_addr.s_addr = inet_addr (SERVER_ADDR); /* Server IP */
&nbsp;&nbsp;&nbsp;&nbsp;sa.sin_port = htons (PORT); /* Server Port number */

&nbsp;&nbsp;&nbsp;&nbsp;err = connect(sd, (struct sockaddr*) &sa,
&nbsp;&nbsp;&nbsp;&nbsp;sizeof(sa));
&nbsp;&nbsp;&nbsp;&nbsp;CHK_ERR(err, "connect");


直接连接不了,gmail的IP
C:\Documents and Settings\Administrator>ping mail.google.com

Pinging googlemail.l.google.com [74.125.153.18] with 32 bytes of data:

Reply from 74.125.153.18: bytes=32 time=71ms TTL=48

论坛徽章:
0
10 [报告]
发表于 2009-10-14 14:17 |只看该作者
mail.google.com
这个地址不是gmail吧
pop.gmail.com你再试试
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP