方式1:
使用javax.security.cert.X509Certificate进行解析
URL url = Demo.class.getClassLoader().getResource("C000024.crt"); //证书路径
System.out.println("公钥所在路径:"+url.getFile());
X509Certificate cert = X509Certificate.getInstance(new FileInputStream(url.getFile()));
PublicKey publicKey = cert.getPublicKey();
BASE64Encoder base64Encoder=new BASE64Encoder();
String publicKeyString = base64Encoder.encode(publicKey.getEncoded());
System.out.println("-----------------公钥--------------------");
System.out.println(publicKeyString);
System.out.println("-----------------公钥--------------------");
方式2:
使用java.security.cert.X509Certificate进行解析
URL url = Demo.class.getClassLoader().getResource("C000024.crt"); //证书路径
System.out.println("公钥所在路径:"+url.getFile());
CertificateFactory cf = CertificateFactory.getInstance("X.509");
X509Certificate cert = (X509Certificate)cf.generateCertificate(new FileInputStream(url.getFile()));
PublicKey publicKey = cert.getPublicKey();
BASE64Encoder base64Encoder=new BASE64Encoder();
String publicKeyString = base64Encoder.encode(publicKey.getEncoded());
System.out.println("-----------------公钥--------------------");
System.out.println(publicKeyString);
System.out.println("-----------------公钥--------------------");
说明:
因为只做示例,没有进行异常处理和流的释放,方式1的代码可能少点,方式2需要强转,美观上可能方式1更好看点,但方式1的实质还是调用的方式2,方式2内部有实现缓存策略。更多可以参考下api文档,文档上有提供示例。
补充:JAVA生成RSA公钥和私钥及RSA对数据的加签和验签
背景:
最近来到了新的公司,公司做的是保险支付相关业务,对接渠道的时候经常会用到数据的加签和验签,初次涉及RSA加签验签,通过网站生成了RSA公钥和私钥,用私钥将我要传送的数据进行了加签,并将我的公钥提供给了渠道方进行验签,结果在联调的时候,验签总是错误,渠道方用自己的私钥对数据加签后再用自己的公钥对数据进行验签却能通过,于是我也用自己的私钥对数据进行加签后再用自己的公钥对数据进行验签,结果让我惊讶,居然没有通过!
到了这里,产生错误的原因基本上已经一目了然了,我通过网站生成的公私钥是无法配对的,这当中可能涉及到了网站生成公私钥的时候已经对公私钥进行了处理,比如说PKCS8的处理,所以决定自己用Java来生成RSA公钥和私钥进行验证测试,文档写出来了,测试结果自然已经知道了,是通过的。
以下为完整的验签过程:
启动类:ZhongbaohuiApplication.java
package com.test.zhongbaohui;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
public class ZhongbaohuiApplication {
public static void main(String[] args) {
SpringApplication.run(ZhongbaohuiApplication.class, args);
}
}
请求Controller:RequestController.java
package com.test.zhongbaohui.controller;
import com.alibaba.fastjson.JSONObject;
import com.test.zhongbaohui.utils.RSASignUtils;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.util.HashMap;
import java.util.Map;
/**
* @program: zhongbaohui
* @package: com.test.zhongbaohui.controller
* @description:
* @auther: chengjunyu
* @createDate: 2019/12/6 22:05
*/
@RestController
@RequestMapping(value="/test")
@Slf4j
public class RequestController {
@Autowired
private ResponseController responseController;
@PostMapping("/getJsonObject")
private String getJsonObject(HttpServletRequest request, HttpServletResponse response) {
JSONObject jsonObject = new JSONObject();
jsonObject.put("signType", "RSA");
jsonObject.put("enterpriseId", "201975538583911110");
jsonObject.put("nonce", "b0eed33073664f5fa983c5b774dbd4b6");
jsonObject.put("timestamp", "2019-12-07 01:19:25");
Map<String, Object> map = new HashMap<>();
map.put("bankCode", "其他");
map.put("batchNo", "201975538583911110b1084fa29f6c");
map.put("bankCardNumber", "6217856100077026406");
map.put("paymentNote", "佣金发放");
map.put("idCardNumber", "320123199103104650");
map.put("mobile", "15365176555");
map.put("bankName", "中国银行");
map.put("outEnterpriseOrderNo", "T20191207011545663692017");
map.put("realPayment", "1.00");
map.put("serviceId", "201968613430727001");
map.put("userName", "程俊予");
jsonObject.put("data", map);
//私钥内容
String privateKey = "MIICb&WGW&3ТАА ТgV |