我通过HTTP从服务器下载RSS提要文件(例如https://tools.ietf.org/dailydose/dailydose_atom.xml)。
首先,我必须按照here所述通过OpenSSL连接到远程服务器。
不安全的版本可以正常工作,我可以通过提要连接并接收HTTP答复:
bio = BIO_new_connect("www.tools.ietf.org:80");
if(bio == NULL)
{
/* Handle the failure */
}
if(BIO_do_connect(bio) <= 0)
{
/* Handle failed connection */
}
安全版本:
BIO * m_bio;
SSL_CTX * m_ctx;
SSL * m_ssl;
SSL_library_init();
m_ctx = SSL_CTX_new(SSLv23_client_method());
SSL_load_error_strings();
ERR_load_BIO_strings();
OpenSSL_add_all_algorithms();
SSL_CTX_set_default_verify_paths(m_ctx);
m_bio = BIO_new_ssl_connect(m_ctx);
BIO_get_ssl(m_bio, &m_ssl);
SSL_set_mode(m_ssl, SSL_MODE_AUTO_RETRY);
BIO_set_conn_hostname(m_bio, "www.tools.ietf.org:80");
if (BIO_do_connect(m_bio) <= 0)
{
printf("Error: %s\n", ERR_reason_error_string(ERR_get_error()));
throw std::runtime_error("FEEDREADER: Connection failed.");
}
if(SSL_get_verify_result(m_ssl) != X509_V_OK)
{
throw std::runtime_error("FEEDREADER: Verification failed.");
}
do_connect
失败并出现以下错误:
错误:未知协议
当我将www.tools.ietf.org
替换为http(s)://www.tools.ietf.org
时
出现另一个错误:
错误:错误的主机名查找
但是主机名和dns在不安全的版本上很好用,所以有人可以帮助我吗?
答案 0 :(得分:1)
80是默认的HTTP端口。默认的HTTPS端口是443。
bio = BIO_new_connect("www.tools.ietf.org:443");
BIO_set_conn_hostname(m_bio, "www.tools.ietf.org:443");