您可以使用證書管家托管密鑰和證書,并進(jìn)行簽名驗(yàn)簽。本文為您介紹如何創(chuàng)建、下載、導(dǎo)入和使用證書。

步驟一:創(chuàng)建并下載證書

  1. 登錄密鑰管理服務(wù)控制臺(tái)
  2. 在頁面左上角的地域下拉列表,選擇證書所在的地域。
  3. 在左側(cè)導(dǎo)航欄,單擊證書
  4. 單擊創(chuàng)建證書
  5. 創(chuàng)建證書對(duì)話框,設(shè)置以下參數(shù)。
    參數(shù) 說明
    名稱 證書使用主體名稱。
    國家/地區(qū) 使用ISO 3166-1的二位國家代碼。例如:CN代表中國。
    省/市 省、直轄市、自治區(qū)或特別行政區(qū)名稱。
    城市 城市名稱。
    公司名稱 企業(yè)、單位、組織或機(jī)構(gòu)的法定名稱。

    單擊右側(cè)加號(hào),可以添加多個(gè)公司名稱。

    部門名稱 部門名稱。

    單擊右側(cè)加號(hào),可以添加多個(gè)部門名稱。

    郵箱 證書持有者或管理者郵箱。
    主體別名 當(dāng)證書為DV證書時(shí),可使用主體別名生成多域名證書請(qǐng)求。

    單擊右側(cè)加號(hào),輸入主體別名,然后單擊對(duì)勾

    密鑰類型 取值:
    • RSA_2048
    • EC_SM2
    • EC_P256
    說明 請(qǐng)根據(jù)證書應(yīng)用系統(tǒng)密鑰算法支持情況選擇。EC_P256安全性較高,RSA_2048兼容性較好,但部分應(yīng)用系統(tǒng)將在2030年12月31日停止支持RSA_2048密鑰。
    私鑰可否導(dǎo)出 證書私鑰是否需要導(dǎo)出使用。取值:
    • 是:證書私鑰需要導(dǎo)出使用。
    • 否:證書私鑰不需要導(dǎo)出使用。建議選擇否,以便使用更高安全級(jí)別的密鑰保護(hù)。
  6. 單擊創(chuàng)建證書
  7. 創(chuàng)建證書成功對(duì)話框,單擊下載證書請(qǐng)求
  8. 單擊確定

步驟二:獲取CA頒發(fā)的證書

步驟一下載的.csr格式的證書請(qǐng)求文件提交給CA機(jī)構(gòu),獲取正式的證書和證書鏈。

步驟三:導(dǎo)入證書

  1. 在證書列表頁面,找到目標(biāo)證書,在操作列選擇更多 > 導(dǎo)入證書
  2. 導(dǎo)入證書對(duì)話框,輸入或上傳步驟二獲取的證書和證書鏈。
  3. 單擊確定
    導(dǎo)入證書成功后,證書狀態(tài)為啟用中,您可以使用證書進(jìn)行密鑰管理、簽名驗(yàn)簽等操作。

步驟四:證書簽名

  • 方法一:調(diào)用CertificatePrivateKeySign接口使用指定證書生成數(shù)字簽名。
  • 方法二:通過KMS SDK使用指定證書生成數(shù)字簽名。關(guān)于KMS SDK的更多信息,請(qǐng)參見SDK概覽。Java代碼示例如下:
    import com.aliyuncs.DefaultAcsClient;
    import com.aliyuncs.exceptions.ClientException;
    import com.aliyuncs.kms.model.v20160120.CertificatePrivateKeySignRequest;
    import com.aliyuncs.kms.model.v20160120.CertificatePrivateKeySignResponse;
    import org.apache.commons.codec.binary.Base64;
    
    /**
     *  @param client 表示Alibaba Cloud SDK Client,詳見Alibaba Cloud SDK for Java文檔。
     *  @param certId 表示證書ID,指定要使用的證書。
     *  @param sigAlg 表示數(shù)字簽名算法,詳見KMS CertificatePrivateKeySign接口文檔。
     *  @param message 表示待簽名內(nèi)容,需要小于等于4KB。
     */
    public byte[] doSignByCertificate(DefaultAcsClient client, String certId, String sigAlg, byte[] message) throws ClientException {
        String msgB64 = Base64.encodeBase64String(message); // 對(duì)待簽名內(nèi)容進(jìn)行Base64編碼。
        CertificatePrivateKeySignRequest request = new CertificatePrivateKeySignRequest();
        request.setCertificateId(certId);
        request.setAlgorithm(sigAlg);
        request.setMessage(msgB64);
    
        CertificatePrivateKeySignResponse response = client.getAcsResponse(request);
    
        String sigB64 = response.getSignatureValue();
        return Base64.decodeBase64(sigB64); // 對(duì)返回?cái)?shù)據(jù)進(jìn)行Base64解碼獲取簽名值數(shù)據(jù)。
    }

步驟五:證書驗(yàn)簽

  • 方法一:調(diào)用CertificatePublicKeyVerify接口使用指定證書驗(yàn)證數(shù)字簽名。
  • 方法二:通過KMS SDK使用指定證書驗(yàn)證數(shù)字簽名。關(guān)于KMS SDK的更多信息,請(qǐng)參見SDK概覽。Java代碼示例如下:
    import com.aliyuncs.DefaultAcsClient;
    import com.aliyuncs.exceptions.ClientException;
    import com.aliyuncs.kms.model.v20160120.CertificatePublicKeyVerifyRequest;
    import com.aliyuncs.kms.model.v20160120.CertificatePublicKeyVerifyResponse;
    import org.apache.commons.codec.binary.Base64;
    
    /**
     *  @param client 表示Alibaba Cloud SDK Client,詳見Alibaba Cloud SDK for Java文檔。
     *  @param certId 表示證書ID,指定要使用的數(shù)字證書。
     *  @param sigAlg 表示數(shù)字簽名算法,詳見KMS CertificatePrivateKeySign接口參考。
     *  @param message 表示待驗(yàn)證內(nèi)容,需要小于等于4KB。
     *  @param signature 表示待驗(yàn)證內(nèi)容的數(shù)字簽名。
     */
    public Boolean doVerifyByCertificate(DefaultAcsClient client, String certId, String sigAlg, byte[] message, byte[] signature) throws ClientException {
        String msgB64 = Base64.encodeBase64String(message); // 對(duì)待驗(yàn)證內(nèi)容進(jìn)行Base64編碼。
        String sigB64 = Base64.encodeBase64String(signature); // 對(duì)簽名值進(jìn)行Base64編碼。
        CertificatePublicKeyVerifyRequest request = new CertificatePublicKeyVerifyRequest();
        request.setCertificateId(certId);
        request.setAlgorithm(sigAlg);
        request.setMessage(msgB64);
        request.setSignatureValue(sigB64);
    
        CertificatePublicKeyVerifyResponse response = client.getAcsResponse(request);
    
        return response.getSignatureValid();
    }