用openssl實現ssl通信
时间: 2023-10-21 15:03:29 浏览: 85
要使用 OpenSSL 实现 SSL 通信,需要进行以下步骤:
1.安装 OpenSSL 库
在 Linux 系统下,可以使用以下命令来安装 OpenSSL 库:
```
sudo apt-get install openssl
```
在 Windows 系统下,需要下载 OpenSSL 安装包并安装。
2.生成证书和私钥
使用 OpenSSL 可以生成自签名证书和私钥。可以使用以下命令生成证书和私钥:
```
openssl req -x509 -newkey rsa:4096 -keyout key.pem -out cert.pem -days 365
```
该命令会生成一个有效期为 1 年的自签名证书 cert.pem 和私钥 key.pem。
3.编写代码
接下来,可以使用 OpenSSL 库中的函数来实现 SSL 通信。具体可以参考 OpenSSL 的官方文档和示例代码。
以下是一个简单的示例代码,实现了 SSL 客户端和服务器之间的通信:
```c
#include <openssl/ssl.h>
#include <openssl/err.h>
int main() {
SSL_load_error_strings();
SSL_library_init();
SSL_CTX *ctx = SSL_CTX_new(SSLv23_server_method());
if (!ctx) {
ERR_print_errors_fp(stderr);
return 1;
}
if (SSL_CTX_use_certificate_file(ctx, "cert.pem", SSL_FILETYPE_PEM) <= 0) {
ERR_print_errors_fp(stderr);
return 1;
}
if (SSL_CTX_use_PrivateKey_file(ctx, "key.pem", SSL_FILETYPE_PEM) <= 0) {
ERR_print_errors_fp(stderr);
return 1;
}
SSL *ssl = SSL_new(ctx);
// 创建 socket 并绑定端口
int sockfd = socket(AF_INET, SOCK_STREAM, 0);
struct sockaddr_in addr;
addr.sin_family = AF_INET;
addr.sin_port = htons(8000);
addr.sin_addr.s_addr = INADDR_ANY;
bind(sockfd, (struct sockaddr*)&addr, sizeof(addr));
listen(sockfd, 5);
while (1) {
struct sockaddr_in client_addr;
socklen_t client_len = sizeof(client_addr);
int clientfd = accept(sockfd, (struct sockaddr*)&client_addr, &client_len);
SSL_set_fd(ssl, clientfd);
SSL_accept(ssl);
char buf[1024];
int len = SSL_read(ssl, buf, sizeof(buf));
buf[len] = '\0';
printf("Received: %s\n", buf);
SSL_write(ssl, "Hello, world!", 13);
SSL_shutdown(ssl);
SSL_free(ssl);
close(clientfd);
}
SSL_CTX_free(ctx);
return 0;
}
```
该示例代码实现了一个 SSL 服务器,监听在 8000 端口。客户端可以使用 OpenSSL 库中的函数来进行 SSL 通信。
阅读全文