Spring IBM MQ SSL双向加密通信

对于IBM MQ 怎么使用SSL来保护通道,请转官网查看

官网链接地址:https://www.ibm.com/support/knowledgecenter/zh/SSFKSJ_8.0.0/com.ibm.mq.explorer.doc/e_ssl.htm

之前我开始处理的时候也是看了很多官网的文档,还有想安装了去测试的,直接到官网下载一个版本安装就好,有30天的试用期,我也就是在那30天里面,充分利用了。

下面我也只上部分代码,因为主要的还是要自己去实践,去学习,去研究才能有更大的收获

1. spring.xml配置


    
        
        
        
        
        
        
		
        
		
			
				
			 	
			 	
			 	
			
		
		
    

2. sslContextFactory

/** 
* @ClassName: SSLContextFactory 
* @Description: 创建SSL双向连接
* @author kz 
* @date Jul 11, 2018 11:20:17 AM 
*  
*/
public class SSLContextFactory {
		private Logger logger = LoggerFactory.getLogger(getClass());
	/** 
	* @Fields ctx : 安全套接字协议 SSLSocketFactory、SSLServerSocketFactory和SSLEngine的工厂
	*/ 
	private SSLContext ctx = null;
	/** 
	* @Fields protocal : 安全传输协议 
	*/ 
	@Value("${ssl.protocal}")
	private String protocal;
	/** 
	* @Fields algorithm :ibm jdk 加密算法
	*/
	@Value("${ssl.algorithm}")
	private String algorithm;
	/** 
	* @Fields keyStoreType : 密钥库类型
	*/
	@Value("${ssl.keyStoreType}")
	private String keyStoreType;
	
	/** 
	* @Fields keyStorePassword : 密钥库密码 
	*/
	@Value("${ssl.keyStore.password}")
	private String keyStorePassword;
	
	/** 
	* @Fields sslSocketFactory : SSLSocket的工厂
	*/ 
	private SSLSocketFactory sslSocketFactory = null;
	
	/** 
	* @Fields privateKeyPath : 私钥文件路径
	*/ 
	@Value("${ssl.privateKey.path}")
	private String privateKeyPath;
	
	/** 
	* @Fields publicKeyPath : 公钥文件路径
	*/ 
	@Value("${ssl.publicKey.path}")
	private String publicKeyPath;
	
	


