weblogic host name varify ssl

出问题的代码如下:

package com.hotel.app.account.h5alipy.util;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.URL;
import java.util.Map;

import org.apache.commons.httpclient.HttpClient;
import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.client.ClientProtocolException;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.DefaultHttpClient;
import org.dom4j.Document;
import org.dom4j.DocumentHelper;

import com.hotel.app.account.h5alipy.config.AlipayConfig;
import com.hotel.app.account.h5alipy.sign.MD5;
import com.hotel.app.account.h5alipy.sign.RSA;


/* *
 *类名:AlipayNotify
 *功能:支付宝通知处理类
 *详细:处理支付宝各接口通知返回
 *版本:3.3
 *日期:2012-08-17
 *说明:
 *以下代码只是为了方便商户测试而提供的样例代码,商户可以根据自己网站的需要,按照技术文档编写,并非一定要使用该代码。
 *该代码仅供学习和研究支付宝接口使用,只是提供一个参考

 *************************注意*************************
 *调试通知返回时,可查看或改写log日志的写入TXT里的数据,来检查通知返回是否正常
 */
public class AlipayNotify {

    /**
     * 支付宝消息验证地址
     */
    private static final String HTTPS_VERIFY_URL = "https://mapi.alipay.com/gateway.do?service=notify_verify&";
    
    /**
     * 验证消息是否是支付宝发出的合法消息,验证callback
     * @param params 通知返回来的参数数组
     * @return 验证结果
     */
    public static boolean verifyReturn(Map<String, String> params) {
	    String sign = "";
	    //获取返回时的签名验证结果
	    if(params.get("sign") != null) {sign = params.get("sign");}
	    //验证签名
	    boolean isSign = getSignVeryfy(params, sign, true);

        //写日志记录(若要调试,请取消下面两行注释)
        //String sWord = "isSign=" + isSign + "\n 返回回来的参数:" + AlipayCore.createLinkString(params);
	    //AlipayCore.logResult(sWord);

        //判断isSign是否为true
        //isSign不是true,与安全校验码、请求时的参数格式(如:带自定义参数等)、编码格式有关
        if (isSign) {
            return true;
        } else {
            return false;
        }
    }

    /**
     * 验证消息是否是支付宝发出的合法消息,验证服务器异步通知
     * @param params 通知返回来的参数数组
     * @return 验证结果
     */
    public static boolean verifyNotify(Map<String, String> params) throws Exception {
    	
    	//获取是否是支付宝服务器发来的请求的验证结果
    	String responseTxt = "true";
    	try {
        	//XML解析notify_data数据,获取notify_id
	    	Document document = DocumentHelper.parseText(params.get("notify_data"));
	    	String notify_id = document.selectSingleNode( "//notify/notify_id" ).getText();
			responseTxt = verifyResponse(notify_id);
    	} catch(Exception e) {
    		responseTxt = e.toString();
    	}
    	
    	//获取返回时的签名验证结果
	    String sign = "";
	    if(params.get("sign") != null) {sign = params.get("sign");}
	    boolean isSign = getSignVeryfy(params, sign,false);

        //写日志记录(若要调试,请取消下面两行注释)
        //String sWord = "responseTxt=" + responseTxt + "\n isSign=" + isSign + "\n 返回回来的参数:" + AlipayCore.createLinkString(params);
	    //AlipayCore.logResult(sWord);

        //判断responsetTxt是否为true,isSign是否为true
        //responsetTxt的结果不是true,与服务器设置问题、合作身份者ID、notify_id一分钟失效有关
        //isSign不是true,与安全校验码、请求时的参数格式(如:带自定义参数等)、编码格式有关
        if (isSign && responseTxt.equals("true")) {
            return true;
        } else {
            return false;
        }
    }
    
    /**
     * 解密
     * @param inputPara 要解密数据
     * @return 解密后结果
     */
    public static Map<String, String> decrypt(Map<String, String> inputPara) throws Exception {
    	inputPara.put("notify_data", RSA.decrypt(inputPara.get("notify_data"), AlipayConfig.private_key, AlipayConfig.input_charset));
    	return inputPara;
    }

    /**
     * 根据反馈回来的信息,生成签名结果
     * @param Params 通知返回来的参数数组
     * @param sign 比对的签名结果
     * @param isSort 是否排序
     * @return 生成的签名结果
     */
	private static boolean getSignVeryfy(Map<String, String> Params, String sign, boolean isSort) {
    	//过滤空值、sign与sign_type参数
    	Map<String, String> sParaNew = AlipayCore.paraFilter(Params);
        //获取待签名字符串
    	String preSignStr = "";
    	if(isSort) {
    		preSignStr = AlipayCore.createLinkString(sParaNew);
    	} else {
    		preSignStr = AlipayCore.createLinkStringNoSort(sParaNew);
    	}
        //获得签名验证结果
        boolean isSign = false;
        if(AlipayConfig.sign_type.equals("MD5") ) {
        	isSign = MD5.verify(preSignStr, sign, AlipayConfig.key, AlipayConfig.input_charset);
        }
        if(AlipayConfig.sign_type.equals("0001")){
        	isSign = RSA.verify(preSignStr, sign, AlipayConfig.ali_public_key, AlipayConfig.input_charset);
        }
        return isSign;
    }

