设为首页 收藏本站
查看: 711|回复: 0

[经验分享] Eclipse RCP中SSL方式连接Tomcat

[复制链接]

尚未签到

发表于 2018-12-2 09:34:51 | 显示全部楼层 |阅读模式
最近产品中需要在RCP中通过SSL方式来访问Tomcat下的应用,查阅了一些资料经过调试,最终连接成功,整理过程如下

一.使用java的keytool来生成keystore和证书


1、生成服务器证书库

  

keytool -validity 365 -genkey -v -alias server -keyalg RSA -keystore D:\ssl\server.keystore -dname "CN=127.0.0.1,OU=disoft,O=disoft,L=ChaoYang,ST=Beijing,c=cn" -storepass 123456 -keypass 123456

  

2、生成客户端证书库

  

keytool -validity 365 -genkeypair -v -alias client -keyalg RSA -storetype PKCS12 -keystore D:\ssl\client.p12 -dname "CN=client,OU=disoft,O=disoft,L=ChaoYang,ST=Beijing,c=cn" -storepass 123456 -keypass 123456

  

3、从客户端证书库中导出客户端证书

  

keytool -export -v -alias client -keystore D:\ssl\client.p12 -storetype PKCS12 -storepass 123456 -rfc -file D:\ssl\client.cer

  

4、从服务器证书库中导出服务器证书

  

keytool -export -v -alias server -keystore D:\ssl\server.keystore -storepass 123456 -rfc -file D:\ssl\server.cer

  

5、生成客户端信任证书库(由服务端证书生成的证书库)

  

keytool -import -v -alias server -file D:\ssl\server.cer -keystore D:\ssl\client.truststore -storepass 123456

  

6、将客户端证书导入到服务器证书库(使得服务器信任客户端证书)

  

keytool -import -v -alias client -file D:\ssl\client.cer -keystore D:\ssl\server.keystore -storepass 123456

之后ssl文件夹下会有5个文件,分别是server.keystore,client.p12,client.cer,server.cer,client.truststore

注意:其中的server.keystore既是服务器的证书库,又作为服务器端对客户端的信任证书库.

步骤1中的CN最好使用IP地址,通过这个IP地址对支持SSL的server进行访问.

之后双击client.cer对客户端证书进行导入以支持浏览器的访问

用keytool生成的证书是私人的证书,并不是权威CA机构颁发的证书,但是并不影响开发。

二.配置Tomcat的SSL

Tomcat的server.xml文件需要进行相应的配置,默认这段是注释掉的,启用即可


上面的clientAuth="true"这样的设置是说明需要支持SSL双向认证.keystoreFile和keystorePass配置好自己server的keystore的路径和密码.

启动tomcat,通过https://127.0.0.1:8443 来访问

三.Eclipse RCP中通过SSL连接server

直接上代码


private static SSLContext getSSLContext() {
if (sslcontext == null) {
try {
String keystorePath = System.getProperty(TAC_SSL_SYSTEM_KEY);
String keyStorePass = System.getProperty(TAC_SSL_SYSTEM_PASS);
if (keystorePath == null) {
// if user does not set the keystore path in the .ini,we need to look for the keystore file under
// the root dir of product
String userDir = System.getProperty("user.dir");
File keystorePathFile = new File(userDir + "/" + TAC_SSL_KEYSTORE);
keystorePath = keystorePathFile.getAbsolutePath();
}
if (keyStorePass == null) {
// if user does not set the password in the .ini,we only can make it empty by
// default,but not sure the ssl can connect
keyStorePass = "";
}
File keystoreFile = new File(keystorePath);
if (!keystoreFile.canRead()) {
throw new RuntimeException("Can't find or read the SSL Keystore file at: '" + keystoreFile.getAbsolutePath()
+ "'");
}
sslcontext = SSLContext.getInstance("SSL");
KeyManagerFactory kmf = KeyManagerFactory.getInstance("SunX509");
TrustManagerFactory tmf = TrustManagerFactory.getInstance("SunX509");
KeyStore ks = KeyStore.getInstance("JKS");
KeyStore tks = KeyStore.getInstance("JKS");
ks.load(new FileInputStream(keystorePath), keyStorePass.toCharArray());
tks.load(new FileInputStream(keystorePath), keyStorePass.toCharArray());
kmf.init(ks, keyStorePass.toCharArray());
tmf.init(tks);
sslcontext.init(kmf.getKeyManagers(), tmf.getTrustManagers(), null);
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
} catch (KeyManagementException e) {
e.printStackTrace();
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
return sslcontext;
}
上述代码是用来初始化SSL上下文,可以将生成的keystore(这里仍然是server.keystore)的路径和密码配置在RCP产品中的*.ini文件(相当于Eclipse中VM Argument的参数配置)里面,使用的时候用系统属性进行读取.


public static String getContent(String adminUrl, String urlString) throws PersistenceException {
StringBuffer buffer = new StringBuffer();
try {
URL url = new URL(adminUrl + urlString);
BufferedReader in = null;
if (adminUrl.startsWith("https://")) {
final SSLSocketFactory socketFactory = getSSLContext().getSocketFactory();
HttpsURLConnection httpsCon = (HttpsURLConnection) url.openConnection();
httpsCon.setSSLSocketFactory(socketFactory);
httpsCon.setHostnameVerifier(new HostnameVerifier() {
@Override
public boolean verify(String arg0, SSLSession arg1) {
return true;
}
});
httpsCon.connect();
in = new BufferedReader(new InputStreamReader(httpsCon.getInputStream()));
} else {
in = new BufferedReader(new InputStreamReader(url.openStream()));
}
String inputLine;
while ((inputLine = in.readLine()) != null) {
buffer.append(inputLine);
}
in.close();
} catch (Exception e) {
throw new PersistenceException("Unable to access to url : " + adminUrl);
}
return buffer.toString();
}
上述代码用java的HttpsURLConnection来建立SSL连接.
整个配置过程结束,成功连接.





运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-642247-1-1.html 上篇帖子: Tomcat结合memcached实现sessio共享 下篇帖子: Tomcat配置环境变量
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表