ssl - OpenSSL TLS SRP

标签 ssl openssl single-responsibility-principle

我想在我当前的项目中使用 srp。但我有点不知道如何用 openssl 来实现它。我让客户端运行,但我不知道如何编写服务器端。我也找不到任何文档或使用示例实现。我想要的是将登录信息存储在数据库中,然后在需要时检索该数据。我在大部分网络部分使用 poco,因此编写客户端相当容易,并且我成功地针对其他服务器对其进行了测试。因此,我将不胜感激有关如何实现服务器端的提示。

最佳答案

OpenSSL 存档中的文件 ssl/ssltest.c 中有一个如何执行此操作的示例。

在较高级别上,您注册一个身份验证回调。在 SSL_Accept() 期间会根据需要自动调用此回调来验证您的用户。

来自 ssltest.c 的示例回调如下所示:

static int MS_CALLBACK ssl_srp_server_param_cb(SSL *s, int *ad, void *arg)
    {
    SRP_SERVER_ARG * p = (SRP_SERVER_ARG *) arg;

    if (strcmp(p->expected_user, SSL_get_srp_username(s)) != 0)
        {
        fprintf(stderr, "User %s doesn't exist\n", SSL_get_srp_username(s));
        return SSL3_AL_FATAL;
        }
    if (SSL_set_srp_server_param_pw(s,p->expected_user,p->pass,NULL)<0)
        {
        *ad = SSL_AD_INTERNAL_ERROR;
        return SSL3_AL_FATAL;
        }
    return SSL_ERROR_NONE;
    }

要注册,请调用

SSL_CTX_set_srp_username_callback(s_ctx, ssl_srp_server_param_cb);

回调函数的 arg 参数是传递给回调的 void 指针,以便您可以从回调引用应用程序中任何必要的应用程序上下文。

要设置arg参数,请调用SSL_CTX_set_srp_cb_arg(s_ctx, mypointer);

真的就是这么简单。确保 SRP 密码包含在您的密码列表中。

有一种方法可以获取身份验证失败的反馈,可用于实现针对高速率在线词典攻击的对策。

为此,请调用 SSL_CTX_set_info_callback(s_ctx,mynotifycallback) 来注册您的回调。已成功使用以下条件过滤不相关的通知。

void mynotifycallback(const SSL *s, int reason, int ret)
{
if (reason & SSL_CB_ALERT && ret & SSL3_AD_BAD_RECORD_MAC && SSL_get_srp_username((SSL *)s))
// authentication failure
}

关于ssl - OpenSSL TLS SRP,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14512344/

相关文章:

javax.net.ssl.SSLHandshakeException : null cert chain null cert chain

docker - Docker 上的 Vault TLS - 无法验证 127.0.0.1 的证书,因为它不包含任何 IP SAN

java - tomcat SSL请求参数丢失

c++ - SSL是否执行自动重新协商

separation-of-concerns - 单一责任原则与关注点分离的区别

c++ - 内存处理是否违反单一职责原则?

web-services - 仅将流量限制为页面的 SSL 版本

c - 使用 C 中的 openssl 库进行简单的 AES 加密解密

c# - SSCrypto/OpenSSL 到 C# 加密

c# - 在 C# 中,_where_ 克隆对象有哪些经验法则?