diff --git a/lib/jit-vstk-jdk15-2.0.50-20150603.060911-1.jar b/lib/jit-vstk-jdk15-2.0.50-20150603.060911-1.jar
new file mode 100644
index 0000000..865b55e
Binary files /dev/null and b/lib/jit-vstk-jdk15-2.0.50-20150603.060911-1.jar differ
diff --git a/pom.xml b/pom.xml
index 636c58e..d3a1134 100644
--- a/pom.xml
+++ b/pom.xml
@@ -66,7 +66,13 @@
poi-ooxml-schemas
4.1.2
-
+
+ jit.vstk
+ jit-vstk
+ 2.0.50
+ system
+ ${basedir}/lib/jit-vstk-jdk15-2.0.50-20150603.060911-1.jar
+
org.apache.velocity
velocity-tools
diff --git a/src/main/java/com/chinaunicom/mall/ebtp/extend/timeService/TimeServiceConstant.java b/src/main/java/com/chinaunicom/mall/ebtp/extend/timeService/TimeServiceConstant.java
new file mode 100644
index 0000000..f167277
--- /dev/null
+++ b/src/main/java/com/chinaunicom/mall/ebtp/extend/timeService/TimeServiceConstant.java
@@ -0,0 +1,156 @@
+package com.chinaunicom.mall.ebtp.extend.timeService;
+
+import cn.com.jit.assp.css.client.util.HelperUtil;
+import com.chinaunicom.mall.ebtp.extend.timeService.tsa.TtsAgent;
+import lombok.extern.slf4j.Slf4j;
+import cn.com.jit.tsa.client.*;
+import org.apache.commons.codec.binary.Base64;
+import org.springframework.core.io.ClassPathResource;
+
+import java.io.InputStream;
+import java.text.SimpleDateFormat;
+import java.util.Properties;
+
+@Slf4j
+public class TimeServiceConstant {
+
+ public static TSAClient client;
+
+ public TimeServiceConstant(){
+ try{
+ Properties prop = new Properties();
+ ClassPathResource classPathResource = new ClassPathResource("cssconfig.properties");
+ InputStream inputStream =classPathResource.getInputStream();
+ prop.load(inputStream);
+ inputStream.close();
+
+ // 获得TSAClient工厂实例
+ TSAClientFactory factory = TSAClientFactory.newInstance(prop);
+ // 获得TSAClient
+ client = (TSAClient) factory.getTSAClient();
+ }catch (Exception e){
+ log.error("读取配置文件或连接时间戳服务器异常", e);
+ }
+ }
+ /**
+ * 申请时间戳
+ * @param data 待申请时间戳的原文
+ * @return 时间戳加密原文
+ */
+ public String signTimeStamp(String data){
+ try{
+ //第三步:申请时间戳,向时间戳服务器发起申请时间戳请求,返回时间戳结果
+ TSASignedResult result = client.signTimeStamp("SHA1", data.getBytes("UTF-8"));
+ //第四步:获取时间戳数据,tsaData为时间戳数据,验证时间戳时使用,如果不是实时验证,需要将时间戳数据保存在应用服务器
+ byte[] tsaData = result.getSignedData();
+ System.out.println("tsaData -->"+tsaData);
+ String timestamp = Base64.encodeBase64String(tsaData);
+ return timestamp;
+ }catch (Exception e){
+ log.error("申请时间戳异常", e);
+ }
+ return null;
+ }
+ /**
+ * 解析时间戳
+ * @param timestamp 时间戳加密原文
+ * @return 时间戳对象
+ */
+ public TSAVerifyResult verifyTimeStamp(String timestamp){
+ try{
+ TSAVerifyResult verifyResult = client.verifyTimeStamp(Base64.decodeBase64(timestamp));
+ return verifyResult;
+ }catch (Exception e){
+ log.error("解析时间戳", e);
+ }
+ return null;
+ }
+
+ /**
+ * 获取时间戳
+ * @param data 待申请时间戳的原文
+ * @return 时间戳对象
+ */
+ public TtsAgent.TtsParseResult getServiceTimeObj(String data){
+ try{
+ String timestamp = this.signTimeStamp(data);
+ TSAVerifyResult verifyResult = this.verifyTimeStamp(timestamp);
+ String time = new SimpleDateFormat("yyyyMMddHHmmss").format(verifyResult.getSignedTime());
+ TtsAgent.TtsParseResult ttsParseResult = new TtsAgent.TtsParseResult(time, HelperUtil.bytesToHexString(verifyResult.getData()),
+ verifyResult.getSignerSubject());
+ return ttsParseResult;
+ }catch (Exception e){
+ log.error("获取时间戳异常", e);
+ }
+ return null;
+ }
+
+ /**
+ * 直接获取获取时间戳 时间
+ * @param data 待申请时间戳的原文
+ * @return 时间
+ */
+ public String getServiceTime(String data){
+ try{
+ String timestamp = this.signTimeStamp(data);
+ TSAVerifyResult verifyResult = this.verifyTimeStamp(timestamp);
+ String time = new SimpleDateFormat("yyyyMMddHHmmss").format(verifyResult.getSignedTime());
+
+ return time;
+ }catch (Exception e){
+ log.error("获取时间戳异常", e);
+ }
+ return null;
+ }
+
+ /**
+ *
+ * @param
+ * @return
+ */
+ public void getTSAClientTest() throws Exception{
+ Properties prop = new Properties();
+ ClassPathResource classPathResource = new ClassPathResource("cssconfig.properties");
+ InputStream inputStream =classPathResource.getInputStream();
+ //String path = ClassUtils.getDefaultClassLoader().getResource("").getPath();
+ //InputStream is = new FileInputStream("/resources/cssconfig.properties");
+ prop.load(inputStream);
+ inputStream.close();
+
+ try {
+ // 获得TSAClient工厂实例
+ TSAClientFactory factory = TSAClientFactory.newInstance(prop);
+ // 获得TSAClient
+ TSAClient client = (TSAClient) factory.getTSAClient();
+
+ // 待申请时间戳的原文
+ String source = "abcdefghijklmn";
+
+ //第三步:申请时间戳,向时间戳服务器发起申请时间戳请求,返回时间戳结果
+ TSASignedResult result = client.signTimeStamp("SHA1", source.getBytes("UTF-8"));
+
+ //第四步:获取时间戳数据,tsaData为时间戳数据,验证时间戳时使用,如果不是实时验证,需要将时间戳数据保存在应用服务器
+ byte[] tsaData = result.getSignedData();
+ System.out.println("tsaData -->"+tsaData);
+ String timestamp = Base64.encodeBase64String(tsaData);
+ System.out.println("timestamp -->"+timestamp);
+
+ TSAVerifyResult verifyResult = client.verifyTimeStamp(Base64.decodeBase64(timestamp));
+ System.out.println("verifyResult 1--> {}"+ verifyResult);
+ System.out.println("verifyResult 2--> {}"+ Base64.encodeBase64String(verifyResult.getData()));
+ System.out.println("verifyResult 3--> {}"+ verifyResult.getSignedTime());
+ System.out.println("verifyResult 4--> {}"+ verifyResult.getSignerSubject());
+ System.out.println("verifyResult 5--> {}"+ verifyResult.getSignerCertSerialNumber());
+ String time = new SimpleDateFormat("yyyyMMddHHmmss").format(verifyResult.getSignedTime());
+ System.out.println("verifyResult 5--> {}"+ time);
+ TtsAgent.TtsParseResult ttsParseResult = new TtsAgent.TtsParseResult(time, HelperUtil.bytesToHexString(verifyResult.getData()),
+ verifyResult.getSignerSubject());
+ System.out.println("timestamp -> {}"+ ttsParseResult.getTimestamp());
+ System.out.println("cert -> {}"+ttsParseResult.getCert());
+ System.out.println("hash -> {}"+ttsParseResult.getHash());
+
+ } catch (TSAException ex) {
+ System.out.println("时间戳申请失败, 失败原因: " + ex.getMessage());
+ }
+ }
+}
diff --git a/src/main/java/com/chinaunicom/mall/ebtp/extend/timeService/controller/TiemServiceController.java b/src/main/java/com/chinaunicom/mall/ebtp/extend/timeService/controller/TiemServiceController.java
new file mode 100644
index 0000000..597ec88
--- /dev/null
+++ b/src/main/java/com/chinaunicom/mall/ebtp/extend/timeService/controller/TiemServiceController.java
@@ -0,0 +1,63 @@
+package com.chinaunicom.mall.ebtp.extend.timeService.controller;
+
+import cn.com.jit.tsa.client.TSAVerifyResult;
+import com.chinaunicom.mall.ebtp.common.base.entity.BaseResponse;
+import com.chinaunicom.mall.ebtp.extend.templatewarehouse.entity.BizBidTemplateWarehouse;
+import com.chinaunicom.mall.ebtp.extend.timeService.TimeServiceConstant;
+import com.chinaunicom.mall.ebtp.extend.timeService.tsa.TtsAgent;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiParam;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestParam;
+import org.springframework.web.bind.annotation.RestController;
+
+
+@RestController
+@Api(tags = "")
+@RequestMapping("/v1/timeService")
+public class TiemServiceController {
+
+ /**
+ * 申请时间戳
+ * @param data 待申请时间戳的原文
+ * @return 时间戳加密原文
+ */
+ @GetMapping(value = "/signTimeStamp")
+ public BaseResponse signTimeStamp(@ApiParam(value = "待申请时间戳的原文", required = true) @RequestParam(name = "data") String data) {
+ TimeServiceConstant constant = new TimeServiceConstant();
+ return BaseResponse.success(constant.signTimeStamp(data));
+ }
+
+ /**
+ * 解析时间戳
+ * @param timestamp 时间戳加密原文
+ * @return 时间戳对象
+ */
+ @GetMapping(value = "/verifyTimeStamp")
+ public BaseResponse verifyTimeStamp(@ApiParam(value = "时间戳加密原文", required = true) @RequestParam(name = "timestamp") String timestamp) {
+ TimeServiceConstant constant = new TimeServiceConstant();
+ return BaseResponse.success(constant.verifyTimeStamp(timestamp));
+ }
+
+ /**
+ * 获取时间戳
+ * @param data 待申请时间戳的原文
+ * @return 时间戳对象
+ */
+ @GetMapping(value = "/getServiceTimeObj")
+ public BaseResponse getServiceTimeObj(@ApiParam(value = "待申请时间戳的原文", required = true) @RequestParam(name = "data") String data) {
+ TimeServiceConstant constant = new TimeServiceConstant();
+ return BaseResponse.success(constant.getServiceTimeObj(data));
+ }
+ /**
+ * 获取时间戳
+ * @param data 待申请时间戳的原文
+ * @return 时间戳对象
+ */
+ @GetMapping(value = "/getServiceTime")
+ public BaseResponse getServiceTime(@ApiParam(value = "待申请时间戳的原文", required = true) @RequestParam(name = "data") String data) {
+ TimeServiceConstant constant = new TimeServiceConstant();
+ return BaseResponse.success(constant.getServiceTime(data));
+ }
+}
diff --git a/src/main/java/com/chinaunicom/mall/ebtp/extend/timeService/tsa/TtsAgent.java b/src/main/java/com/chinaunicom/mall/ebtp/extend/timeService/tsa/TtsAgent.java
new file mode 100644
index 0000000..62e02b5
--- /dev/null
+++ b/src/main/java/com/chinaunicom/mall/ebtp/extend/timeService/tsa/TtsAgent.java
@@ -0,0 +1,101 @@
+package com.chinaunicom.mall.ebtp.extend.timeService.tsa;
+
+/**
+ * CA 时间戳服务接口
+ *
+ * @工程: EPS(4.0)
+ *
+ * @模块:
+ *
+ * @作者: 李志慧
+ *
+ * @创建日期: 2016年3月17日
+ *
+ * @修改记录(修改时间、作者、原因):
+ */
+public interface TtsAgent {
+
+ /**
+ * 创建hash 的时间戳
+ *
+ * @作者: 李志慧 @创建日期: 2016年3月17日
+ *
+ * @参数: hash 数据hash值
+ * @返回值: String
+ *
+ * @修改记录(修改时间、作者、原因):
+ */
+ String createTimestamp(String hash);
+
+ /**
+ * 时间戳验证
+ *
+ * @作者: 李志慧 @创建日期: 2016年3月17日
+ *
+ * @参数: timestamp 时间戳
+ * @返回值: boolean
+ *
+ * @修改记录(修改时间、作者、原因):
+ */
+ boolean verifyTimestamp(String timestamp);
+
+ /**
+ * 解析时间戳
+ *
+ * @作者: 李志慧 @创建日期: 2016年3月17日
+ *
+ * @参数: timestamp 时间戳
+ * @返回值: TtsParseResult
+ *
+ * @修改记录(修改时间、作者、原因):
+ */
+ TtsParseResult parseTimestamp(String timestamp);
+
+ /**
+ * 时间戳解析结果
+ *
+ * @作者: 李志慧
+ *
+ */
+ public class TtsParseResult {
+ // 时间
+ private String timestamp;
+
+ // hash 值
+ private String hash;
+
+ // 签名证书
+ private String cert;
+
+ public TtsParseResult(String timestamp, String hash, String cert) {
+ super();
+ this.timestamp = timestamp;
+ this.hash = hash;
+ this.cert = cert;
+ }
+
+ public String getTimestamp() {
+ return timestamp;
+ }
+
+ public void setTimestamp(String timestamp) {
+ this.timestamp = timestamp;
+ }
+
+ public String getHash() {
+ return hash;
+ }
+
+ public void setHash(String hash) {
+ this.hash = hash;
+ }
+
+ public String getCert() {
+ return cert;
+ }
+
+ public void setCert(String cert) {
+ this.cert = cert;
+ }
+ }
+}
\ No newline at end of file
diff --git a/src/main/resources/application.yml b/src/main/resources/application.yml
index 027b4e3..f2b90d5 100644
--- a/src/main/resources/application.yml
+++ b/src/main/resources/application.yml
@@ -1,3 +1,3 @@
spring:
profiles:
- active: test
\ No newline at end of file
+ active: uat
\ No newline at end of file
diff --git a/src/main/resources/cssconfig.properties b/src/main/resources/cssconfig.properties
new file mode 100644
index 0000000..b4c1764
--- /dev/null
+++ b/src/main/resources/cssconfig.properties
@@ -0,0 +1,41 @@
+#ServerURL=http://192.168.9.110:8000/signxmlhandler
+ServerURL=http://10.249.247.133:8000/signserver/service/xml
+#ServerURL=http://192.168.9.110:8000/signserver/service/xml
+DigestAlg=SHA1
+#Encrypt Algorithm: des3/scb2
+EncAlg=des3
+CertBaseInfo = version;issuerdn;subjectdn;serialnumber;notbefore;notafter
+TSACertBaseInfo = issuerdn;subjectdn;serialnumber;signedTime;signedTSA;signedTimeByMS
+CertExtendInfo =
+AppID=
+CertAlias =
+BaseInfo =digestalg;digestdata;plaindata;dscert
+SendMsgFormat=0
+HashActionPosition=0
+PrintLog=false
+#console/file/log4j ####log4j not implement
+logTarget=console
+logFilePath=/temp/jit.dss.vstk.log
+#rfc3161/rfc2630
+TSAType=rfc3161
+#dsCert/issuerDNAndSN
+p1VerifyCertId=dsCert
+Compatible=true
+dss.client.class=cn.com.jit.assp.client.DSSClientHttpUrlConnectionImpl
+#dss.client.class=cn.com.jit.assp.client.DSSClientHttpClientImpl
+#default/encAfterDec/secretEnvelop(use this mode after using VCTK do envelop) secretEnvelop:develop->RSAdecrypt->RSAencrypt->envelop
+envelopType=default
+#default unit KB and default size is 0,0 is not block;
+packageSize=0
+
+#default:10000 unit: ms
+timeout=10000
+connectTimeOut=10000
+# default : system unicode
+FileSystemCharSet=UTF-8
+vstkVersion=20
+EncryptMode=ecb
+#package size every time, unit is byte
+send_size=1048576
+#bigger than this will take big data modle, unit is byte
+bigdata_limit=20971520
\ No newline at end of file