码迷,mamicode.com
首页 > 其他好文 > 详细

如何对tcp流认证并加密

时间:2019-02-14 20:59:34      阅读:342      评论:0      收藏:0      [点我收藏+]

标签:eve   dev   访问   rsa   connect   使用   bug   cat   编译   

一个场景:目前越来越多的业务需要远程读写Redis,而Redis 本身不提供 SSL/TLS 的支持,在需要安全访问的环境下。
这时候就需要额外的手段进行加密认证,这里有两种手段:spiped 和 ngx stream ssl proxy
现在服务端起一个监听在127 的 Redis server

1、使用spiped

[root@ ~]# wget http://www.tarsnap.com/spiped/spiped-1.6.0.tgz
[root@ ~]# tar xf spiped-1.6.0.tgz 
[root@ ~]# cd spiped-1.6.0
[root@ ~]# tar xf spiped-1.6.0.tgz  
[root@ ~]# cd spiped-1.6.0
[root@ spiped-1.6.0]# make && make install
[root@ spiped-1.6.0]# /usr/local/bin/spiped -h 
spiped: illegal option -- -h

usage: spiped {-e | -d} -s <source socket> -t <target socket> -k <key file>
    [-DFj] [-f | -g] [-n <max # connections>] [-o <connection timeout>]
    [-p <pidfile>] [-r <rtime> | -R]
       spiped -v

创建key,并将key分发到代理客户端

[root@ ~]# dd if=/dev/urandom bs=32 count=1 of=/var/spiped/redis_proxy.key

启动服务端和客户端代理:

#服务端:
[root@ ~]# /usr/local/bin/spiped -d -s ‘[0.0.0.0]:6011‘ -t ‘[127.0.0.1]:6001‘ -k /var/spiped/redis_proxy.key  -p /var/spiped/redis_proxy_srv.pid

#客户端代理:
[root@ ~]# /usr/local/bin/spiped -e -s ‘[127.0.0.1]:6002‘ -t ‘[x.x.x.x]:6011‘ -k /var/spiped/redis_proxy.key  -p /var/spiped/redis_proxy_cli.pid

客户端测试:

[root@ ~]# /usr/local/redis/bin/redis-cli -h 127.0.0.1 -p 6002 -a redis@passwd ping 
PONG

参考:http://www.tarsnap.com/spiped.html

2、使用ngx stream ssl proxy

配置自签证书,略

编译nginx需要加入--with-stream --with-stream_ssl_module 选项

服务端代理配置:

upstream redis6001_server{
    server 127.0.0.1:6001 max_fails=3 fail_timeout=10s;
}

server{
    listen 6010 ssl;

    ssl_certificate /data/ssl/tcp_ssl_proxy/master.crt;      #服务端证书
    ssl_certificate_key /data/ssl/tcp_ssl_proxy/master.key;  #服务端key

    ssl_verify_client on;                                           #开启对客户端的认证
    ssl_client_certificate /data/ssl/tcp_ssl_proxy/cacert.pem;      #用于认证客户端ca证书

    ssl_session_timeout 10m;
    ssl_protocols  TLSv1 TLSv1.1 TLSv1.2;
    ssl_ciphers  ALL:!ADH:!EXPORT56:RC4+RSA:+HIGH:+MEDIUM:+LOW:+SSLv2:+EXP;

    proxy_connect_timeout 15s;
    proxy_timeout 15s;
    proxy_next_upstream_timeout 15s;

    proxy_pass redis6001_server;
    error_log /data/logs/redis6001_sslproxy_srv6010.log debug;
}

客户端代理配置:

upstream redis6001_server{
    server 128.1.145.67:6010 max_fails=3 fail_timeout=10s;
}

server{
    listen 127.0.0.1:6001;
    proxy_ssl_name tcp_ssl_proxy.com;  #与证书中的hostname一直,覆盖用于验证后端的hostname,并通过SNI在与后端建立连接时传递,默认proxy_pass地址的host部分会被使用。 
    proxy_ssl on;
    proxy_ssl_certificate  /data/ssl/tcp_ssl_proxy/master.crt;      #客户端证书
    proxy_ssl_certificate_key  /data/ssl/tcp_ssl_proxy/master.key;  #客户端key

    proxy_ssl_verify  on;                                                #开启对服务端的认证
    proxy_ssl_trusted_certificate /data/ssl/tcp_ssl_proxy/cacert.pem;    #用于认证服务端ca证书

    ssl_session_timeout 10m;
    proxy_ssl_protocols  TLSv1 TLSv1.1 TLSv1.2;
    proxy_ssl_ciphers  ALL:!ADH:!EXPORT56:RC4+RSA:+HIGH:+MEDIUM:+LOW:+SSLv2:+EXP;

    proxy_connect_timeout 15s;
    proxy_timeout 15s;
    proxy_next_upstream_timeout 15s;

    proxy_pass redis6001_server;
    error_log /data/logs/redis_sslproxy_cli6001.log debug;
}

参考链接:

1、https://blog.lyz810.com/article/2016/06/ngx_stream_proxy_module_doc_zh-cn/

2、https://blog.lyz810.com/article/2016/06/ngx_stream_ssl_module_doc_zh-cn/

3、https://my.oschina.net/foreverich/blog/1517128?utm_medium=referral

如何对tcp流认证并加密

标签:eve   dev   访问   rsa   connect   使用   bug   cat   编译   

原文地址:https://www.cnblogs.com/wshenjin/p/10376614.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!