C LIBSTROPHE中的TLS启动错误

C LIBSTROPHE中的TLS启动错误,c,ssl,xmpp,libstrophe,C,Ssl,Xmpp,Libstrophe,我想使用libstrophe库创建一个简单的聊天客户端。我写的代码如下。 与gmail服务器的连接已建立。但是我得到了一个TLS错误,我无法解决。 请找出导致错误的原因 #include <stdio.h> #include <string.h> #include <strophe.h> int handle_reply(xmpp_conn_t * const conn, xmpp_stanza_t * const stanza,void * const

我想使用libstrophe库创建一个简单的聊天客户端。我写的代码如下。 与gmail服务器的连接已建立。但是我得到了一个TLS错误,我无法解决。 请找出导致错误的原因

 #include <stdio.h>
#include <string.h>
#include <strophe.h>

int handle_reply(xmpp_conn_t * const conn, xmpp_stanza_t * const stanza,void * const userdata)
{
xmpp_stanza_t *query, *item;
char *type;
type = xmpp_stanza_get_type(stanza);
if (strcmp(type, "error") == 0)
    fprintf(stderr, "ERROR: query failed\n");
else {
    query = xmpp_stanza_get_child_by_name(stanza, "query");
    printf("Active Sessions:\n");
    for (item = xmpp_stanza_get_children(query); item; 
         item = xmpp_stanza_get_next(item))
        printf("\t %s\n", xmpp_stanza_get_attribute(item, "jid"));
    printf("END OF LIST\n");
}

/* disconnect */
xmpp_disconnect(conn);

return 0;
}

/* define a handler for connection events */
void conn_handler(xmpp_conn_t * const conn, const xmpp_conn_event_t status,
              const int error, xmpp_stream_error_t * const stream_error,
              void * const userdata)
{
xmpp_ctx_t *ctx = (xmpp_ctx_t *)userdata;
xmpp_stanza_t *iq, *query;
if (status == XMPP_CONN_CONNECT) 
{
    fprintf(stderr, "DEBUG: connected\n");
     /* create iq stanza for request */
    iq = xmpp_stanza_new(ctx);
    xmpp_stanza_set_name(iq, "iq");
    xmpp_stanza_set_type(iq, "get");
    xmpp_stanza_set_id(iq, "active1");
    xmpp_stanza_set_attribute(iq, "to", "xxxxxxxxx.com");

    query = xmpp_stanza_new(ctx);
    xmpp_stanza_set_name(query, "query");
    xmpp_stanza_set_ns(query, XMPP_NS_DISCO_ITEMS);
    xmpp_stanza_set_attribute(query, "node", "sessions");

    xmpp_stanza_add_child(iq, query);

    /* we can release the stanza since it belongs to iq now */
    xmpp_stanza_release(query);

    /* set up reply handler */
    xmpp_id_handler_add(conn, handle_reply, "active1", ctx);

    /* send out the stanza */
    xmpp_send(conn, iq);

    /* release the stanza */
    xmpp_stanza_release(iq);

}
else {
    fprintf(stderr, "DEBUG: disconnected\n");
    xmpp_stop(ctx);
}
}

