在客戶端是https:// 協議下,使用ws:// 協議連線會報錯的,得需要使用wss:// 連線。(ip連線失敗時使用域名連線)
netty建立服務端時,在初始化channl時,把handler加入ChannelPipeline時,在最開始那個handler設為SslHandler:
SSLContext sslContext = SslUtil.createSSLContext(type ,path ,password); ///SslUtil自定義類
SSLEngine sslEngine = sslContext.createSSLEngine(); sslEngine.setUseClientMode(false); /// 是否使用客戶端模式 sslEngine.setNeedClientAuth(false); ////是否需要驗證客戶端
pipeline.addLast("ssl", new SslHandler(sslEngine));
SslUtil 類:
private static volatile SSLContext sslContext = null;
public static SSLContext createSSLContext(String type ,String path ,String password) throws Exception {
if(null == sslContext){
synchronized (SslUtil.class) {
if(null == sslContext){
KeyStore ks = KeyStore.getInstance(type); /// "JKS"
InputStream ksInputStream = new FileInputStream(path); /// 證書存放地址
ks.load(ksInputStream, password.toCharArray()); KeyManagerFactory kmf = KeyManagerFactory.getInstance(KeyManagerFactory.getDefaultAlgorithm()); kmf.init(ks, password.toCharArray()); SSLContext sslContext = SSLContext.getInstance("TLS"); sslContext.init(kmf.getKeyManagers(), null, null);
}
}
} return sslContext; }
自制證書:
#keytool -genkey -keysize 2048 -validity 365 -keyalg RSA -dnam e "CN=gornix.com" -keypass 654321 -storepass 123456 -keystore gornix.jks
keytool為JDK提供的生成證書工具
- -keysize 2048 金鑰長度2048位(這個長度的金鑰目前可認為無法被暴力破解)
- -validity 365 證書有效期365天
- -keyalg RSA 使用RSA非對稱加密演算法
- -dname "CN=gornix.com" 設定Common Name為gornix.com,這是我的域名
- -keypass 654321 金鑰的訪問密碼為654321
- -storepass 123456 金鑰庫的訪問密碼為123456(其實這兩個密碼也可以設定一樣,通常都設定一樣,方便記)
- -keystore gornix.jks 指定生成的金鑰庫檔案為gornix.jks