# huaweicloud-CCM-PCA-CertManager-java
**Repository Path**: HuaweiCloudDeveloper/huaweicloud-ccm-pca-cert-manager-java
## Basic Information
- **Project Name**: huaweicloud-CCM-PCA-CertManager-java
- **Description**: 基于华为云java/go/python SDK,对云证书管理服务(CCM)服务下私有证书管理(PCA)的证书进行生命周期管理的代码示例。
- **Primary Language**: Unknown
- **License**: Apache-2.0
- **Default Branch**: master-dev
- **Homepage**: None
- **GVP Project**: No
## Statistics
- **Stars**: 0
- **Forks**: 0
- **Created**: 2022-12-20
- **Last Updated**: 2025-06-16
## Categories & Tags
**Categories**: Uncategorized
**Tags**: None
## README
## 1.简介
本示例基于华为云SDK V3.0版本开发,华为云提供了CCM服务端SDK,您可以直接集成服务端SDK来调用CCM的相关API,从而实现对CCM的快速操作。
该示例展示如何通过CCM服务申请终端实体证书,并通过API查询证书详情与吊销证书。
## 2.开发前准备
- 已 [注册](https://id1.cloud.huawei.com/UnifiedIDMPortal/portal/userRegister/regbyphone.html?themeName=red&access_type=offline&clientID=103493351&loginChannel=88000000&loginUrl=https%3A%2F%2Fauth.huaweicloud.com%2Fauthui%2Flogin.html%23&casLoginUrl=https%3A%2F%2Fauth.huaweicloud.com%2Fauthui%2FcasLogin&service=https%3A%2F%2Fauth.huaweicloud.com%2Fauthui%2FcasLogin&countryCode=cn&scope=https%3A%2F%2Fwww.huawei.com%2Fauth%2Faccount%2Funified.profile+https%3A%2F%2Fwww.huawei.com%2Fauth%2Faccount%2Frisk.idstate&reqClientType=88&state=94fc0f9f861b4f30a85ec1f463d35609&lang=zh-cn) 华为云,并完成 [实名认证](https://account.huaweicloud.com/usercenter/?region=cn-north-4#/accountindex/realNameAuth) 。
- 已具备开发环境 ,支持Java JDK 1.8及其以上版本。
- 已获取华为云账号对应的Access Key(AK)和Secret Access Key(SK)。请在华为云控制台“我的凭证 > 访问密钥”页面上创建和查看您的AK/SK。具体请参见 [访问秘钥](https://support.huaweicloud.com/usermanual-ca/zh-cn_topic_0046606340.html)
- 已获取帐号相关信息,请在华为云控制台“我的凭证 > API凭证 ”页面上查看帐号信息,如帐号id,即domainId。具体请参见 [API凭证](https://support.huaweicloud.com/usermanual-ca/ca_01_0002.html) 。
## 3.安装sdk
您可以通过Maven方式获取和安装SDK,首先需要在您的操作系统中下载并安装Maven ,安装完成后您只需要在Java项目的pom.xml文件中加入相应的依赖项即可。
使用服务端SDK前,您需要引入“huaweicloud-sdk-ccm”依赖,具体的SDK版本号请参见 [SDK开发中心](https://sdkcenter.developer.huaweicloud.com/?language=Java) 。
```xml
com.huaweicloud.sdk
huaweicloud-sdk-ccm
3.1.26
```
## 4.开始使用
### 4.1 导入依赖模块
```java
import com.huaweicloud.sdk.ccm.v1.CcmClient;
import com.huaweicloud.sdk.ccm.v1.model.CertDistinguishedName;
import com.huaweicloud.sdk.ccm.v1.model.CreateCertificateRequest;
import com.huaweicloud.sdk.ccm.v1.model.CreateCertificateRequestBody;
import com.huaweicloud.sdk.ccm.v1.model.CreateCertificateResponse;
import com.huaweicloud.sdk.ccm.v1.model.ExtendedKeyUsage;
import com.huaweicloud.sdk.ccm.v1.model.RevokeCertificateRequest;
import com.huaweicloud.sdk.ccm.v1.model.ShowCertificateRequest;
import com.huaweicloud.sdk.ccm.v1.model.ShowCertificateResponse;
import com.huaweicloud.sdk.ccm.v1.model.SubjectAlternativeName;
import com.huaweicloud.sdk.ccm.v1.model.Validity;
import com.huaweicloud.sdk.core.auth.GlobalCredentials;
import java.util.ArrayList;
import java.util.List;
```
### 4.2 初始化认证信息
```java
// 1.准备访问华为云的认证信息,PCA为全局服务
/*
* 基础认证信息:
* - ak: 华为云账号Access Key
* - sk: 华为云账号Secret Access Key
* - domainId: 华为云账号ID 详情见https://support.huaweicloud.com/productdesc-iam/iam_01_0023.html
* 认证用的ak和sk直接写到代码中有很大的安全风险,建议在配置文件或者环境变量中密文存放,使用时解密,确保安全;
* 本示例以ak和sk保存在环境变量中为例,运行本示例前请先在本地环境中设置环境变量HUAWEICLOUD_SDK_AK和HUAWEICLOUD_SDK_SK。
*/
String ak = System.getenv("HUAWEICLOUD_SDK_AK");
String sk = System.getenv("HUAWEICLOUD_SDK_SK");
String domainId = "";
final GlobalCredentials auth = new GlobalCredentials()
.withAk(ak)
.withSk(sk)
.withDomainId(domainId);
```
### 4.3 初始化云证书管理服务客户端
```java
// 2.初始化SDK,传入认证信息及CCM服务的访问终端地址
final CcmClient ccmClient = CcmClient.newBuilder().withCredential(auth).withEndpoint(ccmEndpoint).build();
```
#### 4.4 示例代码
```java
package com.huawei.demo;
import com.huaweicloud.sdk.ccm.v1.CcmClient;
import com.huaweicloud.sdk.ccm.v1.model.CertDistinguishedName;
import com.huaweicloud.sdk.ccm.v1.model.CreateCertificateRequest;
import com.huaweicloud.sdk.ccm.v1.model.CreateCertificateRequestBody;
import com.huaweicloud.sdk.ccm.v1.model.CreateCertificateResponse;
import com.huaweicloud.sdk.ccm.v1.model.ExtendedKeyUsage;
import com.huaweicloud.sdk.ccm.v1.model.RevokeCertificateRequest;
import com.huaweicloud.sdk.ccm.v1.model.ShowCertificateRequest;
import com.huaweicloud.sdk.ccm.v1.model.ShowCertificateResponse;
import com.huaweicloud.sdk.ccm.v1.model.SubjectAlternativeName;
import com.huaweicloud.sdk.ccm.v1.model.Validity;
import com.huaweicloud.sdk.core.auth.GlobalCredentials;
import java.util.ArrayList;
import java.util.List;
public class CertificateManagerDemo {
public static void main(String[] args) {
/*
* 基础认证信息:
* - ak: 华为云账号Access Key
* - sk: 华为云账号Secret Access Key
* - domainId: 华为云账号ID 详情见https://support.huaweicloud.com/productdesc-iam/iam_01_0023.html
* - ccmEndpoint: 华为云CCM服务(PCA属于CCM下的微服务)的访问终端地址
* 认证用的ak和sk直接写到代码中有很大的安全风险,建议在配置文件或者环境变量中密文存放,使用时解密,确保安全;
* 本示例以ak和sk保存在环境变量中为例,运行本示例前请先在本地环境中设置环境变量HUAWEICLOUD_SDK_AK和HUAWEICLOUD_SDK_SK。
*/
String ak = System.getenv("HUAWEICLOUD_SDK_AK");
String sk = System.getenv("HUAWEICLOUD_SDK_SK");
String domainId = "";
String ccmEndpoint = "";
// 1.准备访问华为云的认证信息,PCA为全局服务
final GlobalCredentials auth = new GlobalCredentials()
.withAk(ak)
.withSk(sk)
.withDomainId(domainId);
// 2.初始化SDK,传入认证信息及CCM服务的访问终端地址
final CcmClient ccmClient = CcmClient.newBuilder()
.withCredential(auth)
.withEndpoint(ccmEndpoint).build();
// 3.申请终端实体证书
// 用于签发证书的CA的证书id
String issuerId = "3a02c7f6-d8f5-497e-9f60-18dfd3eeb4e6";
String certId = applyCert(ccmClient, issuerId);
if (certId == null) {
return;
}
// 4.查看证书详情
ShowCertificateResponse response = showCert(ccmClient, certId);
if (response != null) {
// 查看证书的签名算法与状态
System.out.println(response.getKeyAlgorithm());
System.out.println(response.getStatus());
// 5.吊销证书,发生错误将会抛异常
revokeCert(ccmClient, certId);
}
}
private static String applyCert(CcmClient ccmClient, String issuerId) {
// (1)证书密钥算法
String keyAlgorithm = "RSA2048";
// (2)签名哈希算法
String signatureAlgorithm = "SHA512";
/*
* (3)证书有效期定义
* - type: 时间类型,可选:"YEAR"、"MONTH"、”DAY“、"HOUR"
* - value: 对应的值
*/
Validity validity = new Validity();
validity.setType("MONTH");
validity.setValue(2);
/*
* (4)定义CA证书的唯一标识信息
* - organization: 组织名称
* - organizationalUnit: 部门名称
* - country: 国家缩写,仅限两个字符,如中国-CN
* - state: 省市名称
* - locality: 城市名称
* - commonName: 证书域名或IP
*/
CertDistinguishedName subjectInfo = new CertDistinguishedName();
subjectInfo.setOrganization("your organization");
subjectInfo.setOrganizationalUnit("your organizational unit");
subjectInfo.setCountry("CN");
subjectInfo.setState("your state");
subjectInfo.setLocality("your locality");
subjectInfo.setCommonName("your dns");
/*
* (5)密钥用法,服务器证书通常只赋予keyAgreement与digitalSignature,为可选值
* - digitalSignature : 数字签名;
* - nonRepudiation : 不可抵赖;
* - keyEncipherment : 密钥用于加密密钥数据;
* - dataEncipherment : 用于加密数据;
* - keyAgreement : 密钥协商;
* - keyCertSign : 签发证书;
* - cRLSign : 签发吊销列表;
* - encipherOnly : 仅用于加密;
* - decipherOnly : 仅用于解密。
*/
List keyUsages = new ArrayList<>();
keyUsages.add("digitalSignature");
keyUsages.add("keyAgreement");
/*
* (6)主体备用名称: 暂时支持DNS、IP、URI与EMAIL,为可选值
* SubjectAlternativeName:
* type:类型
* value:对应值
*/
List subjectAlternativeName = new ArrayList<>();
// a、添加备用DNS
SubjectAlternativeName alterNameDNS = new SubjectAlternativeName();
alterNameDNS.setType("DNS");
alterNameDNS.setValue("*.example.com");
subjectAlternativeName.add(alterNameDNS);
// b、添加备用IP
SubjectAlternativeName alterNameIP = new SubjectAlternativeName();
alterNameIP.setType("IP");
alterNameIP.setValue("127.0.0.1");
subjectAlternativeName.add(alterNameIP);
// b、添加备用email
SubjectAlternativeName alterNameEmail = new SubjectAlternativeName();
alterNameEmail.setType("EMAIL");
alterNameEmail.setValue("myEmail@qq.com");
subjectAlternativeName.add(alterNameEmail);
ExtendedKeyUsage extendedKeyUsage = new ExtendedKeyUsage();
extendedKeyUsage.setClientAuth(true);
extendedKeyUsage.setServerAuth(true);
// (7)请求体各属性赋值
// 各属性的取值约束,请查阅:https://support.huaweicloud.com/api-ccm/CreateCertificate.html
CreateCertificateRequestBody requestBody = new CreateCertificateRequestBody();
requestBody.setIssuerId(issuerId);
requestBody.setKeyAlgorithm(keyAlgorithm);
requestBody.setSignatureAlgorithm(signatureAlgorithm);
requestBody.setValidity(validity);
requestBody.setDistinguishedName(subjectInfo);
requestBody.setKeyUsages(keyUsages);
requestBody.setSubjectAlternativeNames(subjectAlternativeName);
requestBody.setExtendedKeyUsage(extendedKeyUsage);
// 4、构造请求体
CreateCertificateRequest request = new CreateCertificateRequest()
.withBody(requestBody);
// 5、开始发起请求
CreateCertificateResponse response;
try {
response = ccmClient.createCertificate(request);
} catch (Exception e) {
System.out.println("error info: " + e.getMessage());
return null;
}
// 6、获取响应消息
String certId = response.getCertificateId();
System.out.println(certId);
return certId;
}
private static ShowCertificateResponse showCert(CcmClient ccmClient, String certId) {
ShowCertificateRequest request = new ShowCertificateRequest().withCertificateId(certId);
try {
return ccmClient.showCertificate(request);
} catch (Exception e) {
System.out.println("error info: " + e.getMessage());
return null;
}
}
private static void revokeCert(CcmClient ccmClient, String certId) {
RevokeCertificateRequest request = new RevokeCertificateRequest().withCertificateId(certId);
try {
ccmClient.revokeCertificate(request);
} catch (Exception e) {
System.out.println("error info: " + e.getMessage());
}
}
}
```
## 5.参考
更多信息请参考[API Explorer](https://apiexplorer.developer.huaweicloud.com/apiexplorer/doc?product=CCM&api=CreateCertificateAuthority)
## 6.修订记录
| 发布日期 | 文档版本 | 修订说明 |
| :--------: | :------: | :----------: |
| 2022-12-25 | 1.0 | 文档首次发布 |
| 2023-11-14 | 1.1 | 修改凭证获取及注释 |