openssl二进制数据获取SNI
时间: 2023-08-02 20:14:01 浏览: 202
要获取 SNI(Server Name Indication)信息,您可以使用 OpenSSL 库中的 SSL_get_servername() 函数。该函数接受一个 SSL 连接对象作为参数,并返回连接中的 SNI 信息。
以下是一个示例代码片段,演示如何使用 SSL_get_servername() 函数获取 SNI 信息:
```
#include <openssl/ssl.h>
// ...
SSL *ssl;
const char *sni;
// ...
// Get the SNI information from the SSL connection
sni = SSL_get_servername(ssl, TLSEXT_NAMETYPE_host_name);
// Use the SNI information as needed
if (sni != NULL) {
printf("Received SNI: %s\n", sni);
} else {
printf("No SNI received.\n");
}
```
请注意,您需要在编译时链接 OpenSSL 库。
相关问题
c语言实现从二进制client hello中提取SNI
在TLS握手过程中,客户端Hello消息中的扩展字段可以包含SNI信息。SNI(Server Name Indication)是一个TLS扩展,用于指示客户端正在尝试连接的服务器的主机名。
在C语言中,可以使用OpenSSL库来解析TLS消息并提取SNI信息。以下是一个示例代码:
```
#include <openssl/ssl.h>
#include <openssl/bio.h>
void extract_sni_from_client_hello(unsigned char *data, size_t datalen) {
SSL *ssl;
BIO *bio;
// Create a new SSL context and set it up for the client hello data
SSL_CTX *ctx = SSL_CTX_new(TLS_client_method());
bio = BIO_new(BIO_s_mem());
BIO_write(bio, data, datalen);
ssl = SSL_new(ctx);
SSL_set_bio(ssl, bio, bio);
// Extract the SNI from the SSL object
const char *servername = SSL_get_servername(ssl, TLSEXT_NAMETYPE_host_name);
// Print out the SNI if it exists
if (servername != NULL) {
printf("SNI: %s\n", servername);
}
// Clean up
SSL_free(ssl);
SSL_CTX_free(ctx);
}
```
在此示例中,我们使用OpenSSL库创建了一个新的SSL上下文,并将其设置为客户端Hello数据。然后,我们使用SSL_get_servername函数从SSL对象中提取SNI信息,并将其打印出来。最后,我们清理所有分配的内存。
要使用此函数,您需要包含OpenSSL头文件并链接到OpenSSL库。您还需要将客户端Hello数据作为参数传递给此函数。
openssl ecc 算法签二进制文件
OpenSSL是一个广泛使用的开源加密工具包,其中包含椭圆曲线密码学(ECC)算法,用于创建安全的数字签名。ECC相比于传统的RSA算法,密钥更小、计算速度更快,适合对安全性有较高需求但资源受限的情况。
如果你想用OpenSSL的ECC算法来签署二进制文件,你可以按照以下步骤操作:
1. **生成私钥**:首先,使用`openssl ecparam -genkey -name prime256v1`生成一对ECC私钥和公钥。私钥应妥善保管,而公钥可以公开分享。
2. **加载私钥**:需要签署数据前,使用`openssl ec -in private_key.pem -inform PEM -outform DER > signing_key.der`将私钥转换为DER(二进制)形式,便于后续签名。
3. **读取二进制文件**:打开你要签署的二进制文件,并将其内容读入内存。
4. **创建哈希**:为了签名,你需要先将二进制数据哈希,OpenSSL提供`openssl dgst -sha256 -binary`生成SHA-256哈希值。
5. **签署哈希**:使用命令`openssl pkeyutl -sign -in hash.bin -key private_key.der -out signature.bin`生成数字签名,这里的`hash.bin`是上一步得到的哈希值。
6. **验证签名**:在接收方那里,他们可以用相同的ECC公钥和签名来验证原始数据是否被正确签名,使用`openssl dgst -sha256 -verify public_key.pem -signature signature.bin hash.bin`进行检查。
阅读全文