Openssl tls srp

时间:2013-01-24 22:53:15

标签: ssl openssl single-responsibility-principle

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

1 个答案:

答案 0 :(得分:1)

在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
}