    /**
    * 获取远程服务器ATN结果,验证返回URL
    * @param notify_id 通知校验ID
    * @return 服务器ATN结果
    * 验证结果集:
    * invalid命令参数不对 出现这个错误,请检测返回处理中partner和key是否为空 
    * true 返回正确信息
    * false 请检查防火墙或者是服务器阻止端口问题以及验证时间是否超过一分钟
    */
    private static String verifyResponse(String notify_id) {
        //获取远程服务器ATN结果,验证是否是支付宝服务器发来的请求

        String partner = AlipayConfig.partner;
        String veryfy_url = HTTPS_VERIFY_URL + "partner=" + partner + "¬ify_id=" + notify_id;

        return checkUrl(veryfy_url);
    }

    /**
    * 获取远程服务器ATN结果
    * @param urlvalue 指定URL路径地址
    * @return 服务器ATN结果
    * 验证结果集:
    * invalid命令参数不对 出现这个错误,请检测返回处理中partner和key是否为空 
    * true 返回正确信息
    * false 请检查防火墙或者是服务器阻止端口问题以及验证时间是否超过一分钟
    */
    private static String checkUrl(String urlvalue) {
        String inputLine = "";

        try {
           URL url = new URL(urlvalue);
            HttpURLConnection urlConnection = (HttpURLConnection) url.openConnection();
            BufferedReader in = new BufferedReader(new InputStreamReader(urlConnection
                .getInputStream()));
            inputLine = in.readLine().toString();
        /*	StringBuffer result = new StringBuffer();
        	DefaultHttpClient httpClient = new DefaultHttpClient();
        	// 使用的请求方式是GET
        	HttpGet httpGet = new HttpGet(urlvalue);
        	try{
        	HttpResponse response = httpClient.execute(httpGet);
        	HttpEntity httpEntity = response.getEntity();
        	if(httpEntity != null) {
        	InputStream inputStream = httpEntity.getContent();
        	byte[] responseByte = new byte[2048];
        	int len = 0;
        	while((len = inputStream.read(responseByte)) != -1) {
        	result.append(new String(responseByte, 0, len));
        	}
        	}
        	} catch(ClientProtocolException e) {
        	e.printStackTrace();
        	} catch(IOException e) {
        	e.printStackTrace();
        	} finally{
        	// 关闭http请求
        	httpClient.getConnectionManager().shutdown();
        	}*/
        	
        	//return result.toString();
       } catch (Exception e) {
            e.printStackTrace();
            inputLine = "";
        }

        return inputLine;
    }
}
服务器为weblogic时 <span style="font-family: 宋体, 'Arial Narrow', arial, serif;">private static String checkUrl(String urlvalue) 该方法有问题,提示ssl验证有问题</span>
1.解决方法 修改weblogic 服务器的ssl配置,将其服务器名验证 选择 无

2.解决方案

另一种方式是为weblogic自定义一个主机名校验器,并为服务器做“定制主机名验证器”的相关配置。
自定义校验器的代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
package verifier;
import javax.net.ssl.SSLSession;
import weblogic.security.SSL.HostnameVerifier;
/**
* 自定义的主机名验证类
* @since 2013-10-14
* @version 1.0.0
*/
public class CustomerVerifier  implements HostnameVerifier {
/**
* 验证方法。
* @since 2013-10-14
* @param arg0
* @param arg1
* @return
* @see weblogic.security.SSL.HostnameVerifier#verify(java.lang.String,
* javax.net.ssl.SSLSession)
*
*/
@Override
public boolean verify(String arg0, SSLSession arg1) {
System.out.println( "this is the CustomerVerifier by Loy, arg0 = "
+ arg0 +  ", arg1 = " + arg1);
return true ;
}
}


在服务器上做如下配置:
1、主机名验证选项选择“定制主机名验证器”;
2、“定制主机名验证器:”输入框中输入自定义的类的全路径类名,如“verifier.CustomerVerifier”;
3、将自定义类的class文件放到weblogic服务器的ClassPath下,如将其导出为jar包,并在weblogic启动脚本中加入配置:set CLASSPATH=%CLASSPATH%;D:\bea\user_projects\domains\car_domain_10\lib\CustomerVerifier.jar

配置完成后,重启服务器,然后再次运行最早的那段会抛出异常的代码。正常情况下,这个请求就能够获得返回数据了。



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值