全部产品
Search
文档中心

Key Management Service:Contoh kode untuk penandatanganan dan verifikasi

更新时间:Jul 02, 2025

Setelah menginisialisasi SDK client instance KMS, Anda dapat menggunakannya untuk memanggil API Sign dan Verify dalam melakukan penandatanganan dan verifikasi. Topik ini menyediakan contoh kode terkait.

Contoh Lengkap

<?php

if (is_file(__DIR__ . '/../autoload.php')) {
    require_once __DIR__ . '/../autoload.php';
}

use AlibabaCloud\Dkms\Gcs\OpenApi\Util\Models\RuntimeOptions;
use AlibabaCloud\Dkms\Gcs\Sdk\Client as AlibabaCloudDkmsGcsSdkClient;
use AlibabaCloud\Dkms\Gcs\OpenApi\Models\Config as AlibabaCloudDkmsGcsOpenApiConfig;
use AlibabaCloud\Dkms\Gcs\Sdk\Models\SignRequest;
use AlibabaCloud\Dkms\Gcs\Sdk\Models\VerifyRequest;
use AlibabaCloud\Tea\Utils\Utils as AlibabaCloudTeaUtils;

// Tentukan jalur file ClientKey yang diperoleh dari manajemen aplikasi KMS.
// $clientKeyFile = '<CLIENT_KEY_FILE_PATH>';

// Sebagai alternatif, tentukan isi file ClientKey yang diperoleh dari manajemen aplikasi KMS.
$clientKeyContent = '<CLIENT_KEY_CONTENT>';

// Tentukan kata sandi enkripsi yang dimasukkan saat membuat ClientKey di manajemen aplikasi KMS.
$password = getenv('<CLIENT_KEY_PASSWORD>');

// Tentukan alamat VPC dari instance KMS Anda.
$endpoint = '<DKMS_INSTANCE_SERVICE_ADDRESS>';

// Tentukan ID kunci master asimetris yang dibuat di KMS.
$keyId = '<ASYMMETRIC_CMK_ID>';

// Algoritma tanda tangan.
$algorithm = '<SIGN_ALGORITHM>';

// Pesan yang akan ditandatangani.
$message = '<MESSAGE_DATA>';

// Jenis data pesan yang akan ditandatangani: RAW untuk data mentah, DIGEST untuk ringkasan.
$messageType = "RAW";

// Objek SDK Client untuk instance KMS.
$client = getDkmsGcsSdkClient();
if (is_null($client)) exit(1);

// Contoh penggunaan instance layanan enkripsi untuk penandatanganan dan verifikasi tanda tangan.
signVerifySample();

/**
 * Contoh penggunaan instance layanan enkripsi untuk penandatanganan dan verifikasi tanda tangan.
 * @return void
 */
function signVerifySample(){
    global $client, $keyId, $message, $messageType, $algorithm;

    $signatureCtx = signSample($client, $keyId, $message, $messageType, $algorithm);
    if ($signatureCtx !== null) {
        $verifyResult = verifySample($client, $message, $signatureCtx);
        if (!$verifyResult) {
            echo 'verifikasi gagal' . PHP_EOL;
        } else {
            echo 'signVerifySample berhasil' . PHP_EOL;
        }
    }
}

/**
 * Contoh penandatanganan.
 * @param AlibabaCloudDkmsGcsSdkClient $client
 * @param string $keyId
 * @param string $message
 * @param string $messageType
 * @param string $algorithm
 * @return SignatureContext
 */
