huaweicloud-CCM-PCA-CertManager-java:基于华为云SDK V3.0的CCM服务证书管理示例

基于华为云java/go/python SDK,对云证书管理服务(CCM)服务下私有证书管理(PCA)的证书进行生命周期管理的代码示例。

Branch3Tags0

1.简介

本示例基于华为云SDK V3.0版本开发,华为云提供了CCM服务端SDK,您可以直接集成服务端SDK来调用CCM的相关API,从而实现对CCM的快速操作。 该示例展示如何通过CCM服务申请终端实体证书,并通过API查询证书详情与吊销证书。

2.开发前准备

  • 注册 华为云,并完成 实名认证
  • 已具备开发环境 ,支持Java JDK 1.8及其以上版本。
  • 已获取华为云账号对应的Access Key(AK)和Secret Access Key(SK)。请在华为云控制台“我的凭证 > 访问密钥”页面上创建和查看您的AK/SK。具体请参见 访问秘钥
  • 已获取帐号相关信息,请在华为云控制台“我的凭证 > API凭证 ”页面上查看帐号信息,如帐号id,即domainId。具体请参见 API凭证

3.安装sdk

您可以通过Maven方式获取和安装SDK,首先需要在您的操作系统中下载并安装Maven ,安装完成后您只需要在Java项目的pom.xml文件中加入相应的依赖项即可。 使用服务端SDK前,您需要引入“huaweicloud-sdk-ccm”依赖,具体的SDK版本号请参见 SDK开发中心

<dependency>
    <groupId>com.huaweicloud.sdk</groupId>
    <artifactId>huaweicloud-sdk-ccm</artifactId>
    <version>3.1.16</version>
</dependency>

4.开始使用

4.1 导入依赖模块

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 初始化认证信息

// 1.准备访问华为云的认证信息,PCA为全局服务
final GlobalCredentials auth = new GlobalCredentials()
        .withAk(ak)
        .withSk(sk)
        .withDomainId(domainId);

4.3 初始化云证书管理服务客户端

// 2.初始化SDK,传入认证信息及CCM服务的访问终端地址
final CcmClient ccmClient = CcmClient.newBuilder().withCredential(auth).withEndpoint(ccmEndpoint).build();

4.4 示例代码

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下的微服务)的访问终端地址
         */
        String ak = "<AccessKey>";
        String sk = "<SecretAccessKey>";
        String domainId = "<DomainID>";
        String ccmEndpoint = "<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<String> keyUsages = new ArrayList<>();
        keyUsages.add("digitalSignature");
        keyUsages.add("keyAgreement");

        /*
         * (6)主体备用名称: 暂时支持DNS、IP、URI与EMAIL,为可选值
         *  SubjectAlternativeName:
         *         type:类型
         *         value:对应值
         */
        List<SubjectAlternativeName> 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

6.修订记录

发布日期 文档版本 修订说明
2022-12-25 1.0 文档首次发布

Introduction

基于华为云java/go/python SDK,对云证书管理服务(CCM)服务下私有证书管理(PCA)的证书进行生命周期管理的代码示例。

Customize my domain