	public SSLSocketFactory getSSLSocketFactory() {
		try {
			//获取SSLContext的实例
    		ctx = SSLContext.getInstance(protocal);
    		SSLContext.setDefault(ctx);
    		//JSSE密钥管理器
        	KeyManagerFactory kmf = KeyManagerFactory.getInstance(algorithm);
        	//信任管理器
        	TrustManagerFactory tmf = TrustManagerFactory.getInstance(algorithm);
        	//密钥存储密钥库
        	KeyStore ks = KeyStore.getInstance(keyStoreType);
        	//信任密钥存储密钥库
        	KeyStore tks = KeyStore.getInstance(keyStoreType);        	
        	//加载客户端私钥文件 使用私钥加密
        	ks.load(new FileInputStream(CommonUtils.getClassLoadPath()+privateKeyPath), keyStorePassword.toCharArray());
        	//加载公钥文件 使用公钥文件解密
        	tks.load(new FileInputStream(CommonUtils.getClassLoadPath()+publicKeyPath), keyStorePassword.toCharArray());
        	
        	kmf.init(ks, keyStorePassword.toCharArray());
        	tmf.init(tks);
        	TrustManager[] tm = tmf.getTrustManagers();
        	//X509TrustManager为TrustManager的子接口,管理X509证书,验证远程安全套接字
        	final X509TrustManager[] x509tm = Arrays.asList(tm).toArray(new X509TrustManager[tm.length]);
        	X509TrustManager[] x509tmArray = new X509TrustManager[] {
    				new X509TrustManager() {
						/* (non Javadoc) 
						 * @Title: getAcceptedIssuers
						 * @Description:  返回受身份验证同位体信任的认证中心的数组
						 * @return 
						 * @see javax.net.ssl.X509TrustManager#getAcceptedIssuers() 
						 */
						@Override
						public X509Certificate[] getAcceptedIssuers() {
							return x509tm[0].getAcceptedIssuers();
						}
						
						/* (non Javadoc) 
						 * @Title: checkClientTrusted
						 * @Description: 给出同位体提供的部分或完整的证书链,构建到可任的根的证书路径,并且返回是否可以确认和信任将其用于基于身份验证类型的客户端 SSL 身份验证
						 * @param chain
						 * @param authType
						 * @throws CertificateException 
						 * @see javax.net.ssl.X509TrustManager#checkClientTrusted(java.security.cert.X509Certificate[], java.lang.String) 
						 */ 
						@Override
						public void checkClientTrusted(X509Certificate[] chain, String authType){
							for(int i=0;i>Check client cert"+i+"/"+authType+"<<--");
							}
							try {
								x509tm[0].checkClientTrusted(chain, authType);
							} catch (CertificateException e) {
								logger.error("Check client Cert Exception:"+e.getMessage(),e);
							}
						}
						
						/* (non Javadoc) 
						 * @Title: checkServerTrusted
						 * @Description: 给出同位体提供的部分或完整的证书链,构建到可任的根的证书路径,并且返回是否可以确认和信任将其用于基于身份验证类型的服务器 SSL 身份验证
						 * @param chain 证书链
						 * @param authType 使用的密钥交换算法 RSAwith256
						 * @throws CertificateException 此证书链不受trustManager信任
						 * @see javax.net.ssl.X509TrustManager#checkServerTrusted(java.security.cert.X509Certificate[], java.lang.String) 
						 */ 
						@Override
						public void checkServerTrusted(X509Certificate[] chain, String authType){
							for(int i=0;i>Check server cert"+i+"/"+authType+"<<--");
							}
							try {
								x509tm[0].checkServerTrusted(chain, authType);
								logger.info("finish check server cert");
							} catch (CertificateException e) { 
								logger.error("Check server Cert Exception:"+e.getMessage(),e);
								e.printStackTrace();
							}
						}
					}
    		}; 
        	//初始化实例
        	ctx.init(kmf.getKeyManagers(), x509tmArray, null);
//        	SSLEngine en = ctx.createSSLEngine();
    		//返回支持的加密套件
//    		logger.info("Support CipherSuites:"+Arrays.asList(en.getSupportedCipherSuites()));
    		//返回启用的加密套件
//    		logger.info("Used CipherSuites:"+Arrays.asList(en.getEnabledCipherSuites()));
    	} catch (Exception e) {
			e.printStackTrace();
			logger.error("create ssl connection failure:"+e.getMessage(),e);
		}
		sslSocketFactory = ctx.getSocketFactory();
		return sslSocketFactory;
	}
}

3. properties配置文件中的配置信息

#ssl 安全传输协议 
ssl.protocal=TLSv1.2
#ssl 加密套件
ssl.cipherSuite=SSL_RSA_WITH_AES_256_CBC_SHA256
#从对等队列管理器检查证书的专有名称
ssl.server1.sslPeerName=这里就不贴出具体值了
#ssl 加密算法
ssl.algorithm=IBMX509
#ssl 密钥库类型
ssl.keyStoreType=PKCS12
#ssl 密钥库密码
ssl.keyStore.password=这里就不贴出具体值了
ssl.fipsRequired=true
#私钥jks密钥文件路径
ssl.privateKey.path=这里就不贴出具体值了
#公钥jks密钥文件路径
ssl.publicKey.path=这里就不贴出具体值了
​

关于 fipsRequired的设置,请参考官网给出的说明

Spring IBM MQ SSL双向加密通信_第1张图片

你可能感兴趣的:(IBM,MQ)