【发布时间】: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