c语言从client hello提取SNI
时间: 2023-08-16 08:05:50 浏览: 244
在C语言中,可以使用OpenSSL库来提取TLS握手消息中的SNI。以下是一个简单的示例代码:
```c
#include <openssl/ssl.h>
#include <openssl/err.h>
int main() {
SSL_library_init();
SSL_CTX *ctx = SSL_CTX_new(TLS_client_method());
SSL *ssl = SSL_new(ctx);
int sockfd = socket(AF_INET, SOCK_STREAM, 0);
struct sockaddr_in servaddr;
bzero(&servaddr, sizeof(servaddr));
servaddr.sin_family = AF_INET;
servaddr.sin_port = htons(443);
inet_pton(AF_INET, "www.example.com", &servaddr.sin_addr);
connect(sockfd, (struct sockaddr *)&servaddr, sizeof(servaddr));
SSL_set_fd(ssl, sockfd);
SSL_connect(ssl);
const char *sni = SSL_get_servername(ssl, TLSEXT_NAMETYPE_host_name);
printf("Server Name Indication (SNI): %s\n", sni);
SSL_shutdown(ssl);
SSL_free(ssl);
SSL_CTX_free(ctx);
close(sockfd);
return 0;
}
```
在上面的代码中,我们使用OpenSSL库创建一个TLS客户端上下文,并建立一个与服务器的TCP连接。然后,我们将SSL对象与套接字关联,并执行SSL握手。最后,我们使用SSL_get_servername函数提取SNI,并打印输出。请注意,此代码仅适用于TLS 1.0及更高版本。在早期版本中,SNI是不受支持的。
阅读全文