function signSample($client, $keyId, $message, $messageType, $algorithm) {
    // Bangun permintaan penandatanganan.
    $signRequest = new SignRequest();
    $signRequest->keyId = $keyId;
    $signRequest->algorithm = $algorithm;
    $signRequest->message = AlibabaCloudTeaUtils::toBytes($message);
    $signRequest->messageType = $messageType;
    $runtimeOptions = new RuntimeOptions();
    // Abaikan sertifikat.
    //$runtimeOptions->ignoreSSL = true;

    try {
        // Panggil API penandatanganan untuk melakukan penandatanganan.
        $signResponse = $client->signWithOptions($signRequest, $runtimeOptions);
        // ID kunci.
        $keyId = $signResponse->keyId;
        // Nilai tanda tangan.
        $signature = $signResponse->signature;
        // Jenis pesan.
        $messageType = $signResponse->messageType;
        // Algoritma tanda tangan.
        $algorithm = $signResponse->algorithm;
        var_dump($signResponse->toMap());
        return new SignatureContext([
            'keyId' => $keyId,
            'signature' => $signature,
            'messageType' => $messageType,
            'algorithm' => $algorithm
        ]);
    } catch (Exception $error) {
        if ($error instanceof \AlibabaCloud\Tea\Exception\TeaError) {
            var_dump($error->getErrorInfo());
        }
        var_dump($error->getMessage());
        var_dump($error->getTraceAsString());
    }
    return null;
}

/**
 * Contoh verifikasi tanda tangan.
 * @param AlibabaCloudDkmsGcsSdkClient $client
 * @param string $message
 * @param SignatureContext $ctx
 * @return bool|null
 */
function verifySample($client, $message, $ctx) {
    // Bangun permintaan verifikasi tanda tangan.
    $verifyRequest = new VerifyRequest();
    $verifyRequest->keyId = $ctx->keyId;
    $verifyRequest->signature = $ctx->signature;
    $verifyRequest->message = AlibabaCloudTeaUtils::toBytes($message);
    $verifyRequest->messageType = $ctx->messageType;
    $verifyRequest->algorithm = $ctx->algorithm;
    $runtimeOptions = new RuntimeOptions();
    // Abaikan sertifikat server.
    //$runtimeOptions->ignoreSSL = true;

    try {
        // Panggil API verifikasi tanda tangan untuk melakukan verifikasi.
        $verifyResponse = $client->verifyWithOptions($verifyRequest, $runtimeOptions);
        // Hasil verifikasi.
        $value = $verifyResponse->value;
        var_dump($verifyResponse->toMap());
        return $value;
    } catch (Exception $error) {
        if ($error instanceof \AlibabaCloud\Tea\Exception\TeaError) {
            var_dump($error->getErrorInfo());
        }
        var_dump($error->getMessage());
        var_dump($error->getTraceAsString());
    }
    return null;
}

/**
 * Bangun objek SDK Client untuk instance KMS.
 * @return AlibabaCloudDkmsGcsSdkClient
 */
function getDkmsGcsSdkClient()
{
    global $clientKeyContent, $password, $endpoint;

    // Bangun konfigurasi SDK Client untuk instance KMS.
    $config = new AlibabaCloudDkmsGcsOpenApiConfig();
    // Setel protokol koneksi ke "https". Layanan instance KMS hanya mengizinkan akses melalui protokol HTTPS.
    $config->protocol = 'https';
    // Client Key.
    $config->clientKeyContent = $clientKeyContent;
    // Kata sandi Client Key.
    $config->password = $password;
    // Setel endpoint ke <ID INSTANCE KMS>.cryptoservice.kms.aliyuncs.com.
    $config->endpoint = $endpoint;
    // Sertifikat CA instance.
    $config->caFilePath = 'path/to/caCert.pem';

    // Bangun objek SDK Client untuk instance KMS.
    return new AlibabaCloudDkmsGcsSdkClient($config);
}

/**
 * Konteks tanda tangan mungkin disimpan.
 */
class SignatureContext
{
    public function __construct($config = [])
    {
        if (!empty($config)) {
            foreach ($config as $k => $v) {
                $this->{$k} = $v;
            }
        }
    }
    /**
     * @var string
     */
    public $keyId;

    /**
     * @var int[]
     */
    public $signature;

    /**
     * @var string
     */
    public $messageType;

    /**
     * @var string
     * Gunakan nilai algoritma default, jika nilai tidak disetel.
     */
    public $algorithm;
}

Penjelasan contoh

Inisialisasi client

<?php

use AlibabaCloud\Dkms\Gcs\Sdk\Client as AlibabaCloudDkmsGcsSdkClient;
use AlibabaCloud\Dkms\Gcs\OpenApi\Models\Config as AlibabaCloudDkmsGcsOpenApiConfig;


