openssl TLS 单向认证

下面是一个简单的 C 语言程序示例,它展示了如何使用 OpenSSL 来实现基于 TLS 的加密 TCP 通信。这个程序包括一个服务器和一个客户端,它们通过 TLS 加密的 TCP 连接进行通信。

步骤概览
初始化 OpenSSL 库。
创建 SSL 上下文(SSL_CTX)。
在服务器端,加载服务器证书和私钥;在客户端,加载 CA 证书。
使用 SSL 套接字进行加密通信。
服务器端代码
c
复制代码
#include <openssl/ssl.h>
#include <openssl/err.h>
#include <stdio.h>
#include <string.h>
#include <unistd.h>
#include <arpa/inet.h>

#define PORT 4444
#define CERT_FILE “server.crt”
#define KEY_FILE “server.key”

void handle_client(SSL *ssl) {
char buf[1024];
int bytes;

// 接收数据
bytes = SSL_read(ssl, buf, sizeof(buf));
if (bytes > 0) {
    buf[bytes] = 0;
    printf("Client message: %s\n", buf);
    
    // 发送数据
    SSL_write(ssl, "Hello from server", strlen("Hello from server"));
} else {
    ERR_print_errors_fp(stderr);
}

// 关闭 SSL 连接
SSL_shutdown(ssl);
SSL_free(ssl);

}

int main() {
SSL_CTX *ctx;
SSL *ssl;
int server_fd, client_fd;
struct sockaddr_in addr;

// 初始化 OpenSSL
SSL_load_error_strings();
OpenSSL_add_ssl_algorithms();

// 创建 SSL 上下文
ctx = SSL_CTX_new(TLS_server_method());
if (!ctx) {
    perror("Unable to create SSL context");
    ERR_print_errors_fp(stderr);
    exit(EXIT_FAILURE);
}

// 加载服务器证书和私钥
if (SSL_CTX_use_certificate_file(ctx, CERT_FILE, SSL_FILETYPE_PEM) <= 0) {
    ERR_print_errors_fp(stderr);
    exit(EXIT_FAILU
### TLS单向认证的概念 TLS单向认证是指在建立安全连接的过程中,只有服务器提供并验证其身份证书给客户端的过程。这种方式下,客户端不需要向服务器证明自己的身份,因此称为“单向”。这种机制广泛应用于Web浏览器访问网站等场景。 #### 工作原理 1. **初始化握手** 客户端发起SSL/TLS握手请求至服务器,表明支持的加密算法列表以及其他必要参数[^3]。 2. **服务器响应** 服务器选择双方都支持的最佳加密套件,并通过`Server Hello`消息告知客户端。随后,服务器发送自身的数字证书以及可能存在的中间CA证书链到客户端用于确认服务器的身份合法性[^4]。 3. **公钥基础设施(PKI)验证** 接收到来自服务器的信息后,客户端会利用预先安装好的受信根证书来校验服务器所提供的证书链条的有效性和真实性。这一步骤确保了通信对方确实是预期的服务提供商而不是恶意第三方[^2]。 4. **密钥协商与预主秘钥生成** 验证成功之后,依据选定的安全协议版本和密码学方法,双方共同计算出会话所需的临时共享秘密——即所谓的预主秘钥(pre-master secret),此过程通常涉及非对称加密技术如RSA或ECDH等。 5. **完成握手** 双方各自独立地基于预主秘钥派生出最终的主秘钥(master secret),进而导出后续数据传输所需的各种工作密钥。此时,客户端发出`Finished`消息表示已完成整个握手流程;同样地,服务器也会回应相应的`Finished`消息作为确认。 6. **应用层通讯** 握手结束后进入正常的应用程序级交互阶段,所有传递的数据都将被上述产生的会话密钥保护起来免遭窃听篡改风险。 ```bash # 使用OpenSSL命令模拟简单的TLS单向认证环境设置 # 创建根CA及其私钥 openssl req -out server.key 2048 openssl req -new -key server.key -out server.csr openssl x509 -req -in server.csr -CA ca.crt -CAkey ca.key -CAcreateserial -out server.crt -days 365 # 测试时可以在另一终端运行如下指令扮演客户端角色尝试连接 echo QUIT | openssl s_client -connect localhost:443 -CAfile ca.crt -quiet ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值