如何在C或C++中的OpenSSL上实现服务器名称指示(SNI)?
有没有现实世界的例子?
我的目标是允许 ssl 客户端从服务器的许多有效证书对中进行选择。客户端有一个 CA 证书,它将用来验证来自服务器的证书。
因此,为了尝试实现这一点,我ssl.SSLContext.set_servername_callback()将服务器上的 与ssl.SSLSocket.wrap_socket's parameter:server_hostname`结合使用,以尝试允许客户端指定要使用的密钥对。代码如下所示:
服务器代码:
import sys
import pickle
import ssl
import socket
import select
request = {'msgtype': 0, 'value': 'Ping', 'test': [chr(i) for i in range(256)]}
response = {'msgtype': 1, 'value': 'Pong'}
def handle_client(c, a):
print("Connection from {}:{}".format(*a))
req_raw = c.recv(10000)
req = pickle.loads(req_raw)
print("Received message: {}".format(req))
res = pickle.dumps(response)
print("Sending message: {}".format(response))
c.send(res)
def run_server(hostname, port):
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
s.bind((hostname, port))
s.listen(8)
print("Serving on {}:{}".format(hostname, port)) …Run Code Online (Sandbox Code Playgroud) 我正在编写一个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);
}
Run Code Online (Sandbox Code Playgroud) 我有一个Linux进程需要充当SSL服务器(接受和服务来自其他客户端的连接),但也需要 - 在同一个进程中 - 启动与其他SSL服务器的客户端会话.
我打算使用两个SSL_CTX_new()函数调用创建两个单独的SSL_CTX句柄,一个调用服务器方法,另一个调用客户端方法.是否支持在单个进程中双重使用OpenSSL?我希望OpenSSL使用SSL_CTX句柄 - 并且不依赖于全局或静态局部变量 - 来创建和服务新会话可能需要的所有上下文信息.这是一个很好的假设吗?