[5]AMQP(高级消息队列协议) ----如何创建自己的SSLContext对象

[4]AMQP(高级消息队列协议) ----改造QPID JMS-0.9 API 对 SSLContext的 支持(http://blog.csdn.net/chancein007/article/category/6294435)的一文中,提到了如何让QPID JMS 0.9 Java对自定义的SSLContext的支持,那么该如何测试呢?其实测试的核心就是如何创建SSLContext对象。

假设我们的KeyStore和TrustStore的相关证书都保存在了相应的JKS文件里面

String truststore_File_Path="D:/QpidSSL/clientts.jks";  
String truststore_password="123456";  
String keystore_File_Path="D:/QpidSSL/clientks.jks";  
String keystore_Password="123456";  
System.setProperty("javax.net.ssl.keyStore",keystore_File_Path);   
System.setProperty("javax.net.ssl.keyStorePassword",keystore_Password);   
System.setProperty("javax.net.ssl.trustStore",truststore_File_Path);   
System.setProperty("javax.net.ssl.trustStorePassword",truststore_password);  

那么该如何创建SSLContext的对象呢?

#1 首先大家来看一下客户端API的调用

                String truststore_File_Path="D:/QpidSSL/clientts.jks";
		String truststore_password="123456";
		String keystore_File_Path="D:/QpidSSL/clientks.jks";
		String keystore_Password="123456";
		String  aliasPassword="123456";
		SSLFactory sslFactory=new SSLFactory(keystore_File_Path,keystore_Password,truststore_File_Path,truststore_password,aliasPassword);
		try {
			SSLContext sslContext=sslFactory.buildSSLContext();
			CustomTransportSupport.mapSSLContext.put("amqps://stevenGu:5674", sslContext);
		} catch (UnrecoverableKeyException e1) {
			// TODO Auto-generated catch block
			e1.printStackTrace();
		} catch (KeyManagementException e1) {
			// TODO Auto-generated catch block
			e1.printStackTrace();
		} catch (KeyStoreException e1) {
			// TODO Auto-generated catch block
			e1.printStackTrace();
		} catch (NoSuchAlgorithmException e1) {
			// TODO Auto-generated catch block
			e1.printStackTrace();
		} catch (CertificateException e1) {
			// TODO Auto-generated catch block
			e1.printStackTrace();
		} catch (FileNotFoundException e1) {
			// TODO Auto-generated catch block
			e1.printStackTrace();
		} catch (IOException e1) {
			// TODO Auto-generated catch block
			e1.printStackTrace();
		}

#2 SSLFactory的代码如下

package com.test.amqp.ssl.sslcontext;

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.security.KeyManagementException;
import java.security.KeyStore;
import java.security.KeyStoreException;
import java.security.NoSuchAlgorithmException;
import java.security.UnrecoverableKeyException;
import java.security.cert.CertificateException;
import java.util.Arrays;

import javax.net.ssl.KeyManagerFactory;
import javax.net.ssl.SSLContext;
import javax.net.ssl.TrustManagerFactory;

public class SSLFactory {
	private String keystorePath;
	private String keystorePassword;
	private String trustStorePath;
	private String trustStorePassword;
	private String aliasPassword;
	public SSLFactory(String keystorePath,String keystorePassword,String trustStorePath,String trustStorePassword,String aliasPassword){
		this.keystorePath=keystorePath;
		this.keystorePassword=keystorePassword;
		this.trustStorePath=trustStorePath;
		this.trustStorePassword=trustStorePassword;
		this.aliasPassword=aliasPassword;
	}
	private SSLContext getSSLContext() throws NoSuchAlgorithmException {
        SSLContext c = null;

        // pick the first protocol available, preferring TLSv1.2, then TLSv1,
        // falling back to SSLv3 if running on an ancient/crippled JDK
        for(String proto : Arrays.asList("TLSv1.2", "TLSv1", "SSLv3")) {
            try {
                c = SSLContext.getInstance(proto);
                return c;
            } catch (NoSuchAlgorithmException x) {
                // keep trying
            }
        }
        throw new NoSuchAlgorithmException();
    }
	public SSLContext buildSSLContext() throws KeyStoreException, NoSuchAlgorithmException, CertificateException, FileNotFoundException, 
	IOException, UnrecoverableKeyException, KeyManagementException{
		
		 KeyStore ks = KeyStore.getInstance("JKS");
         ks.load(new FileInputStream(keystorePath), keystorePassword.toCharArray());
         KeyManagerFactory kmf = KeyManagerFactory.getInstance("SunX509");
         kmf.init(ks, aliasPassword.toCharArray());
		
		 KeyStore tks = KeyStore.getInstance("JKS");
         tks.load(new FileInputStream(trustStorePath), trustStorePassword.toCharArray());
         TrustManagerFactory tmf = TrustManagerFactory.getInstance("SunX509");
         tmf.init(tks);
         
         SSLContext c = getSSLContext();
         c.init(kmf.getKeyManagers(), tmf.getTrustManagers(), null);
         
         return c;
	}
}

是不是瞬间感觉高大上了,原来我们自己也能获得SSLContext的对象了。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值