ubuntu openssl 连接gmial smtp服务

本文介绍如何利用OpenSSL库实现SSL加密,并通过SMTP协议发送带认证的加密邮件。具体步骤包括安装OpenSSL开发库、编写C语言程序来处理邮件信息输入、域名解析、服务器连接及SMTP交互等。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

引用我的代码片

OpenSSL 是一个安全套接字层密码库,囊括主要的密码算法、常用的密钥和证书封装管理功能及SSL协议,并提供丰富的应用程序供测试或其它目的使用

1.安装开发库

sudo apt-get install libssl-dev
2.创建c语言文件


我命名为 test.c


3.包含ssl头文件


/*openssl*/
#include <openssl/ssl.h>
#include <openssl/bio.h>
4.包含socket头文件


/*socket*/
#include <sys/socket.h>
#include <netinet/in.h>
#include <netdb.h>
#include <arpa/inet.h>

5.添加标准库


#include<stdio.h>
#include<stdlib.h>
#include<string.h>


6.添加一个结构体保存基本信息


struct email{
    char *username;      //登陆用户名
    char *password;      //登陆密码
    char *from;          //邮箱来自
    char *send;          //邮箱发送
    char *title;         //邮件标题
    char *body;          //邮件内容
}mail;

7.新建一个函数 GetEmailInfo() 用于获取基本信息

int GetEmailInfo() {
	mail.username = (char *)malloc(64 * (sizeof(char)));
	mail.password = (char *)malloc(64 * (sizeof(char)));
	mail.title = (char *)malloc(64 * (sizeof(char)));
	mail.body = (char *)malloc(64 * (sizeof(char)));
	mail.send = (char *)malloc(64 * (sizeof(char)));
	mail.from = (char *)malloc(64 * (sizeof(char)));


	printf("请输入你的邮箱地址:"); 
	scanf("%s",mail.username);
	printf("请输入你的邮箱密码:");
	scanf("%s", mail.password);
	printf("请输入收件人信息:");
	scanf("%s", mail.send);
	printf("请输入邮件的标题:");
	scanf("%s",mail.title);
	printf("请输入邮件内容:");
	scanf("%s",mail.body);
	strcpy(mail.from, mail.username);

	return 0;
}


8. 新建函数 char *GetIpAddress(const char *domain) 用于把域名转换为ip

char *GetIpAddress(const char *domain){
    const char *ip = NULL;
    struct in_addr *host_name;
    struct hostent *list =gethostbyname(domain);
    int x=0;
    for(x;list->h_addr_list[x]!=0;x++){
        host_name= list->h_addr_list[x];
        ip = inet_ntoa(*host_name);
    }
    return ip;
}
9.新建函数 ConnectServer(const char * ServerAddr)用于连接服务器


int connectToServer(const char *ServerAdd){

    int socket_fd = socket(AF_INET,SOCK_STREAM,IPPROTO_IP);
    struct sockaddr_in client;
    memset(&client,0,sizeof(client));
    client.sin_family = AF_INET;
    client.sin_port =htons(465);
    if(inet_pton(AF_INET,GetIpAddress(ServerAdd),&client.sin_addr)==1){
        connect(socket_fd,&client,sizeof(client));
    }
    return socket_fd;

}

10.base64


const char * base64char = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";

char * mybase64_encode( const unsigned char * bindata, char * base64, int binlength )
{
    int i, j;
    unsigned char current;

    for ( i = 0, j = 0 ; i < binlength ; i += 3 )
    {
        current = (bindata[i] >> 2) ;
        current &= (unsigned char)0x3F;
        base64[j++] = base64char[(int)current];

        current = ( (unsigned char)(bindata[i] << 4 ) ) & ( (unsigned char)0x30 ) ;
        if ( i + 1 >= binlength )
        {
            base64[j++] = base64char[(int)current];
            base64[j++] = '=';
            base64[j++] = '=';
            break;
        }
        current |= ( (unsigned char)(bindata[i+1] >> 4) ) & ( (unsigned char) 0x0F );
        base64[j++] = base64char[(int)current];

        current = ( (unsigned char)(bindata[i+1] << 2) ) & ( (unsigned char)0x3C ) ;
        if ( i + 2 >= binlength )
        {
            base64[j++] = base64char[(int)current];
            base64[j++] = '=';
            break;
        }
        current |= ( (unsigned char)(bindata[i+2] >> 6) ) & ( (unsigned char) 0x03 );
        base64[j++] = base64char[(int)current];

        current = ( (unsigned char)bindata[i+2] ) & ( (unsigned char)0x3F ) ;
        base64[j++] = base64char[(int)current];
    }
    base64[j] = '\0';
    return base64;
}



11.主函数

