我正在编写一个https服务器,我需要在使用SNI的ssl_accept()之前从客户端获取主机名。我正在使用SSL_CTX_set_tlsext_servername_callback()接收主机名,但根本没有调用回调。这是我的代码的一部分
// Server Name Indication callback from OpenSSL
static int serverNameCallback(SSL *ssl, int *ad, void *arg) 
{
    if (ssl == NULL)
        return SSL_TLSEXT_ERR_NOACK;
    const char* servername = SSL_get_servername(ssl, TLSEXT_NAMETYPE_host_name);
    printf("ServerName: %s\n", servername);
}
int main()
{
    //some code 
    const SSL_METHOD *method;
    SSL_CTX *ctx;
    method = SSLv3_server_method();  
    ctx = SSL_CTX_new(method);   
    if ( ctx == NULL )
    { 
        printf("SSL_ctx_new() error\n");
    }
    int ret = SSL_CTX_set_tlsext_servername_callback(ctx, serverNameCallback);
}
我正在编写一个https服务器,我需要在使用SNI的ssl_accept()之前从客户端获取主机名。
你不打SSL_CTX_set_tlsext_servername_callback。OpenSSL库将在握手期间为您调用它。
SSLv2和SSLv3客户端不会调用您的SNI回调。这是因为SNI是TLS扩展。
如果客户端是Windows XP(或未使用TLS扩展名的类似客户端),则将调用SNI回调,但servername将为NULL。在这种情况下,您应该使用默认服务器上下文。
如果客户端使用TLS并发送服务器名称,则将调用SNI回调。在回调中,您应该(1)确定默认证书和上下文是否正确。如果可以,请返回SSL_TLSEXT_ERR_OK。(2)如果可以提供更合适的证书,则用于SSL_set_SSL_CTX在新上下文中交换并返回SSL_TLSEXT_ERR_OK。
如果遇到错误(如NULL servername),则应返回SSL_TLSEXT_ERR_NOACK。您还可以返回其他两个错误代码。两者都对连接至关重要,IIRC。
使用SNI在一个盒子中服务多个域中提供了回调的实现细节。
| 归档时间: | 
 | 
| 查看次数: | 2472 次 | 
| 最近记录: |