无法通过openssl发送客户端证书

时间:2015-10-07 11:22:19

标签: ssl openssl ssl-certificate tls1.2

我正在尝试通过TLS实现MSRP,这要求我对msrp端口进行TLS握手,即2855.在握手时,服务器正在按预期请求客户端证书。在客户端,我已经生成了证书和私钥,但是我无法发送证书。我正在使用Doubango堆栈与openssl进行通信。

SSL_CTX_use_certificate_file(contexts [i],transport-> tls.ca,SSL_FILETYPE_PEM)”是我尝试设置证书的方法。我认为它设置得当,因为它不会引发任何错误。但是,无论我做什么,证书都不会发送到服务器。 证书长度始终为0.

任何人都可以帮我解决这个问题吗?这些是我遵循生成客户端证书的步骤。 https://gist.github.com/mtigas/952344

我设置证书的代码是这样的:

#if HAVE_OPENSSL
    {
        int32_t i, ret;
        SSL_CTX* contexts[3] = { tsk_null };

        if(transport->tls.enabled){
            contexts[0] = transport->tls.ctx_client;
            contexts[1] = transport->tls.ctx_server;
        }

        TSK_DEBUG_INFO("ca = %s, pbk = %s, pvk = %s", ca, pbk, pvk);
        for(i = 0; i < sizeof(contexts)/sizeof(contexts[0]); ++i){
            if(!contexts[i]){
                continue;
            }
            SSL_CTX_set_verify(contexts[i], transport->tls.verify ? (SSL_VERIFY_PEER | SSL_VERIFY_FAIL_IF_NO_PEER_CERT) : SSL_VERIFY_NONE, tsk_null);
            TSK_DEBUG_INFO("tls.verify :%d",  transport->tls.verify);
            if(!tsk_strnullORempty(transport->tls.pbk) || !tsk_strnullORempty(transport->tls.pvk) || !tsk_strnullORempty(transport->tls.ca)){
                /* Sets Public key (cert) */
                if((ret = SSL_CTX_use_certificate_file(contexts[i], transport->tls.ca, SSL_FILETYPE_PEM)) != 1) {
                    TSK_DEBUG_ERROR("SSL_CTX_use_certificate_file failed [%d,%s]", ret, ERR_error_string(ERR_get_error(), tsk_null));
                    return -3;
                }
                /*Sets the password of the private key*/
                if(!tsk_strnullORempty(ssl_password)){
                    SSL_CTX_set_default_passwd_cb_userdata(contexts[i], (void*)ssl_password);
                }

                /* Sets Private key (cert) */
                if (!tsk_strnullORempty(transport->tls.pvk) && (ret = SSL_CTX_use_PrivateKey_file(contexts[i], transport->tls.pvk, SSL_FILETYPE_PEM)) != 1) {
                    TSK_DEBUG_ERROR("SSL_CTX_use_PrivateKey_file failed [%d,%s]", ret, ERR_error_string(ERR_get_error(), tsk_null));
                    return -4;
                }
                /* Checks private key */
                if(!tsk_strnullORempty(transport->tls.pvk) && SSL_CTX_check_private_key(contexts[i]) == 0) {
                    TSK_DEBUG_ERROR("SSL_CTX_check_private_key failed [%d,%s]", ret, ERR_error_string(ERR_get_error(), tsk_null));
                    return -5;
                }
                /* Sets trusted CAs and CA file */
                if(!tsk_strnullORempty(transport->tls.ca) && (ret = SSL_CTX_load_verify_locations(contexts[i], transport->tls.ca, /*tlsdir_cas*/tsk_null)) != 1) {
                   TSK_DEBUG_ERROR("SSL_CTX_load_verify_locations failed [%d, %s]", ret, ERR_error_string(ERR_get_error(), tsk_null));
                   return -5;
                }
            }
        }
    }
#endif /* HAVE_OPENSSL */

由于我没有收到任何这些错误,我假设证书已正确设置。但是当服务器请求证书时,客户端无法发送它。即证书长度= 0。 如果抛出任何错误,有没有办法窥视openssl?我在哪里可以获得openssl日志。 ? 请帮助或我的叶子不会得到批准:(

1 个答案:

答案 0 :(得分:0)

我认为您应该检查Crtificate Request消息中的证书类型。如果您的客户端证书加密不匹配,则客户端可能无法发送证书。