# 內建軟體測試憑證
## 更新紀錄
* 2021/04/05 更新版本:21.3.24-DEV
* 2021/04/05 SignedData新增驗章錯誤訊息(verifyError)
* 2021/04/04 更新版本:21.3.23-DEV
* 2021/04/04 新增取得內建憑證之公鑰(Base64格式)
* 2021/03/29 更新版本:21.3.18-DEV
* 2021/03/29 新增自訂url scheme(因應web主機強制使用https)
* 2020/12/19 更新版本:20.12.6-SNAPSHOT
* 2020/12/19 新增getIcCardNo,取得內建測試憑證IC卡號。
* 2020/11/22 更新版本:20.11.11-SNAPSHOT
* 2020/11/22 Invoker改用GepsHttpInvokerProxyFactoryBean以設定連線Timeout。
* 2020/11/07 更新版本:20.10.11-SNAPSHOT
* 2020/11/07 檢驗簽章返回型態由boolean改為簽署者資訊(SignedData)。
* 2020/11/07 新增將base64編碼過的憑證字串轉為憑證資訊(可取得憑證類型、oid、統編、身份證後4碼等),說明加入getCertInfo使用範例。
## 使用說明
1. 使用common-api-fwk: 21.3.23-DEV
```
<dependency>
<groupId>geps3</groupId>
<artifactId>common-api-fwk</artifactId>
<version>21.3.23-DEV</version>
</dependency>
```
2. Import **QdcsApiconfig**
```
@Import({ WebConfig.class, JpaConfig.class, CachingConfig.class, AsyncConfig.class, OoiClient.class, OsmApiClientConfig.class, CcsAppConfig.class, VmsApiConfig.class,
QdcsApiConfig.class})
@SpringBootApplication
@EnableScheduling
//@PropertySource({"classpath:obtainment.properties"})
public class Application extends SpringBootServletInitializer implements WebApplicationInitializer {
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
}
```
如欲自定義連線網址,請於application.yml設定參數
```
qdcs:
server:
scheme: http
host: localhost
port: 8080
```
3. @Autowired **TestCertApi**
```
@Autowired
private TestCertApi testCertService;
```
4. 用法:
```
public interface TestCertApi {
/**
* 測試憑證驗證簽章
*
* @param data
* 欲簽章的資料
* @param isBase64
* 內容是否為Base64編碼
* @return 簽章結果
*/
public String sign(String data, boolean isBase64);
/**
* 測試憑證驗證簽章
*
* @param data
* 簽章資料
* @return 簽署者資訊
*/
public SignedData verify(String data);
/**
* 測試憑證加密
*
* @param data
* 欲加密的內容
* @param isBase64
* 內容是否為Base64編碼
* @return 加密後的結果(預設以Base64編碼)
*/
public String encrypt(String data, boolean isBase64);
/**
* 測試憑證解密
*
* @param base64Data
* 以Base64編碼後的字串
* @return 解密後的字串(預設不以Base64編碼)
*/
public String decrypt(String base64Data);
/**
* 測試憑證解密
*
* @param base64Data
* 以Base64編碼後的字串
* @param returnBase64
* 是否將結果以Base64編碼字串回傳
* @return 解密後的字串
*/
public String decrypt(String base64Data, boolean returnBase64);
/**
* 取得測試憑證資訊
*
* @return 憑證資訊
*/
public CertInfo info();
/**
* 將base64編碼的憑證轉為CertInfo
*
* @param base64Cert
* @return
*/
CertInfo getCertInfo(String base64Cert);
/**
* 取得內建測試憑證IC卡號
*
*/
public String getIcCardNo();
/**
* 取得內建憑證(Base64格式)
*
*/
public String getEncodedCert() {
}
```
### getCertInfo
將憑證編碼字串丟給API解析
```
String base64Cert = "MIIFCjCCA/KgAwIBAgIRANdvFHB/uWX26EcgpmwH9jkwDQYJKoZIhvcNAQELBQAwVjELMAkGA1UEBhMCVFcxEjAQBgNVBAoMCeihjOaUv+mZojEzMDEGA1UECwwqKOa4rOippueUqCkg5pS/5bqc5ris6Kmm5oaR6K2J566h55CG5Lit5b+DMB4XDTIwMDQyODA4NDc0N1oXDTIwMTAyODA4NDc0N1owJTELMAkGA1UEBhMCVFcxFjAUBgNVBAoMDea4rOippuapn+mXnDEwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDTDE3bX14v4vUR/O4ym+QvU9JhW4ojszHBxvIzKmvcDNAAa0emSpbaPehOXdyfvM79qhjd9IttiLsqrotC0jI3ZiFd8esdL5KAU4519xFlvv6ueF0Y9tM8AIW1/BkIGH0IlgcwdBwsQkPx+cTy3NVxiUnsRBEQT0A48BQ2FO3+3O6Jinbhk0Pao7D9OipsxpLt/6Z7HrQ9h+aS2xJ8SeneZV8wEMmJ92/GGZIfYAGsSN2FH1/itKz47MIMTknkMhCH/B055eZW5Rv2PKcqmzOOCvgDkhF2qh3wt7fK6Rj9lCuRHoSdAFRuME39R7whUn7IJHOKDuDtu729r5pFXg6HAgMBAAGjggICMIIB/jAfBgNVHSMEGDAWgBR3r9Blh+4dyKn2l6AlRw7JldpxqzAdBgNVHQ4EFgQU7XbFqO7EzIr4eQrLapQCepIvuyAwDgYDVR0PAQH/BAQDAgQwMBQGA1UdIAQNMAswCQYHYIZ2ZQADADAaBgNVHREEEzARgQ90ZXN0QGNodC5jb20udHcwTgYDVR0JBEcwRTAWBgdghnYBZAIBMQsGCWCGdgFkAwIBATAUBgdghnYBZAICMQkTB3ByaW1hcnkwFQYHYIZ2AWQCZjEKBghghnYBZYGcITCBhgYDVR0fBH8wfTBAoD6gPIY6aHR0cDovL2d0ZXN0Y2EubmF0Lmdvdi50dy9jcmwvR1Rlc3RDQTIvODg4OC0xL2NvbXBsZXRlLmNybDA5oDegNYYzaHR0cDovL2d0ZXN0Y2EubmF0Lmdvdi50dy9jcmwvR1Rlc3RDQTIvY29tcGxldGUuY3JsMCAGA1UdJQEB/wQWMBQGCCsGAQUFBwMCBggrBgEFBQcDBDB/BggrBgEFBQcBAQRzMHEwPgYIKwYBBQUHMAKGMmh0dHA6Ly9ndGVzdGNhLm5hdC5nb3YudHcvY2VydHMvSXNzdWVkVG9UaGlzQ0EucDdiMC8GCCsGAQUFBzABhiNodHRwOi8vZ3Rlc3RjYS5uYXQuZ292LnR3L09DU1Avb2NzcDANBgkqhkiG9w0BAQsFAAOCAQEADHrLRgjLof0zeeqjndq0YfJGI/iSDChw6uYv19vHit/gSc9OPT3j+xiKjSAtvqjFomTATxjL1P1I04jANNoZPdJ2uDvUF59Wh+aU09MyIOVVULgEphpHP/kDr9y3syq/3OBALZmSJBXrdU/P5K1yZ60kO6w18q8c/aFlufr7YCtFqzTNpvqRan635kscVGrXA2kiSkpVBqm+4A7BRbBML8fGvfEFQMhNtUd2NSMPFRQcJ5XKJsA0L2LAH9vbONFjK3dat224LTzd4OhnueuFR1sRF4X3+IMW5I7GMU10a1V8ybW4EWLOrJTE2t20KvCZQnLVZZ+LOIBU5KCKJPSbFQ==";
CertInfo certInfo = testCertService.getCertInfo(base64Cert);
System.out.println(certInfo);
```
> CertInfo [subjectDN=O=測試機關1, C=TW, issuerDN=OU=(測試用) 政府測試憑證管理中心, O=行政院, C=TW, notBefore=Tue Apr 28 16:47:47 CST 2020, notAfter=Wed Oct 28 16:47:47 CST 2020, serialNumber=286360778606329282209690417006144648761, crlDistrbution=http://gtestca.nat.gov.tw/crl/GTestCA2/8888-1/complete.crl09 http://gtestca.nat.gov.tw/crl/GTestCA2/complete.crl, issuerURL=null, cardType=PRIMARY, certType=GTESTCA, detailType=AUXILIARY_GOVERNMENT_UNIT, enterpriseId=null, ocsp=http://gtestca.nat.gov.tw/OCSP/ocsp, orgOID=2.16.886.1.101.20001, personId=null, subjectType=政府機關, subjectTypeOID=2.16.886.1.100.3.2.1.1]
### verify
驗證簽章並回傳簽章資訊(含憑證)
```
System.out.println("Sign 'test123'");
String data = testCertService.sign("test123", false);
SignedData signedData = testCertService.verify(data);
System.out.println("Get cert from signed data:");
System.out.println("SignedData verified: " + signedData.getVerified());
signedData.getSignCerts().forEach(c->{
System.out.println(c.getEncoededCert());
});
```
>Sign 'test123'
>Get cert from signed data:
>SignedData verified: true
>MIIFCjCCA/KgAwIBAgIRANdvFHB/uWX26EcgpmwH9jkwDQYJKoZIhvcNAQELBQAwVjELMAkGA1UEBhMCVFcxEjAQBgNVBAoMCeihjOaUv+mZojEzMDEGA1UECwwqKOa4rOippueUqCkg5pS/5bqc5ris6Kmm5oaR6K2J566h55CG5Lit5b+DMB4XDTIwMDQyODA4NDc0N1oXDTIwMTAyODA4NDc0N1owJTELMAkGA1UEBhMCVFcxFjAUBgNVBAoMDea4rOippuapn+mXnDEwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDTDE3bX14v4vUR/O4ym+QvU9JhW4ojszHBxvIzKmvcDNAAa0emSpbaPehOXdyfvM79qhjd9IttiLsqrotC0jI3ZiFd8esdL5KAU4519xFlvv6ueF0Y9tM8AIW1/BkIGH0IlgcwdBwsQkPx+cTy3NVxiUnsRBEQT0A48BQ2FO3+3O6Jinbhk0Pao7D9OipsxpLt/6Z7HrQ9h+aS2xJ8SeneZV8wEMmJ92/GGZIfYAGsSN2FH1/itKz47MIMTknkMhCH/B055eZW5Rv2PKcqmzOOCvgDkhF2qh3wt7fK6Rj9lCuRHoSdAFRuME39R7whUn7IJHOKDuDtu729r5pFXg6HAgMBAAGjggICMIIB/jAfBgNVHSMEGDAWgBR3r9Blh+4dyKn2l6AlRw7JldpxqzAdBgNVHQ4EFgQU7XbFqO7EzIr4eQrLapQCepIvuyAwDgYDVR0PAQH/BAQDAgQwMBQGA1UdIAQNMAswCQYHYIZ2ZQADADAaBgNVHREEEzARgQ90ZXN0QGNodC5jb20udHcwTgYDVR0JBEcwRTAWBgdghnYBZAIBMQsGCWCGdgFkAwIBATAUBgdghnYBZAICMQkTB3ByaW1hcnkwFQYHYIZ2AWQCZjEKBghghnYBZYGcITCBhgYDVR0fBH8wfTBAoD6gPIY6aHR0cDovL2d0ZXN0Y2EubmF0Lmdvdi50dy9jcmwvR1Rlc3RDQTIvODg4OC0xL2NvbXBsZXRlLmNybDA5oDegNYYzaHR0cDovL2d0ZXN0Y2EubmF0Lmdvdi50dy9jcmwvR1Rlc3RDQTIvY29tcGxldGUuY3JsMCAGA1UdJQEB/wQWMBQGCCsGAQUFBwMCBggrBgEFBQcDBDB/BggrBgEFBQcBAQRzMHEwPgYIKwYBBQUHMAKGMmh0dHA6Ly9ndGVzdGNhLm5hdC5nb3YudHcvY2VydHMvSXNzdWVkVG9UaGlzQ0EucDdiMC8GCCsGAQUFBzABhiNodHRwOi8vZ3Rlc3RjYS5uYXQuZ292LnR3L09DU1Avb2NzcDANBgkqhkiG9w0BAQsFAAOCAQEADHrLRgjLof0zeeqjndq0YfJGI/iSDChw6uYv19vHit/gSc9OPT3j+xiKjSAtvqjFomTATxjL1P1I04jANNoZPdJ2uDvUF59Wh+aU09MyIOVVULgEphpHP/kDr9y3syq/3OBALZmSJBXrdU/P5K1yZ60kO6w18q8c/aFlufr7YCtFqzTNpvqRan635kscVGrXA2kiSkpVBqm+4A7BRbBML8fGvfEFQMhNtUd2NSMPFRQcJ5XKJsA0L2LAH9vbONFjK3dat224LTzd4OhnueuFR1sRF4X3+IMW5I7GMU10a1V8ybW4EWLOrJTE2t20KvCZQnLVZZ+LOIBU5KCKJPSbFQ==
###### tags: GEPS3 憑證