免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 998 | 回复: 0
打印 上一主题 下一主题

openssl [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2007-09-14 08:54 |只看该作者 |倒序浏览
#include "header.h"
void err_sys(const char *errmsg);
int create_listenfd(int argc, char **argv);
int main(int argc, char **argv)
{
        SSL_CTX *ctx;
        SSL *ssl;
        int listenfd, connfd;
        if (argc != 3)
        {
                fprintf(stderr, "Usage: ./ssl  \n");
                exit(1);
        }
        /* SSL library initialize */
        SSL_library_init();
        OpenSSL_add_all_algorithms();
        SSL_load_error_strings();
        if ((ctx = SSL_CTX_new(SSLv23_server_method())) == NULL)
        {
                ERR_print_errors_fp(stderr);
                exit(1);
        }
        /* load user digit certificate */
        if (SSL_CTX_use_certificate_file(ctx, argv[1], SSL_FILETYPE_PEM) <= 0)
        {
                ERR_print_errors_fp(stderr);
                exit(1);
        }
        /* load user private key */
        if (SSL_CTX_use_PrivateKey_file(ctx, argv[2], SSL_FILETYPE_PEM) <= 0)
        {
                ERR_print_errors_fp(stderr);
                exit(1);
        }
        /* check user private key */
        if (SSL_CTX_check_private_key(ctx) != 1)
        {
                ERR_print_errors_fp(stderr);
                exit(1);
        }
        listenfd = create_listenfd(argc, argv);
        while (1)
        {
                if ((connfd = accept(listenfd, NULL, NULL)) == -1)
                        err_sys("accept");
                ssl = SSL_new(ctx);
                SSL_set_fd(ssl, connfd);
                if (SSL_accept(ssl) == -1)
                {
                        ERR_print_errors_fp(stderr);
                        exit(1);
                }
                char buf[BUFSIZ] = "from server to client\n";
                if (SSL_write(ssl, buf, strlen(buf)) != strlen(buf))
                {
                        ERR_print_errors_fp(stderr);
                        exit(1);
                }
                SSL_shutdown(ssl);
                SSL_free(ssl);
        } /* while */
        SSL_CTX_free(ctx);
        exit(0);
}
int create_listenfd(int argc, char **argv)
{
        int listenfd;
        struct sockaddr_in servaddr;
        if ((listenfd = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP)) == -1)
                err_sys("socket");
        bzero(&servaddr, sizeof(servaddr));
        servaddr.sin_family = AF_INET;
        servaddr.sin_port = htons(PORT);
        servaddr.sin_addr.s_addr = htonl(INADDR_ANY);
        if (bind(listenfd, (SA *)&servaddr, sizeof(servaddr)) == -1)
                err_sys("bind");
        if (listen(listenfd, BACKLOG) == -1)
                err_sys("listen");
        return (listenfd);
}
void err_sys(const char *errmsg)
{
        perror(errmsg);
        exit(1);
}
client end =============
#include "header.h"
void err_sys(const char *errmsg);
#if 0
void show_cert(SSL *ssl)
{
        X509 *cert;
        char *line;
        printf("show_cert() function running.\n");
        if ((cert = SSL_get_peer_certificate(ssl)) != NULL)
        {
                printf("Certificate Information:\n");
                line = X509_NAME_oneline(X509_get_subject_name(cert), 0, 0);
                printf("certificate: %s\n", line);
                free(line);
                line = X509_NAME_oneline(X509_get_issuer_name(cert), 0, 0);
                printf("issuer: %s\n", line);
                free(line);
                X509_free(cert);
        }
        else
                printf("No Certificate.\n");
}
#endif
int main(int argc, char **argv)
{
        SSL *ssl;
        SSL_CTX *ctx;
        /* SSL library initialize */
        SSL_library_init();
        OpenSSL_add_all_algorithms();
        SSL_load_error_strings();
        if ((ctx = SSL_CTX_new(SSLv23_client_method())) == NULL)
        {
                ERR_print_errors_fp(stderr);
                exit(1);
        }
        int sockfd;
        struct sockaddr_in servaddr;
        if ((sockfd = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP)) == -1)
                err_sys("socket");
        bzero(&servaddr, sizeof(servaddr));
        servaddr.sin_family = AF_INET;
        servaddr.sin_port = htons(PORT);
        if (inet_pton(AF_INET, argv[1], &servaddr.sin_addr) <= 0)
                err_sys("inet_pton");
        if (connect(sockfd, (SA *)&servaddr, sizeof(servaddr)) == -1)
                err_sys("connect");
        /* create ssl */
        ssl = SSL_new(ctx);
        SSL_set_fd(ssl, sockfd);
        if (SSL_connect(ssl) == -1)
        {
                ERR_print_errors_fp(stderr);
                exit(1);
        }
        char buf[BUFSIZ];
        ssize_t nread;
        bzero(buf, sizeof(buf));
        if ((nread = SSL_read(ssl, buf, sizeof(buf))) < 0)
        {
                ERR_print_errors_fp(stderr);
                exit(1);
        }
        if (write(STDOUT_FILENO, buf, nread) != nread)
                err_sys("write");
        SSL_shutdown(ssl);
        SSL_free(ssl);
        SSL_CTX_free(ctx);
        exit(0);
}
void err_sys(const char *errmsg)
{
        perror(errmsg);
        exit(1);
}
               
               
               

本文来自ChinaUnix博客,如果查看原文请点:http://blog.chinaunix.net/u1/39758/showart_381533.html
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP