我在Linux上使用OpenSSL编写了一个SOAP客户端。我基本上从OpenSSL网站和其他在线资源收集了一些信息,以下代码总结了我如何将XML发送到SOAP服务器。
SSL_library_init();
SSL_load_error_strings();
ERR_load_BIO_strings();
OpenSSL_add_all_algorithms();
SSL_CTX* ctx = SSL_CTX_new(SSLv23_client_method());
SSL* ssl;
BIO* bio = BIO_new_ssl_connect(ctx);
if (bio == NULL) {
SSL_CTX_free(ctx);
return false;
}
BIO_get_ssl(bio, &ssl);
SSL_set_mode(ssl, SSL_MODE_AUTO_RETRY);
char target[] = "api.betfair.com:https";
BIO_set_conn_hostname(bio, target);
BIO_set_nbio(bio,1);
while (1) {
if (BIO_do_connect(bio) <= 0) {
if (!BIO_should_retry(bio)) {
cout << "Connect failed." << endl;
BIO_free_all(bio);
SSL_CTX_free(ctx);
return false;
}
} else {
break;
}
}
KeepAliveReq KeepAliveReq(sessionTok,0,iMode);
string strMessage = KeepAliveReq.GetXML(false);
BIO_puts(bio,strMessage.c_str());
这种方法运作良好,并且可靠(如果有些慢)可持续数周。我故意省略了SSL握手过程的证书检查阶段,因为当时我并不真正理解它的细节,而我发送给的服务器是一家知名公司。我的问题是,我可以假设我的数据是否被SSL代码加密?据我所知,我的代码中没有明确要求加密,我假设这只是作为SSL通信过程的一部分而发生的。我的遗漏证书检查是否损害了我的应用程序在加密方面的安全性?
答案 0 :(得分:4)
您的数据仍在加密 - 但问题是,对谁?
证书检查过程是我们验证对方是否是他们声称的人。当有人订购SSL证书时,分发证书的公司将采取措施确保他们将证书和密钥提供给其订购域名(或其他实体)的合法所有者。然后,该公司将使用他们自己的详细信息签署证书,而这些详细信息又由您的计算机已经信任的公司签署。
当您建立连接时,您的计算机会检查链接以确保证书是合法的,即它已由您的计算机信任的人签名(可能通过多层信任间接签署)。
跳过此过程意味着任何人都可以在自己的计算机上为任何给定的网站生成证书。假设他们可以劫持你所建立的联系,他们可以让你的系统轻松地相信它是知名公司。
您需要检查证书是否安全。