function getDkmsGcsSdkClient()
{
    global $clientKeyContent, $password, $endpoint;

    // Bangun konfigurasi SDK client instance KMS.
    $config = new AlibabaCloudDkmsGcsOpenApiConfig();
    // Protokol koneksi. Setel nilainya ke https. Layanan instance KMS hanya mengizinkan akses melalui protokol HTTPS.
    $config->protocol = 'https';
    // Client Key.
    $config->clientKeyContent = $clientKeyContent;
    // Token keamanan Client Key.
    $config->password = $password;
    // Endpoint instance KMS Anda. Setel nilainya dalam format berikut: <ID instance KMS Anda>.cryptoservice.kms.aliyuncs.com.
    $config->endpoint = $endpoint;
    // Sertifikat CA instance.
    $config->caFilePath = 'path/to/caCert.pem';

    // Bangun objek SDK client instance KMS.
    return new AlibabaCloudDkmsGcsSdkClient($config);
}

Panggil Sign API untuk melakukan penandatanganan digital menggunakan kunci asimetris

/**
 * Contoh penandatanganan.
 * @param AlibabaCloudDkmsGcsSdkClient $client
 * @param string $keyId
 * @param string $message
 * @param string $messageType
 * @param string $algorithm
 * @return SignatureContext
 */
function signSample($client, $keyId, $message, $messageType, $algorithm) {
    // Bangun permintaan penandatanganan.
    $signRequest = new SignRequest();
    $signRequest->keyId = $keyId;
    $signRequest->algorithm = $algorithm;
    $signRequest->message = AlibabaCloudTeaUtils::toBytes($message);
    $signRequest->messageType = $messageType;
    $runtimeOptions = new RuntimeOptions();
    // Abaikan sertifikat.
    //$runtimeOptions->ignoreSSL = true;

    try {
        // Panggil API penandatanganan untuk melakukan penandatanganan.
        $signResponse = $client->signWithOptions($signRequest, $runtimeOptions);
        // ID kunci.
        $keyId = $signResponse->keyId;
        // Nilai tanda tangan.
        $signature = $signResponse->signature;
        // Jenis pesan.
        $messageType = $signResponse->messageType;
        // Algoritma tanda tangan.
        $algorithm = $signResponse->algorithm;
        var_dump($signResponse->toMap());
        return new SignatureContext([
            'keyId' => $keyId,
            'signature' => $signature,
            'messageType' => $messageType,
            'algorithm' => $algorithm
        ]);
    } catch (Exception $error) {
        if ($error instanceof \AlibabaCloud\Tea\Exception\TeaError) {
            var_dump($error->getErrorInfo());
        }
        var_dump($error->getMessage());
        var_dump($error->getTraceAsString());
    }
    return null;
}

Panggil Verify API untuk memverifikasi tanda tangan digital menggunakan kunci asimetris

/**
 * Contoh verifikasi tanda tangan.
 * @param AlibabaCloudDkmsGcsSdkClient $client
 * @param string $message
 * @param SignatureContext $ctx
 * @return bool|null
 */
function verifySample($client, $message, $ctx) {
    // Bangun permintaan verifikasi tanda tangan.
    $verifyRequest = new VerifyRequest();
    $verifyRequest->keyId = $ctx->keyId;
    $verifyRequest->signature = $ctx->signature;
    $verifyRequest->message = AlibabaCloudTeaUtils::toBytes($message);
    $verifyRequest->messageType = $ctx->messageType;
    $verifyRequest->algorithm = $ctx->algorithm;
    $runtimeOptions = new RuntimeOptions();
    // Abaikan sertifikat server.
    //$runtimeOptions->ignoreSSL = true;

    try {
        // Panggil API verifikasi tanda tangan untuk melakukan verifikasi.
        $verifyResponse = $client->verifyWithOptions($verifyRequest, $runtimeOptions);
        // Hasil verifikasi.
        $value = $verifyResponse->value;
        var_dump($verifyResponse->toMap());
        return $value;
    } catch (Exception $error) {
        if ($error instanceof \AlibabaCloud\Tea\Exception\TeaError) {
            var_dump($error->getErrorInfo());
        }
        var_dump($error->getMessage());
        var_dump($error->getTraceAsString());
    }
    return null;
}