⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ssl-client.c

📁 linux下的ssl客户端和服务器端源码
💻 C
字号:
#include <stdio.h>#include <string.h>#include <errno.h>#include <sys/socket.h>#include <resolv.h>#include <stdlib.h>#include <netinet/in.h>#include <arpa/inet.h>#include <unistd.h>#include <openssl/ssl.h>#include <openssl/err.h>#define MAXBUF 1024void ShowCerts(SSL * ssl){    X509 *cert;    char *line;    cert = SSL_get_peer_certificate(ssl);    if (cert != NULL) {        printf("数字证书信息:\n");        line = X509_NAME_oneline(X509_get_subject_name(cert), 0, 0);        printf("证书: %s\n", line);        free(line);        line = X509_NAME_oneline(X509_get_issuer_name(cert), 0, 0);        printf("颁发者: %s\n", line);        free(line);        X509_free(cert);    } else        printf("无证书信息!\n");}/************关于本文档*********************************************filename: ssl-client.c*purpose: 演示利用 OpenSSL 库进行基于 IP层的 SSL 加密通讯的方法,这是客户端例子*wrote by: yuankang(yuankang163@163.com)*date time:2007-12-12*********************************************************************/int main(int argc, char **argv){    int sockfd, len;    struct sockaddr_in dest;    char buffer[MAXBUF + 1];    SSL_CTX *ctx;    SSL *ssl;    if (argc != 3) {        printf("参数格式错误!正确用法:IP Port\n");        exit(0);    }    /* SSL 库初始化,参看 ssl-server.c 代码 */    SSL_library_init();    OpenSSL_add_all_algorithms();    SSL_load_error_strings();    ctx = SSL_CTX_new(SSLv23_client_method());    if (ctx == NULL) {        ERR_print_errors_fp(stdout);        exit(1);    }    /* 创建一个 socket 用于 tcp 通信 */    printf("socket creating......  \t\t");    if ((sockfd = socket(AF_INET, SOCK_STREAM, 0)) < 0) {        perror("Socket");        exit(errno);    }    printf("socket created.\n");    /* 初始化服务器端(对方)的地址和端口信息 */    printf("address creating...... \t\t");    bzero(&dest, sizeof(dest));    dest.sin_family = AF_INET;    dest.sin_port = htons(atoi(argv[2]));    if (inet_aton(argv[1], (struct in_addr *) &dest.sin_addr.s_addr) == 0) {        perror(argv[1]);        exit(errno);    }    printf("address created.\n");    /* 连接服务器 */    printf("server connecting......\t\t");    if (connect(sockfd, (struct sockaddr *) &dest, sizeof(dest)) != 0) {        perror("Connect ");        exit(errno);    }    printf("server connected.\n");    /* 基于 ctx 产生一个新的 SSL */    ssl = SSL_new(ctx);    SSL_set_fd(ssl, sockfd);    /* 建立 SSL 连接 */    if (SSL_connect(ssl) == -1)        ERR_print_errors_fp(stderr);    else {        printf("Connected with %s encryption\n", SSL_get_cipher(ssl));        ShowCerts(ssl);    }    /* 接收对方发过来的消息,最多接收 MAXBUF 个字节 */    bzero(buffer, MAXBUF + 1);    /* 接收服务器来的消息 */    len = SSL_read(ssl, buffer, MAXBUF);    if (len > 0)        printf("接收到来自服务器的消息:'%s',共%d个字节的数据。\n",               buffer, len);    else {        printf            ("消息接收失败!错误代码是%d,错误信息是'%s'\n",             errno, strerror(errno));        goto finish;    }    bzero(buffer, MAXBUF + 1);    printf("输入要发送服务器的消息:");    scanf("%[^\n]",buffer);    /* 发消息给服务器 */    len = SSL_write(ssl, buffer, strlen(buffer));    if (len < 0)        printf            ("消息'%s'发送失败!错误代码是%d,错误信息是'%s'\n",             buffer, errno, strerror(errno));    else        printf("消息'%s'发送成功,共发送了%d个字节!\n",               buffer, len);  finish:    /* 关闭连接 */    SSL_shutdown(ssl);    SSL_free(ssl);    close(sockfd);    SSL_CTX_free(ctx);    return 0;}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -