Netty SSL安全配置
title: Netty SSL安全配置
date: 2017-08-26 14:51:43
categories: 网络安全
tags: [netty,ssl]
Netty SSL安全配置
摘要
在研发平台的过程中,涉及到平台网关和前置agent的通信加密,虽然目前软件在内网中,但是由于平台和agent的特殊性,一旦被控制,部署的软件就会受到很大威胁,平台网关采用Netty开发,下面主要介绍一下netty的ssl配置和安全软件扫出的Diffie-Hellman弱密码问题解决方法
主要名词解释
| 英文名称或缩写 | 名词解释 |
|-
| Netty | 高性能服务器端编程框架 |
| OpenSSL | 安全套接字层密码库 |
| KeyTool | 密钥和证书管理工具 |
| Diffie-Hellman | 密钥交换算法 |
SSL常用认证方式介绍
- 单向认证
- 双向认证
- CA认证
SSL单向认证
单向认证只需客户端验证服务端,即客户端只需要认证服务端的合法性,服务端不需要。这种认证方式适用Web应用,因为web应用的用户数目广泛,且无需在通讯层对用户身份进行验证,一般都在应用逻辑层来保证用户的合法登入。但如果是企业应用对接,情况就不一样,可能会要求对客户端(相对而言)做身份验证。这时就需要做SSL双向认证。
SSL双向认证
双向认证顾名思义,服务端也需要认证客户端的合法性,这就意味着客户端的自签名证书需要导入服务端的数字证书仓库。
采用这种方式会不太便利,一但客户端或者服务端修改了秘钥和证书,就需要重新进行证书交换,对于调试和维护工作量非常大,并且由于agent数目不确定,动态增加agent的时候需要平台和agent双发互相加入相应各自的证书。
CA认证
CA认证的好处是只要服务端和客户端只需要将CA证书导入各自的keystore,客户端和服务端只需判断这些证书是CA签名过的即可,这也是蜂鸟平台内部采用的认证方式
生成证书
openSSL的安装不是本经验案例的重点,这里不介绍
根证书生成
openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout root.key –out root.crt –subj /C=CN/ST=ZheJiang/L=HangZhou/O=MyCompany/OU=GA/CN=GA –config openssl.cnf
服务器端证书生成
服务器端秘钥对生成
keytool -genkey -alias server -keypass **** -validity 1825 -keyalg RSA -keystore gateway.keystore -keysize 2048 -storepass **** -dname "CN=GA, OU=GA, O=MyCompany, L=HangZhou, ST=ZheJiang, C=CN"
keypass: 指定生成秘钥的密码
keystore:指定存储文件的密码,再次打开需要此密码
生成证书签名请求
keytool -certreq -alias server -keystore gateway.keystore -validity 1825 -file gateway.csr -storepass ****
用根证书私钥进行签名
openssl x509 -req -in gateway.csr -CA root.crt -CAkey root.key -CAcreateserial -out gateway.pem -days 1825 -extensions SAN -extfile san1.cnf
导入根证书
keytool -keystore gateway.keystore -importcert -alias CA -file root.crt -storepass **** -noprompt
导入服务端证书
keytool -keystore gateway.keystore -importcert -alias server -file gateway.pem -storepass ****
客户端证书生成方法与服务端基本相同,此处不再赘述,需要注意一点的是签名根证书必须是同一个
Netty SSL配置
获取SSLContext
public class SslContextFactory {
private static final String PROTOCOL = "TLS";
private static volatile SSLContext SERVER_CONTEXT = null;
private static final String DEFAULT_PROPERTIES = "application.properties";
private static final String KEYSTORE_TYPE = "server.ssl.key-store-type";
private static final String KEYSTORE_PASSWORD = "gateway.ssl.key-store-password";
private static final String GATEWAY_KEYSTORE = "gateway.ssl.key-store";
private SslContextFactory() {
}
private static void init(){
Properties properties = null;
InputStream gatewayKeyStore = null;
InputStream gatewayTrustStore = null;
try {
properties = PropertiesTool.getInstance().getProperties(DEFAULT_PROPERTIES, false);
//初始化keyManagerFactory
KeyStore ks = KeyStore.getInstance(properties.getProperty(KEYSTORE_TYPE));
gatewayKeyStore = new FileInputStream(properties.getProperty(GATEWAY_KEYSTORE));
ks.load(gatewayKeyStore, properties.getProperty(KEYSTORE_PASSWORD).toCharArray());
KeyManagerFactory kmf = KeyManagerFactory.getInstance(KeyManagerFactory.getDefaultAlgorithm());
kmf.init(ks, properties.getProperty(KEYSTORE_PASSWORD).toCharArray());
//初始化TrustManagerFacotry
KeyStore ts = KeyStore.getInstance(properties.getProperty(KEYSTORE_TYPE));
gatewayTrustStore = new FileInputStream(properties.getProperty(GATEWAY_KEYSTORE));
ts.load(gatewayTrustStore, properties.getProperty(KEYSTORE_PASSWORD).toCharArray());
TrustManagerFactory tmf = TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm());
tmf.init(ts);
//生成SSLContext
SERVER_CONTEXT = SSLContext.getInstance(PROTOCOL);
SERVER_CONTEXT.init(kmf.getKeyManagers(), tmf.getTrustManagers(), null);
} catch (IOException e) {
throw new GatewayException(e.getMessage(), e);
} catch (Exception e) {
throw new GatewayException(e.getMessage(), e);
} finally {
if (null != gatewayKeyStore) {
try {
gatewayKeyStore.close();
} catch (IOException e) {
}
}
if (null != gatewayTrustStore) {
try {
gatewayTrustStore.close();
} catch (IOException e) {
}
}
}
}
public static SSLContext getServerContext() {
if(SERVER_CONTEXT == null){
synchronized (SslContextFactory.class) {
if (SERVER_CONTEXT == null) {
init();
}
}
}
return SERVER_CONTEXT;
}
}
加入NettyHandler
Netty 提供了一个SslHandler,主要用于加密和解密
在大多数情况下,SslHandler 将成为 ChannelPipeline 中的第一个 ChannelHandler 。这将确保所有其他 ChannelHandler 应用他们的逻辑到数据后加密后才发生,从而确保他们的变化是安全的。