int main(void){



    GetEmailInfo();


    BIO  *obj_bio =NULL;
    BIO  *obj_out =NULL;
    const SSL_METHOD *method =NULL;
    SSL_CTX  *ctx=NULL;
    SSL *ssl;

    int connect_fd = 0;
    int ret,i;
    ret=i=0;
    OpenSSL_add_all_algorithms();
    ERR_load_BIO_strings();
    ERR_load_CRYPTO_strings();
    SSL_load_error_strings();

    obj_bio = BIO_new(BIO_s_file());
    obj_out = BIO_new_fp(stdout,BIO_NOCLOSE);

    if(SSL_library_init()<=0){
        BIO_printf(obj_out,"ssl iniliatile fail");

    }
    else{
        method = SSLv23_client_method();
        if((ctx=SSL_CTX_new(method))==NULL){
            BIO_printf(obj_out,"open ssl  fail");
        }

        else{
            SSL_CTX_set_options(ctx,SSL_OP_NO_SSLv2);
            ssl=SSL_new(ctx);
            connect_fd = connectToServer("smtp.gmail.com");

            if(connect_fd!=0){

                BIO_printf(obj_out,"success connect\n");

                SSL_set_fd(ssl,connect_fd);


                if(SSL_connect(ssl) !=0){


                     char *rn ="\r\n";
                     char buf[4096];
                     char rbuf[4768];
                     memset(buf,0,sizeof(buf));
                     memset(rbuf,0,sizeof(rbuf));


                     SSL_read(ssl,rbuf,sizeof(rbuf));
                     BIO_printf(obj_out,rbuf);
                     memset(rbuf,0,sizeof(rbuf));


                     strcpy(&buf,"HELO SERVER");
                     strcat(buf,rn);
                     SSL_write(ssl,buf,strlen(buf));
                     BIO_printf(obj_out,buf);
                     memset(&buf,0,sizeof(buf));


                     SSL_read(ssl,rbuf,sizeof(rbuf));
                     BIO_printf(obj_out,rbuf);
                     memset(rbuf,0,sizeof(rbuf));



                     strcpy(&buf,"AUTH LOGIN");
                     strcat(buf,rn);
                     SSL_write(ssl,buf,strlen(buf));
                     BIO_printf(obj_out,buf);
                     memset(&buf,0,sizeof(buf));


                     SSL_read(ssl,rbuf,sizeof(rbuf));
                     BIO_printf(obj_out,rbuf);
                     memset(rbuf,0,sizeof(rbuf));


                     mybase64_encode(mail.username,&buf,strlen(mail.username));
                     strcat(buf,rn);
                     SSL_write(ssl,buf,strlen(buf));
                     BIO_printf(obj_out,buf);
                     memset(buf,0,sizeof(buf));



                     SSL_read(ssl,rbuf,sizeof(rbuf));
                     BIO_printf(obj_out,rbuf);
                     memset(rbuf,0,sizeof(rbuf));;



                     mybase64_encode(mail.password,&buf,strlen(mail.password));
                     strcat(buf,rn);
                     SSL_write(ssl,buf,strlen(buf));
                     BIO_printf(obj_out,buf);
                     memset(buf,0,sizeof(buf));


                     SSL_read(ssl,rbuf,sizeof(rbuf));
                     BIO_printf(obj_out,rbuf);
                     memset(rbuf,0,sizeof(rbuf));

                     strcpy(buf,"mail from:<");
                     strcat(buf,mail.from);
                     strcat(buf,">");
                     strcat(buf,rn);
                     SSL_write(ssl,buf,strlen(buf));
                     BIO_printf(obj_out,buf);
                     memset(buf,0,sizeof(buf));


                     SSL_read(ssl,rbuf,sizeof(rbuf));
                     BIO_printf(obj_out,rbuf);
                     memset(rbuf,0,sizeof(rbuf));

                     strcpy(buf,"rcpt to:<");
                     strcat(buf,mail.send);
                     strcat(buf,">");
                     strcat(buf,rn);
                     SSL_write(ssl,buf,strlen(buf));
                     BIO_printf(obj_out,buf);
                     memset(buf,0,sizeof(buf));

                     SSL_read(ssl,rbuf,sizeof(rbuf));
                     BIO_printf(obj_out,rbuf);
                     memset(rbuf,0,sizeof(rbuf));

                     strcpy(buf,"data");
                     strcat(buf,rn);
                     SSL_write(ssl,buf,strlen(buf));
                     BIO_printf(obj_out,buf);
                     memset(buf,0,sizeof(buf));

                     SSL_read(ssl,rbuf,sizeof(rbuf));
                     BIO_printf(obj_out,rbuf);
                     memset(rbuf,0,sizeof(rbuf));

                     strcpy(buf,"subject:");
                     strcat(buf,mail.title);
                     strcat(buf,rn);
                     SSL_write(ssl,buf,strlen(buf));
                     BIO_printf(obj_out,buf);
                     memset(buf,0,sizeof(buf));

                     strcat(buf,mail.body);
                     strcat(buf,rn);
                     strcat(buf,".");
                     strcat(buf,rn);
                     SSL_write(ssl,buf,strlen(buf));
                     BIO_printf(obj_out,buf);
                     memset(buf,0,sizeof(buf));

                     SSL_read(ssl,rbuf,sizeof(rbuf));
                     BIO_printf(obj_out,rbuf);
                     memset(rbuf,0,sizeof(rbuf));

                     strcpy(buf,"quit");
                     strcat(buf,rn);
                     SSL_write(ssl,buf,strlen(buf));
                     BIO_printf(obj_out,buf);
                     memset(buf,0,sizeof(buf));


                     SSL_read(ssl,rbuf,sizeof(rbuf));
                     BIO_printf(obj_out,rbuf);
                     memset(rbuf,0,sizeof(rbuf));

                 }
        }
    }
}
    return 0;
}











