我在 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 通信过程的一部分发生的。我遗漏的证书检查是否会影响我的应用程序在加密方面的安全性?
最佳答案
您的数据仍在加密——但问题是,加密给谁?
证书检查过程是我们验证对方是否是他们声称的人的地方。当有人订购 SSL 证书时,分发证书的公司将采取措施确保他们将证书和 key 提供给所订购的域(或其他实体)的合法所有者。然后,该公司将使用他们自己的详细信息签署证书,而这些详细信息又由您的计算机已经信任的公司签署。
当您建立连接时,您的计算机会检查链接以确保证书是合法的,即它是由您的计算机信任的人签署的(可能是间接通过多层信任)。
跳过此过程意味着任何人都可以在自己的计算机上为任何给定网站生成证书。假设他们随后可以劫持您建立的连接,他们可以让您的系统轻松地相信它是知名公司。
您需要检查证书以确保安全。
关于c - 在不检查证书的情况下使用 OpenSSL,但我的数据是否仍在加密?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11612473/