Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/188.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Openssl BIO_do_连接失败,返回负值_Openssl_Ubuntu 12.04 - Fatal编程技术网

Openssl BIO_do_连接失败,返回负值

Openssl BIO_do_连接失败,返回负值,openssl,ubuntu-12.04,Openssl,Ubuntu 12.04,我正在尝试并使用C语言中的OpenSSL(在ubuntu 12.04上)。 举一个例子 在返回负值的BIO_do_connect()之前,一切都很顺利。 可能我调用这两个API时出错了,因为bio被传递给bio_do_connect() 将欣赏在这两个函数的第二参数中使用的格式的示例 BIO_set_conn_ip(bio, &ip); BIO_set_conn_int_port(bio, &port); 如前所述,两个函数总是返回1(正确、错误或任何东西),这确实令人不舒服

我正在尝试并使用C语言中的OpenSSL(在ubuntu 12.04上)。 举一个例子

在返回负值的BIO_do_connect()之前,一切都很顺利。 可能我调用这两个API时出错了,因为bio被传递给bio_do_connect()

将欣赏在这两个函数的第二参数中使用的格式的示例

BIO_set_conn_ip(bio, &ip);
BIO_set_conn_int_port(bio, &port);
如前所述,两个函数总是返回1(正确、错误或任何东西),这确实令人不舒服

以下是完整的代码:

int main(void) {
    BIO * bio;
    SSL * ssl;
    SSL_CTX * ctx;

    int p;
    char ip[4];
    int port = 60054;

    /* considered big-endian */
    ip[0] = 0b11000000;
    ip[1] = 0b10100100;
    ip[2] =        0b1;
    ip[3] =        0b1110100;

    char * request =
                    "request";
    char r[1024];

    SSL_library_init();

    /* Set up the library */

    ERR_load_BIO_strings();
    SSL_load_error_strings();
    OpenSSL_add_all_algorithms();

    /* Set up the SSL context */

    ctx = SSL_CTX_new(SSLv23_client_method());

    /* Load the trust store */

    if (!SSL_CTX_load_verify_locations(ctx, "cert.pem", NULL)) {
            fprintf(stderr, "Error loading trust store\n");
            ERR_print_errors_fp(stderr);
            SSL_CTX_free(ctx);
            return 0;
    }

    /* Setup the connection */

    bio = BIO_new_ssl_connect(ctx);

    /* Set the SSL_MODE_AUTO_RETRY flag */

    BIO_get_ssl(bio, &ssl);
    SSL_set_mode(ssl, SSL_MODE_AUTO_RETRY);

    /* Create and setup the connection */

    BIO_set_conn_ip(bio, &ip);
    BIO_set_conn_port(bio, &port);

    int ret = BIO_do_connect(bio);
    if (ret <= 0) {
            fprintf(stderr, "Error attempting to connect\n");
            ERR_print_errors_fp(stderr);
            BIO_free_all(bio);
            SSL_CTX_free(ctx);
            return 0;
    }

    /* Check the certificate */

    if (SSL_get_verify_result(ssl) != X509_V_OK) {
            fprintf(stderr, "Certificate verification error: %i\n",
                            SSL_get_verify_result(ssl));
            BIO_free_all(bio);
            SSL_CTX_free(ctx);
            return 0;
    }

    /* Send the request */

    BIO_write(bio, request, strlen(request));

    /* Read in the response */

    for (;;) {
            p = BIO_read(bio, r, 1023);
            if (p <= 0)
                    break;
            r[p] = 0;
            printf("%s", r);
    }

    /* Close the connection and free the context */

    BIO_free_all(bio);
    SSL_CTX_free(ctx);
    return 0;
}
我得到了如下结果(当然有一些合理的结果而不是+++):

BIO_set_conn_ip()使用二进制形式将ip地址设置为ip,即以big-endian形式指定ip地址的四个字节。您正在尝试以little endian形式编写IP。更改字节的顺序,如下所示:

ip[3] = 0b11000000;
ip[2] = 0b10100100;
ip[1] = 0b1;
ip[0] = 0b1110100;

此外,您试图设置的IP为192.164.1.116,如果您选择192.168.1.116,则可能会出错(请注意168164部分)。

谢谢,但在进行此更改后,我也会得到相同的错误是的,可以访问,我会考虑到大端井编辑我的问题,
ERR\u print\u errors\u fp
的输出是什么?还是让我们猜一下?因为您没有使用
veefify\u回调
BIO\u do\u connect
将无法验证证书。因此,您不需要调用
SSL\u get\u verify\u result
。但是您确实需要验证证书是否与
SSL\u get\u peer\u证书一起存在(匿名协议不会使用服务器证书);您确实需要执行主机名匹配(1.0.2之前的OpenSSL没有执行主机名匹配)。请参见OpenSSL wiki。如何读取ERR\u print\u errors\u fp的错误?您正在使用
ERR\u print\u errors\u fp
将错误打印到
stderr
。它在控制台输出中。您有新的错误吗?下一步请尝试
openssl s_客户端-连接192.164.1.116:60054-调试
。该端口可能没有SSL/TLS服务器。或者服务器可能被防火墙阻止(如果存在服务器,通常是“超时”错误)。
+++++
------
CONNECTED(00000003)
write to 0x9494140 [0x9494418] (225 bytes => 225 (0xE1))
0000 ++++++
---
Certificate chain
 0 ++++++
---
Server certificate
-----BEGIN CERTIFICATE-----
MI++++++
-----END CERTIFICATE-----
subject=/C++++++
---
No client certificate CA names sent
---
SSL handshake has read 931 bytes and written 210 bytes
---
New, TLSv1/SSLv3, Cipher is AES256-SHA
Server public key is 1024 bit
Secure Renegotiation IS NOT supported
Compression: NONE
Expansion: NONE
SSL-Session:
    Protocol  : TLSv1
    Cipher    : AES256-SHA
    Session-ID: DF77194+++
    Session-ID-ctx: 
    Master-Key: 11D6++++
    Key-Arg   : None
    PSK identity: None
    PSK identity hint: None
    SRP username: None
    Start Time: 1394815215
    Timeout   : 300 (sec)
    Verify return code: 18 (self signed certificate)
ip[3] = 0b11000000;
ip[2] = 0b10100100;
ip[1] = 0b1;
ip[0] = 0b1110100;