int main(int argc, char **argv)
{
int a;
xmpp_ctx_t *ctx;
xmpp_conn_t *conn;
xmpp_log_t *log;
char *jid, *pass, *host;



jid = "ACCOUNTNAME@gmail.com";
pass = "MYPASSWORD";
host = NULL;


/* init library */
xmpp_initialize();

/* create a context */
log = xmpp_get_default_logger(XMPP_LEVEL_DEBUG); /* pass NULL instead to silence output */
ctx = xmpp_ctx_new(NULL, log);

/* create a connection */
conn = xmpp_conn_new(ctx);

/* setup authentication information */
xmpp_conn_set_jid(conn, jid);
xmpp_conn_set_pass(conn, pass);

/* initiate connection */
xmpp_connect_client(conn, host, 0, conn_handler, ctx);

/* enter the event loop -
   our connect handler will trigger an exit */
xmpp_run(ctx);

/* release our connection and context */
xmpp_conn_release(conn);
xmpp_ctx_free(ctx);

/* final shutdown of the library */
xmpp_shutdown();
scanf("%d",&a);
return 0;
}
#包括
#包括
#包括
int handle_reply(xmpp_conn_t*const conn,xmpp_stanza_t*const stanza,void*const userdata)
{
xmpp_节*查询,*项;
字符*类型;
类型=xmpp_节_获取_类型(节);
如果(strcmp(类型,“错误”)==0)
fprintf(stderr,“错误:查询失败\n”);
否则{
query=xmpp_stanza_get_child_by_name(节,“查询”);
printf(“活动会话:\n”);
for(item=xmpp\u节\u获取\u子项(查询);item;
项目=xmpp_节_获取_下一个(项目))
printf(“\t%s\n”,xmpp\u节\u get\u属性(项,“jid”);
printf(“列表结束\n”);
}
/*断开*/
xmpp_断开(连接);
返回0;
}
/*定义连接事件的处理程序*/
无效连接处理程序(xmpp\U连接*常量连接,常量xmpp\U连接事件状态,
常量整数错误,xmpp\u流\u错误\u t*常量流\u错误,
void*const用户数据)
{
xmpp_ctx_t*ctx=(xmpp_ctx_t*)用户数据;
xmpp_节*iq,*查询;
如果(状态==XMPP\U CONN\U CONNECT)
{
fprintf(stderr,“DEBUG:connected\n”);
/*为请求创建iq节*/
iq=xmpp_节_新(ctx);
xmpp节集名称(iq,“iq”);
xmpp节集类型(iq,“get”);
xmpp节集id(iq,“活动1”);
xmpp_节集_属性(iq,“to”,“xxxxxxxxx.com”);
query=xmpp_节_新(ctx);
xmpp_节_集_名称(查询,“查询”);
xmpp_节集(查询、xmpp_n s_DISCO_项);
xmpp_节_集_属性(查询,“节点”、“会话”);
xmpp_节_添加_子项(iq,查询);
/*我们现在可以发布该节,因为它属于iq*/
xmpp_节发布(查询);
/*设置回复处理程序*/
xmpp\u id\u handler\u add(conn,handle\u reply,“active1”,ctx);
/*发出诗节*/
xmpp_发送(连接,iq);
/*释放诗节*/
xmpp_节发布(iq);
}
否则{
fprintf(stderr,“调试:已断开连接\n”);
xmpp_U停止(ctx);
}
}
int main(int argc,字符**argv)
{
INTA;
xmpp_ctx_t*ctx;
xmpp_conn_t*conn;
xmpp_log_t*log;
char*jid,*pass,*host;
吉德=”ACCOUNTNAME@gmail.com";
pass=“MYPASSWORD”;
host=NULL;
/*初始化库*/
xmpp_初始化();
/*创建上下文*/
log=xmpp_get_default_logger(xmpp_LEVEL_DEBUG);/*将NULL传递给静音输出*/
ctx=xmpp\u ctx\u new(NULL,log);
/*创建连接*/
conn=xmpp_conn_new(ctx);
/*设置身份验证信息*/
xmpp_conn_set_jid(conn,jid);
xmpp_连接_设置_通过(连接,通过);
/*启动连接*/
xmpp_connect_客户端(连接,主机,0,连接处理程序,ctx);
/*进入事件循环-
我们的连接处理程序将触发退出*/
xmpp_运行(ctx);
/*释放我们的连接和上下文*/
xmpp\U连接释放(连接);
xmpp_ctx_free(ctx);
/*库的最终关闭*/
xmpp_shutdown();
scanf(“%d”和“&a”);
返回0;
}
cmd提示符(输出)为:

xmpp调试sock\u连接到alt3.xmpp.l.google.com:5222返回304
xmpp调试试图连接到alt3.xmpp.l.google.com
xmpp调试连接成功
已发送conn调试:
xmpp调试记录:
xmpp调试记录:<
机制>X-OAUTH2X-GOOGLE-TOKEN
TLSS调试QuerySecurityPackageInfo()成功
TLSS调试AcquireCredentialsHandle()成功
已发送连接调试,错误:0
xmpp调试记录:
已调用xmpp调试句柄proceedtls以继续
xmpp调试正在进行TLS
**TLSS调试QuerySecurityPackageInfo()成功
TLSS调试AcquireCredentialsHandle()成功
xmpp调试无法启动TLS!错误-2146893032
已发送conn调试:
xmpp调试分析错误,正在断开连接**
xmpp调试关闭套接字。
调试:断开连接
事件调试正在停止事件循环。
事件调试事件循环已完成。

需要检查的几件事;本地计算机的时钟是否正常运行?gmail使用的证书在你的证书存储中吗?是的,本地计算机的时钟运行正常。我检查了证书。是的,在不受信任的发布者下有一个到mail.google.com的条目。不受信任的发布者听起来像一个阻止列表。已经生成了无效的gmail证书,因此它可能是一个有效的块,但这可能意味着该证书将不会被使用。
xmpp DEBUG sock_connect to alt3.xmpp.l.google.com:5222 returned 304
xmpp DEBUG attempting to connect to alt3.xmpp.l.google.com
xmpp DEBUG connection successful
conn DEBUG SENT: <?xml version="1.0"?><stream:stream to="gmail.com" xml:lang="en
"   version="1.0" xmlns="jabber:client" xmlns:stream="http://etherx.jabber.org/streams">
xmpp DEBUG RECV: <stream:stream from='gmail.com' id='4EDF7B71A4D88935' version='
1.0' xmlns:stream='http://etherx.jabber.org/streams' xmlns='jabber:client'>
xmpp DEBUG RECV: <stream:features><starttls xmlns="urn:ietf:params:xml:ns:xmpp-t
ls"><required/></starttls><mechanisms xmlns="urn:ietf:params:xml:ns:xmpp-sasl"><
mechanism>X-OAUTH2</mechanism><mechanism>X-GOOGLE-TOKEN</mechanism></mechanisms>
</stream:features>
TLSS DEBUG QuerySecurityPackageInfo() success
TLSS DEBUG AcquireCredentialsHandle() success
conn DEBUG SENT: <starttls xmlns="urn:ietf:params:xml:ns:xmpp-tls"/>, error: 0
xmpp DEBUG RECV: <proceed xmlns="urn:ietf:params:xml:ns:xmpp-tls"/>
xmpp DEBUG handle proceedtls called for proceed
xmpp DEBUG proceeding with TLS
**TLSS DEBUG QuerySecurityPackageInfo() success
TLSS DEBUG AcquireCredentialsHandle() success
xmpp DEBUG Couldn't start TLS! error -2146893032
conn DEBUG SENT: </stream:stream>
xmpp DEBUG parse error, disconnecting**
xmpp DEBUG Closing socket.
DEBUG: disconnected
event DEBUG Stopping event loop.
event DEBUG Event loop completed.