2013-01-24 32 views
1

我喜歡在當前項目中使用srp。但即時通訊有點不知所措,我將如何與openssl實施。我得到了客戶端運行,但我不知道如何編寫服務器端。我也找不到任何使用的文檔或示例實現。我想要的是將登錄信息存儲在數據庫中,然後在需要時檢索該數據。我使用poco的大部分網絡部分,所以寫客戶端是相當容易的,我成功地對其他服務器進行了測試。所以我會對如何實現服務器端提示有幫助。Openssl tls srp

回答

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參數傳遞給你的回調,這樣你可以參考一個空指針來自回調的應用程序中的任何必需的應用程序上下文。

設置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 
}