图片来自网络
SSLContext sslCtx = SslContextFactory.getServerContext();
SSLEngine sslEngine = sslCtx.createSSLEngine();
//设置加密套件
sslEngine.setEnabledCipherSuites(Constants.CIPHER_ARRAY);
sslEngine.setUseClientMode(false);
sslEngine.setNeedClientAuth(true);
pipeline.addLast("SslEstablish",new SslHandler(sslEngine));
Diffie-Hellman 密码过弱问题
研究人员Alex Halderman和Nadia Heninger提出NSA已经能够通过攻击1024位素数的Diffie-Hellman密钥交换算法解密大量HTTPS、SSH和VPN连接。
提供安全的加密算法
public static final String[] CIPHER_ARRAY = {"TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256",
"TLS_DHE_RSA_WITH_AES_128_GCM_SHA256",
"TLS_DHE_DSS_WITH_AES_128_GCM_SHA256"};
参考资料
Netty权威指南
https://weakdh.org/sysadmin.html
Netty SSL安全配置的更多相关文章
- nginx + SSL优化配置
nginx + SSL优化配置: #http段添加如下配置项: http { ssl_prefer_server_ciphers on; #设置协商加密算法时,优先使用我们服务端的加密套件,而不是客户 ...
- SSL 通信原理及Tomcat SSL 双向配置
SSL 通信原理及Tomcat SSL 双向配置 目录1 参考资料 .................................................................. ...
- 深入浅出 SSL 管理配置实战
我们生活在一个信息大爆炸的时代,几乎每天都在和互联网打交道,购物.网银转账.支付宝付款.搜索信息.查看邮件.观看视频.微信聊天.上网冲浪.阅读新闻等,无不时时刻刻在和网络打交道.那如何保护网络安全就相 ...
- 阿里云负载均衡SSL证书配置
阿里云负载均衡SSL证书 转载请注明地址:http://www.cnblogs.com/funnyzpc/p/8908461.html 好久了呢,距上篇博客的这段时间中:考试.搬家.工作赶工.业务考察 ...
- nginx普通配置/负载均衡配置/ssl/https配置
1.nginx普通配置 server { listen ; server_name jqlin.lynch.com; access_log /var/log/nginx/main.log main; ...
- 阿里云负载均衡SSL证书配置(更新)
阿里云负载均衡及应用防火墙SSL证书配置 转载请注明地址:http://www.cnblogs.com/funnyzpc/p/8908461.html 好久了呢,距上篇博客的这段时间中:考试.搬家.工 ...
- 最新阿里云服务器免费SSL证书配置HTTPS的两种方法(图文教程二)
在大家学习如何利用免费SSL证书配置网站HTTPS之前,我们先要搞清楚为什么要开启HTTPS,这个绿色的小锁真的有用吗?所谓的HTTPS其实是(安全套接字层超文本传输协议)是以安全为目标的HTTP通道 ...
- linux ssl证书配置(apache)
1. 前提是 已通过第三方 申请到 .crt .key 和 .ca-bundle 文件 2. 将三个文件拷贝到linux服务器上 任意一个指定的目录 3. 找到要编辑的apache配置 Apache主 ...
- [转帖]一个ip对应多个域名多个ssl证书配置-Nginx实现多域名证书HTTPS
一个ip对应多个域名多个ssl证书配置-Nginx实现多域名证书HTTPS https://home.cnblogs.com/u/beyang/ 一台服务器,两个域名 首先购买https,获取到CA证 ...
随机推荐
- [CF373C]计算袋鼠是愉快的(Counting Kangaroos is Fun)-贪心
Problem 计算袋鼠是愉快的 题目大意 有n只袋鼠,如果一个袋鼠体积是另一个袋鼠的两倍或以上,则小袋鼠能被大袋鼠装进袋子里,装进去后就看不到袋子里的袋鼠了,问这群袋鼠如何行动才能使得它们看着数量最 ...
- hihocoder 1050 树中的最长路(动态规划,dfs搜索)
hihocoder 1050 树中的最长路(动态规划,dfs搜索) Description 上回说到,小Ho得到了一棵二叉树玩具,这个玩具是由小球和木棍连接起来的,而在拆拼它的过程中,小Ho发现他不仅 ...
- java窗口按钮位置设置
java窗口按钮位置设置 代码如下: package Day08; import java.awt.BorderLayout; import javax.swing.JButton;import ja ...
- SpringMVC+Mybatis+MySQL配置Redis缓存
SpringMVC+Mybatis+MySQL配置Redis缓存 1.准备环境: SpringMVC:spring-framework-4.3.5.RELEASE-dist Mybatis:3.4.2 ...
- linux下文件查找工具--find
常用的文件查找命令有:which,locate,find 1.which命令 查找二进制数或二进制命令,由PATH给出 2.loacte 特点: 1.非实时,每天在系统上生成数据库,通过数据库查询 2 ...
- 几种常见排序算法原理&C语言实现
一.冒泡排序(以下各法均以从小到大排序为例,定义len为数组array的长度) 原理:比较相邻元素的大小,对于每次循环,按排序的规则把最值移向数组的一端,同时循环次数依次减少. C代码实现 写法一: ...
- ServletAPI的获取
Action中获取ServletAPI,三种方式 (1)通过ActionContext获取(只是获取并操作了域空间,并不是真正的ServletAPI对象) 在struts2框架中,通过Action的执 ...
- Java实现简单文件过滤器
输入路径查找该路径下的指定文件类型的文件 代码思路: 想要循环遍历文件夹下所有子文件夹,就要用到递归. 首先判断路径是否存在: 是:获取文件 判断是否文件夹: 是:调用自身,继续获取子文件夹下内容 否 ...
- MongoDB增 删 改 查
增 增加单篇文档 > db.stu.insert({sn:'001', name:'lisi'}) WriteResult({ "nInserted" : 1 }) > ...
- efcore 配置链接sqlserver 记录
本文将在asp.net core api 项目中使用efcore corefirst模式 简单配置链接sqlserver数据库,以及简单的数据库迁移操作 一 新建项目 1. 首先我们先用vs2017 ...