當前位置:
首頁 > 知識 > Netty SSL安全配置

Netty SSL安全配置

本文主要介紹一下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=Hikvision/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=Hikvision, 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 hummer@123 -noprompt

導入服務端證書


keytool -keystore gateway.keystore -importcert -alias server -file gateway.pem -storepass hummer@123

客戶端證書生成方法與服務端基本相同,此處不再贅述,需要注意一點的是簽名根證書必須是同一個

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 應用他們的邏輯到數據後加密後才發生,從而確保他們的變化是安全的。

Netty SSL安全配置

圖片來自網路


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"};


更多優質內容推薦:

2017優就業就業促進計劃:http://www.ujiuye.com/zt/jycj/?wt.bd=zdy35845tt

學IT,用周末給自己加薪!

http://www.ujiuye.com/zt/zmb/?wt.bd=zdy35845tt

IT職業教育:http://xue.ujiuye.com/

喜歡這篇文章嗎?立刻分享出去讓更多人知道吧!

本站內容充實豐富,博大精深,小編精選每日熱門資訊,隨時更新,點擊「搶先收到最新資訊」瀏覽吧!


請您繼續閱讀更多來自 IT優就業 的精彩文章:

STM32F030系列實現仿位帶操作
您已收到告白簡訊,請注意查收!

TAG:IT優就業 |

您可能感興趣

netty整合springMVC,實現高效的HTTP服務請求
Netty實戰十一之預置的ChannelHandler和編解碼器
Netty-整合Protobuf高性能數據傳輸
Netty-網路IO模型
基於Netty的Android系統IM簡單實現原理
基於netty構建API網關
Netty解決TCP粘包和拆包問題的四種方案
Netty實戰四之傳輸
圖說Netty服務端啟動過程
從微博motan看rpc基於netty4遠程通訊設計5-協議編解碼與序列化
Netty 從入門到精通(一)
Netty 實戰:如何編寫一個麻小俱全的 web 框架
Netty學習和進階策略
Netty 從入門到精通(二)
從微博motan看rpc基於netty4遠程通訊設計4-同步非同步返回結果處理
Netty堆外內存泄露排查與總結
Netty實戰十之編解碼器框架
《Pnetty》美容雜誌發布實用護膚品排行榜10強
如何使用Netty技術設計一個百萬級的消息推送系統
大神是如何理解Netty裡面的構件的?