<think>我们正在处理关于Ubuntu系统中OpenSSL的安装、配置和使用教程的请求。根据提供的引用信息,我们可以总结出以下关键点: 1. 安装依赖包(引用[2]和引用[3]): - 需要安装的依赖包包括:openssl, libssl-dev, zlib1g-dev等。 - 可以通过`apt-get`命令安装这些依赖。 2. 下载和编译安装OpenSSL(引用[3]): - 从官网下载源码包,移动到`/usr/local`目录。 - 解压后进入目录,执行配置、编译和安装命令。 3. 使用OpenSSL生成证书和进行双向认证(引用[4]): - 生成证书和密钥。 - 使用`s_server`和`s_client`进行双向认证测试。 4. 使用OpenSSL库进行编程(引用[5]): - 示例程序展示了使用DES加密解密。 - 编译时需要链接`-lssl -lcrypto`。 根据这些信息,我们将组织一个详细的教程,包括安装、基本使用和编程示例。 注意:由于引用信息中包含了不同Ubuntu版本(如16.04和22.04),但OpenSSL的安装方法大同小异,我们以Ubuntu 22.04为例,同时指出不同版本可能存在的差异。 教程结构: 1. 安装OpenSSL - 通过系统包管理器安装(简单方法) - 通过源码编译安装(需要特定版本时) 2. OpenSSL基本使用 - 生成密钥和证书 - 双向认证示例 3. OpenSSL编程示例 - 使用C语言OpenSSL库进行DES加密解密 现在开始编写回答。</think>### Ubuntu OpenSSL 安装与使用教程 #### 一、安装 OpenSSL 1. **安装依赖包** 在终端执行以下命令安装编译依赖: ```bash sudo apt update sudo apt install build-essential checkinstall zlib1g-dev -y ``` 2. **源码编译安装**(推荐获取最新版本) ```bash # 下载源码 (以1.1.1版本为例) wget https://www.openssl.org/source/openssl-1.1.1w.tar.gz tar -xzf openssl-1.1.1w.tar.gz cd openssl-1.1.1w # 编译安装 ./config --prefix=/usr/local/openssl --openssldir=/usr/local/openssl make sudo make install # 添加环境变量 echo 'export PATH=/usr/local/openssl/bin:$PATH' >> ~/.bashrc source ~/.bashrc ``` *注意:`--prefix`指定安装路径,建议保留默认路径[^3]。* 3. **验证安装** ```bash openssl version # 应输出类似 OpenSSL 1.1.1w 的版本信息 ``` --- #### 二、基础使用示例 1. **生成自签名证书** ```bash # 生成私钥 openssl genpkey -algorithm RSA -out server.key -aes256 # 生成证书请求 openssl req -new -key server.key -out server.csr # 生成自签名证书 (有效期365天) openssl x509 -req -days 365 -in server.csr -signkey server.key -out server.crt ``` 2. **双向认证测试** **服务端**: ```bash openssl s_server -CAfile server.crt -cert server.crt -key server.key -accept 4433 -Verify 1 ``` **客户端**: ```bash openssl s_client -CAfile client.crt -cert client.crt -key client.key -connect 127.0.0.1:4433 ``` *通过`-Verify 1`参数强制客户端证书验证[^4]。* --- #### 三、编程开发示例(C语言) ```c #include <stdio.h> #include <openssl/des.h> int main() { DES_cblock key = {0x01, 0x23, 0x45, 0x67, 0x89, 0xAB, 0xCD, 0xEF}; DES_key_schedule schedule; DES_set_key(&key, &schedule); DES_cblock input = "Secret!"; DES_cblock output; // 加密 DES_ecb_encrypt(&input, &output, &schedule, DES_ENCRYPT); printf("加密结果: "); for(int i=0; i<8; i++) printf("%02x", output[i]); // 解密 DES_ecb_encrypt(&output, &input, &schedule, DES_DECRYPT); printf("\n解密结果: %s\n", input); return 0; } ``` **编译命令**: ```bash gcc demo.c -o demo -lssl -lcrypto ``` *需安装`libssl-dev`开发包[^5]。* --- #### 四、常见问题解决 - **库链接错误**:确保安装开发包 `sudo apt install libssl-dev` - **版本冲突**:使用`/usr/local/openssl/bin/openssl`指定新版本路径 - **证书验证失败**:检查CA证书链是否完整,使用`openssl verify -CAfile ca.crt server.crt`验证 > 关键提示:生产环境建议使用**Let's Encrypt**等权威CA证书,自签名证书仅适用于测试[^4]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值