【问题标题】:Not able to send client certificate over openssl无法通过 openssl 发送客户端证书
【发布时间】:2015-10-07 11:22:19
【问题描述】:

我正在尝试通过 TLS 实现 MSRP,这需要我对 msrp 端口(即 2855)进行 TLS 握手。在握手时,服务器正在按预期请求客户端证书。在客户端,我已经生成了证书和私钥,但是我无法发送证书。我正在使用 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 日志。 ? 请帮忙,否则我的叶子不会被批准:(

【问题讨论】:

  • 证书或其签名证书之一必须由CertificateRequest 消息中指定的签名者之一签名。如果您的证书不符合要求,则不会发送。
  • 你是指certificateRequest消息中的CA吗?我在来自服务器的 certificateRequest 中得到 Distinguished Names Length: 0 。你认为这是问题吗??
  • 这个问题与 Stack Overflow 无关,因为它与编程无关。
  • @Scooby - 正如 EJP 所说,是的。服务器需要公布它接受/用于客户端证书颁发机构的 DN。这会触发客户端发送证书。为了让服务器发送适当的消息,我相信它应该调用SSL_CTX_use_certificate。另外,将您的相关代码与问题放在一起;如果可能,不要在 GitHub 上。
  • 我已经修改了我的问题,包括相关代码。我已经使用一组有效的证书进行了验证,但仍然没有看到积极的结果。

标签: ssl openssl ssl-certificate tls1.2


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 2016-06-17
    • 1970-01-01
    • 2013-06-06
    • 2017-02-03
    • 2016-01-27
    • 1970-01-01
    • 2013-06-16
    • 2011-04-22
    • 1970-01-01
    相关资源
    最近更新 更多