• Linux C/C++实现SSL的应用层VPN (MiniVPN)


    SSL协议和VPN(虚拟私人网络)原理是网络安全领域中的两个重要概念。

    SSL协议,全称安全套接层(Secure Sockets Layer),是一种广泛应用于互联网的安全协议,主要在两个通信端点之间建立安全连接,以保护数据的传输安全。具体来说,SSL通过使用公钥加密算法实现数据的加密和解密,在客户端和服务器之间建立安全的通信通道。它还使用数字证书来验证通信双方的的身份,一旦身份验证成功,SSL就会使用加密算法对通信数据进行加密,确保数据在传输过程中不被篡改或窃取。

    VPN是一种可以在公共网络上建立加密通道的技术,通过这种技术可以使远程用户访问公司内部网络资源时,实现安全的连接和数据传输。VPN通常是通过虚拟专用网络(Virtual Private Network)来实现的,即在公共网络上建立一个虚拟的专用网络,将用户的数据流量加密并隧道化,使得数据在传输过程中无法被窃听和篡改。

    总的来说,SSL协议和VPN原理都是为了实现网络安全而设计的。SSL协议主要保护数据的传输安全,而VPN技术则是在公共网络上建立加密通道,使得数据在传输过程中更加安全。

    OpenSSL库用于实现SSL的应用层VPN

    OpenSSL是一个功能强大的开源SSL库,它提供了丰富的API和工具,可以用于实现SSL/TLS协议、加密算法、证书处理等功能。它还包含了IPSec和L2TP等VPN协议的实现。

    使用OpenSSL库实现SSL的应用层VPN需要用到以下一些函数:

    1. SSL_CTX_new(const SSL_METHOD *method):创建新的SSL上下文结构体。
    2. SSL_new(SSL_CTX *ctx):基于SSL上下文创建一个新的SSL结构体。
    3. SSL_set_fd(SSL *ssl, int fd):将SSL结构体的文件描述符设置为传入的文件描述符。
    4. SSL_set_connect_state(SSL *ssl):设置SSL结构体为客户端模式。
    5. SSL_do_handshake(SSL *ssl):执行SSL握手过程,与对方建立安全的连接。
    6. SSL_write(SSL *ssl, const void *buf, int len):向对方发送数据。
    7. SSL_read(SSL *ssl, void *buf, int len):从对方接收数据。
    8. SSL_shutdown(SSL *ssl):关闭SSL连接,发送关闭通知并终止会话。
    9. SSL_free(SSL *ssl):释放SSL结构体及其相关资源。
    10. SSL_CTX_free(SSL_CTX *ctx):释放SSL上下文及其相关资源。

    这些是OpenSSL库中一些常用的函数,它们用于在C语言中实现SSL的应用层VPN。在实际开发中,你可能还需要查看OpenSSL的文档和示例代码以获得更详细的信息和指导。

    证书颁发机构

    证书颁发机构是SSL协议中非常重要的一个环节,它负责为服务器颁发数字证书,以验证服务器的身份。客户端在和服务器建立连接时,会验证服务器的身份,以确保连接的安全性。

    密钥交换

     

    1. #define KEYF HOME "client.key"
    2. #define CACERT HOME "ca.crt"
    3. ...
    4. int main(int argc, char *argv[])
    5. {
    6. ...
    7.     /*------ Destination initialization ------*/
    8.     printf(PREFIX "Enter server name:");
    9.     scanf("%s", hostname);
    10.     printf(PREFIX "Enter port:");
    11.     scanf("%d"&port);
    12.     /*------ TLS initialization ------*/
    13.     SSL *ssl = setupTLSClient(hostname);
    14.     /*------ TCP connection ------*/
    15.     int sockfd = setupTCPClient(hostname, port);
    16.     /*------ TLS handshake ------*/
    17.     SSL_set_fd(ssl, sockfd);
    18.     int err = SSL_connect(ssl);
    19.     CHK_SSL(err);
    20.     printf(PREFIX "SSL connected! \n");
    21.     printf(PREFIX "SSL connection using %s\n", SSL_get_cipher(ssl));
    22.     /*------ Authenticating ------*/
    23.     int ret = try_login(ssl);
    24.     //login failed
    25.     if (ret < 0){
    26.         printf(PREFIX"Login failed!\n");
    27.         SSL_shutdown(ssl);
    28.         SSL_free(ssl);
    29.         close(sockfd);
    30.         return 0;
    31.     }
    32.     printf(PREFIX "Login successfully!\n");
    33.     /*------ Allocate IP ------*/
    34.     char client_IP[64= {0};
    35.     char cmd[100];
    36.     SSL_read(ssl, client_IP, sizeof(client_IP));
    37.     printf(PREFIX "Auto-assigned IP:%s\n", client_IP);
    38.     /*------ Add route ------*/
    39.     int tunfd = createTunDevice();
    40.     sprintf(cmd, "sudo ifconfig tun0 %s/24 up", client_IP);
    41.     system(cmd);
    42.     sprintf(cmd, "sudo route add -net 192.168.60.0/24 tun0");
    43.     system(cmd);
    44.     /*------ Listen sock&tun0 ------*/
    45.     while (1)
    46.     {
    47.         fd_set readFDSet;
    48.         int ret;
    49.         FD_ZERO(&readFDSet);
    50.         FD_SET(sockfd, &readFDSet);
    51.         FD_SET(tunfd, &readFDSet);
    52.         ret = select((sockfd > tunfd ? sockfd : tunfd) + 1&readFDSet, NULLNULLNULL);
    53.         if (FD_ISSET(sockfd, &readFDSet))
    54.         {
    55.             ret = sendto_TUN(ssl, tunfd);
    56.             // 服务端关闭会话
    57.             if (ret == -1)
    58.             {
    59.                 printf(PREFIX "Server disconnected!\n");
    60.                 SSL_shutdown(ssl);
    61.                 SSL_free(ssl);
    62.                 close(sockfd);
    63.             }
    64.         }
    65.         ...
    66.         if (FD_ISSET(tunfd, &readFDSet))
    67.             sendto_SSL(ssl, tunfd);
    68.     }
    69.     return 0;
    70. }
    •  
  • 相关阅读:
    Linux篇:进程
    WISE 2019 | ML-GCN:多标签图节点分类的半监督图嵌入
    设计模式基础前奏(上)
    字符串,字符,内存函数介绍
    找工作八股文----《操作系统》
    全域数据连接器解决运营痛点问题,助力海尔节省200万+
    React项目——withTranslation (HOC) 高阶组件使用ref遇到的问题
    SQL刷题---2021年11月每天新用户的次日留存率
    强化学习领域有哪些最热门和最有前途的研究课题
    mysql 数字类型和数字函数
  • 原文地址:https://blog.csdn.net/qq_31716541/article/details/133715779