JAVA版本微信红包发放系统HTTPS双向认证使用说明

 

现在邮件发出的文件有四个,分别是apiclient_cert.p12apiclient_cert.pemapiclient_key.pemrootca.pem

apiclient_cert.p12
包含了私钥信息的证书文件,为p12(pfx)格式,由微信支付签发给您用来标识和界定您的身份,请妥善保管不要泄漏和被他人复制
部分安全性要求较高的API需要使用该证书来确认您的调用身份
windows
上可以直接双击导入系统,导入过程中会提示输入证书密码,证书密码默认为您的商户ID(如:10010000

apiclient_cert.pem
apiclient_cert.p12中导出证书部分的文件,为pem格式,请妥善保管不要泄漏和被他人复制
部分开发语言和环境,不能直接使用p12文件,而需要使用pem,所以为了方便您使用,已为您直接提供;您也可以使用openssl命令来自己导出:openssl pkcs12 -clcerts -nokeys -in apiclient_cert.p12 -out apiclient_cert.pem

apiclient_key.pem
apiclient_cert.p12中导出密钥部分的文件,为pem格式,请妥善保管不要泄漏和被他人复制
部分开发语言和环境,不能直接使用p12文件,而需要使用pem,所以为了方便您使用,已为您直接提供;您也可以使用openssl命令来自己导出:openssl pkcs12 -nocerts -in apiclient_cert.p12 -out apiclient_key.pem

rootca.pem
微信支付api服务器上也部署了证明微信支付身份的服务器证书,您在使用api进行调用时也需要验证所调用服务器及域名的真实性,该文件为签署微信支付证书的权威机构的根证书,可以用来验证微信支付服务器证书的真实性
某些环境和工具已经内置了若干权威机构的根证书,无需引用该证书也可以正常进行验证,这里提供给您在未内置所必须根证书的环境中载入使用

 

 

 

https双向认证上述文件使用说明:

 

问:什么是双向认证?

 

答:双向认真顾名思义,就是指服务器与客户端进行通信的时候,两者相互进行签名校验,以确保双方身份,映射到上述四个文件,既服务器验证客户端的时候通过客户端证书和签名(既:apiclient_cert.p12 或者 apiclient_cert.pemapiclient_key.pem),客户端验证服务器通过ca的根证书进行(rootca.pem),根证书有些操作系统上或者开发环境中已经包含,此时不需要导入,但如果找不到跟证书时则需要使用rootca.pem

 

 

 

<!--[if !supportLists]-->1、<!--[endif]-->如果基于curl调用https访问接口,(如:c++php等语言使用libcurl访问)

 

需要使用到上述的piclient_cert.pemapiclient_key.pem文件,当找不到ca根证书的时候还需要rootca.pem文件。

 

使用如下:(phpc++类似)

 

 curl_setopt($ch,CURLOPT_SSL_VERIFYPEER,false);

 

 curl_setopt($ch,CURLOPT_SSL_VERIFYHOST,false)

 

 curl_setopt($ch,CURLOPT_SSLCERT,getcwd().'/apiclient_cert.pem);

 

 curl_setopt($ch,CURLOPT_SSLKEY,getcwd().'/apiclient_key.pem');

 

 curl_setopt($ch,CURLOPT_CAINFO,'rootca.pem');

 

 

 

<!--[if !supportLists]-->2、<!--[endif]-->JAVA使用证书文件

 

JAVA只需要使用apiclient_cert.p12即可,如果使用JAVA语言进行开发的可以忽略其余三个pem格式的文件。

 

使用如下:

 

//指定读取证书格式为PKCS12
KeyStore keyStore = KeyStore.getInstance("PKCS12");
//
读取本机存放的PKCS12证书文件
FileInputStream instream = new FileInputStream(new File("D:/apiclient_cert.p12"));
try {
//
指定PKCS12的密码(商户ID)
keyStore.load(instream, "10010000".toCharArray());
} finally {
instream.close();
}
SSLContext sslcontext = SSLContexts.custom()
.loadKeyMaterial(keyStore, "10010000".toCharArray()).build();
//
指定TLS版本
SSLConnectionSocketFactory sslsf = new SSLConnectionSocketFactory(
sslcontext,new String[] { "TLSv1" },null,
SSLConnectionSocketFactory.BROWSER_COMPATIBLE_HOSTNAME_VERIFIER);
//
设置httpclientSSLSocketFactory
CloseableHttpClient httpclient = HttpClients.custom()
.setSSLSocketFactory(sslsf)
.build();

 

 

 

<!--[if !supportLists]-->3、<!--[endif]-->C#使用证书

 

C#使用证书默认使用操作系统以导入的证书,即在操作系统上按装apiclient_cert.p12即可。C#也可以忽略其他三个pem文件。

 

使用如下:

 

string cert = @"R:\apiclient_cert.p12";
string password = "10010000";
ServicePointManager.ServerCertificateValidationCallback=new RemoteCertificateValidationCallback(CheckValidationResult);
X509Certificate cer = new X509Certificate(cert, password);
HttpWebRequest webrequest = (HttpWebRequest)HttpWebRequest.Create(url);
webrequest.ClientCertificates.Add(cer);
webrequest.Method = "post";
HttpWebResponse webreponse = (HttpWebResponse)webrequest.GetResponse();
Stream stream = webreponse.GetResponseStream();

/*CheckValidationResult
的定义*/
private static bool CheckValidationResult(object sender, X509Certificate certificate, X509Chain chain, SslPolicyErrors errors)
{
if (errors == SslPolicyErrors.None)
return true;
return false;
}

 

注意:C#有一点需要注意,除了在代码中使用apiclient_cert.p12之外还需要将该证书导入操作系统才能使用,1、代码中使用、;2、导入操作系统,二者缺一不可。.NET版本需要大于2.0

 

本页内容版权归属为原作者,如有侵犯您的权益,请通知我们删除。
查阅地址: http://ifeve.com/java-memory-model-3/ 数据竞争    1、当一个线程写数据的同时,另一个线程在读这个数据,并且没有进行同步,就会产生数据竞争    2、如果程序正确同步,那么程序执行会具有顺序一致性,它与顺序一致性的执行结果相同 顺序一致性    1、顺序一致性是理想模型    2、无论同步与否,每个操作的执行结果会对后来要执行的操作可见 JMM未同步执行特征    1、 JMM只保证最小的安全性:数据不会无中生有,它会在初始化时清空数据,并初始化为(0,n

【转】java Lock 简介 - 2015-05-25 06:05:12

Java并发编程:Lock 在上一篇文章中我们讲到了如何使用关键字synchronized来实现同步访问。本文我们继续来探讨这个问题,从Java 5之后,在java.util.concurrent.locks包下提供了另外一种方式来实现同步访问,那就是Lock。 也许有朋友会问,既然都可以通过synchronized来实现同步访问了,那么为什么还需要提供Lock?这个问题将在下面进行阐述。本文先从synchronized的缺陷讲起,然后再讲述java.util.concurrent.locks包下常用的有
如果没有看过List或者两个常用的实现类ArrayList、LinkedList的subList()方法的源码,而只是通过API文档,那么很多朋友很容易调入一个陷阱。或者有些朋友根据String的subString()方法来推测,List的subList()方法应该和String的subString()方法类似吧。的确,subList()得到的结果确实是该List的一个子list,这没有错,但是在得到该子list的同时,系统还做了一件隐蔽的事情,那就是,将该子List(我们称作LIst B)内部的一个重要

2、java类与对象 - 2015-05-24 14:05:27

一、类的创建及初始化 类通常是一类事物的抽象,如人就是一个类,你、我、他是这个类的具体实例,也就是对象。在Java中我们可以通过形如:class A {}来创建一个类,我们说过Java是面向对象的语言,每个对象都应该拥有它自己的属性和方法,就拿人来说,肤色、身高等是人的属性,吃、喝、玩等都是方法,也就是说属性描绘了类的特点,而方法描述了类的功能,体现在Java的类中就像下面的代码这样: class People{     private int age;     eat();  }  在面向对象的思想中,一
大家可以用这个代码边看边验证,注意的是,运行这个程序需要通过javaagent注入Instrumentation,具体可以看原博客。我今天主要是总结下手动计算Java对象占用字节数的基本规则,做为基本的技能必须get√,希望能帮到和我一样的Java菜鸟 1.png 2.png 3.png 在介绍之前,简单回顾下,Java对象的内存布局:对象头(Header),实例数据(Instance Data)和对齐填充(Padding),详细的可以看我的读书笔记。另外:不同的环境结果可能有差异,我所在的环境是HotSp

地域统计 测试 - 2015-05-24 11:05:11

地域统计 测试       package com.sq.test;import org.json.JSONArray;import org.json.JSONObject;import com.cmcc.sq.utilities.Constants;import com.cmcc.sq.utilities.JSONArrayProcessHelper;/** * pre *----the day before yesterday----------------------------- * 北京 1 1

jdk环境变量配置 - 2015-05-24 11:05:05

进行java开发,首先要安装jdk,安装了jdk后还要进行环境变量配置: 1、下载jdk(http://java.sun.com/javase/downloads/index.jsp),我下载的版本是:jdk-7u79-windows-x64.exe 2、安装jdk-7u79-windows-x64.exe 3、配置环境变量:右击"计算机"--"属性"--"高级系统设置"--"环境变量" 1)在系统变量里新建JAVA_HOME变量,变量值为:C:\Program Files\Java\jdk1.7.0_79

Spring MVC中上传文件实例 - 2015-05-24 11:05:02

SpringMVC(注解)上传文件需要注意的几个地方: 1、form的enctype="multipart/form-data",这个是上传文件必须的 2、applicationContext.xml配置: 复制代码 代码如下: !-- SpringMVC上传文件时,需要配置MultipartResolver处理器 -- bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipart

Spark开发指南 - 2015-05-24 10:05:21

目录 Spark开发指南 简介 接入Spark Java 初始化Spark Java 弹性分布式数据集 并行集合 外部数据集 RDD操作 基本操作 传递Functions到Spark Wroking with Key-Value Pairs使用键/值对工作 转换 动作 RDD持久化 存储级别的选择 移除数据 共享变量 Spark开发指南 简介 总的来说,每一个Spark应用程序,都是由一个驱动程序组成,它运行用户的main函数,并且在一个集群上执行各种各样的并行操作。Spark提 供的主要的抽象(概念)是

DES加解密 - 2015-05-24 10:05:20

  package com.my.framework.util;import java.io.IOException;import java.io.UnsupportedEncodingException;import java.security.InvalidKeyException;import java.security.NoSuchAlgorithmException;import java.security.SecureRandom;import java.security.spec.Inval