首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >SSL_get_peer_certificate(ssl)返回NULL?

SSL_get_peer_certificate(ssl)返回NULL?
EN

Stack Overflow用户
提问于 2016-12-08 13:40:05
回答 1查看 4.3K关注 0票数 2

我是初学者。我在使用SSL时有问题。我在网上找到了一个c码。在服务器代码中,具有以下功能:

代码语言:javascript
复制
void ShowCerts(SSL* ssl)
{   X509 *cert;
    char *line;

    cert = SSL_get_peer_certificate(ssl); /* Get certificates (if available) */
    if ( cert != NULL )
    {
        printf("Server certificates:\n");
        line = X509_NAME_oneline(X509_get_subject_name(cert), 0, 0);
        printf("Subject: %s\n", line);
        free(line);
        line = X509_NAME_oneline(X509_get_issuer_name(cert), 0, 0);
        printf("Issuer: %s\n", line);
        free(line);
        X509_free(cert);
    }
    else
        printf("No certificates.\n");
}

当我使用命令: openssl req -x509 -nodes -days 365 -newkey rsa:1024 -keyout mycert.pem -out mycert.pem并运行./sslserver.o 443,然后运行./client localhost 443。服务器错误:“没有证书。”。我认为SSL_get_peer_certificate(ssl)返回null的原因,但我不知道如何修复它。你能帮上忙吗?完整代码:http://simplestcodings.blogspot.com/2010/08/secure-server-client-using-openssl-in-c.html

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-12-08 14:42:41

只有当客户端发送证书时,SSL_get_peer_certificates才返回服务器端的证书。但是,您所引用的代码并不请求客户端证书,这意味着客户端不会发送证书。要请求客户端证书,服务器将需要使用验证并将模式设置为至少SSL_VERIFY_PEER,即至少需要这样做:

代码语言:javascript
复制
SSL_CTX_set_verify(ctx, SSL_VERIFY_PEER, NULL);

但这将只请求一个可选的客户端证书。它不会导致对它的验证。请注意,您使用的代码示例在这方面仍然失败,因为它不执行任何类型的证书验证。这意味着它对中间攻击中的琐碎人员是开放的,也就是说,在使用SSL时不提供您期望的安全性。因此,我建议不要将此代码用作如何编写安全SSL客户端和服务器的示例。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/41040900

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档