全部产品
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 guna melakukan penandatanganan dan verifikasi. Topik ini menyediakan contoh kode terkait.

Contoh lengkap

package main

import (
	"fmt"
	"github.com/alibabacloud-go/tea/tea"
	dedicatedkmsopenapi "github.com/aliyun/alibabacloud-dkms-gcs-go-sdk/openapi"
	dedicatedkmsopenapiutil "github.com/aliyun/alibabacloud-dkms-gcs-go-sdk/openapi-util"
	dedicatedkmssdk "github.com/aliyun/alibabacloud-dkms-gcs-go-sdk/sdk"
	"io/ioutil"
)

// Konteks tanda tangan mungkin disimpan.
type SignatureContext struct {
	KeyId     string
	Signature []byte
	// Gunakan nilai algoritma default, jika nilai tidak diatur.
	Algorithm   string
	MessageType string
}

func main() {
	// ID atau alias dari kunci tanda tangan instance KMS.
	keyId := "<KEY_ID>"
	// Digest data atau data yang telah diproses sebelumnya untuk ditandatangani
	//digest := sha256.Sum256([]byte("message"))
	message := "<MESSAGE>"
	// Jenis data yang akan ditandatangani, RAW - data mentah yang akan ditandatangani, DIGEST - digest dari data yang akan ditandatangani
	//messageType := "DIGEST"
	messageType := "RAW"

	// Buat objek Client DKMS.
	client := getDkmsClientByClientKeyContent()
	//client := getDkmsClientByClientKeyFile()

	signatureCtx := signSample(client, keyId, []byte(message), messageType)
	verifyResult := verifySample(client, []byte(message), signatureCtx)
	fmt.Println(verifyResult)
}

// Contoh penandatanganan.
func signSample(client *dedicatedkmssdk.Client, keyId string, message []byte, messageType string) *SignatureContext {
	signRequest := &dedicatedkmssdk.SignRequest{
		KeyId:       tea.String(keyId),
		Message:     message,
		MessageType: tea.String(messageType),
	}
	// Verifikasi sertifikat server.
	ca, err := ioutil.ReadFile("path/to/caCert.pem")
	if err != nil {
		panic(err)
	}
	runtimeOptions := &dedicatedkmsopenapiutil.RuntimeOptions{
		Verify: tea.String(string(ca)),
	}
	// Atau, abaikan sertifikat.
	//runtimeOptions := &dedicatedkmsopenapiutil.RuntimeOptions{
	//	IgnoreSSL: tea.Bool(true),
	//}
	// Panggil API penandatanganan untuk penandatanganan.
	signResponse, err := client.SignWithOptions(signRequest, runtimeOptions)
	if err != nil {
		panic(err)
	}

	// ID Kunci.
	_keyId := tea.StringValue(signResponse.KeyId)
	// Nilai tanda tangan.
	_signature := signResponse.Signature
	// Jenis pesan.
	_messageType := tea.StringValue(signResponse.MessageType)
	// Algoritma tanda tangan.
	_algorithm := tea.StringValue(signResponse.Algorithm)

	fmt.Println("KeyId:", _keyId)
	fmt.Println("Signature:", _signature)
	fmt.Println("MessageType:", _messageType)
	fmt.Println("RequestId:", tea.StringValue(signResponse.RequestId))

	return &SignatureContext{
		KeyId:       _keyId,
		Signature:   _signature,
		MessageType: messageType,
		Algorithm:   _algorithm,
	}
}

// Contoh verifikasi tanda tangan.
func verifySample(client *dedicatedkmssdk.Client, message []byte, ctx *SignatureContext) (_value bool) {
	verifyRequest := &dedicatedkmssdk.VerifyRequest{
		KeyId:       tea.String(ctx.KeyId),
		Message:     message,
		MessageType: tea.String(ctx.MessageType),
		Signature:   ctx.Signature,
		Algorithm:   tea.String(ctx.Algorithm),
	}
	// Verifikasi sertifikat server.
	ca, err := ioutil.ReadFile("path/to/caCert.pem")
	if err != nil {
		panic(err)
	}
	runtimeOptions := &dedicatedkmsopenapiutil.RuntimeOptions{
		Verify: tea.String(string(ca)),
	}
	// Atau, abaikan sertifikat.
	//runtimeOptions := &dedicatedkmsopenapiutil.RuntimeOptions{
	//	IgnoreSSL: tea.Bool(true),
	//}
	// Panggil API verifikasi tanda tangan untuk verifikasi tanda tangan.
	verifyResponse, err := client.VerifyWithOptions(verifyRequest, runtimeOptions)
	if err != nil {
		panic(err)
	}

	// Hasil verifikasi tanda tangan.
	_value = tea.BoolValue(verifyResponse.Value)
	// Jenis pesan.
	_messageType := verifyResponse.MessageType

	fmt.Println("KeyId:", tea.StringValue(verifyResponse.KeyId))
	fmt.Println("Value:", _value)
	fmt.Println("MessageType:", tea.StringValue(_messageType))
	fmt.Println("RequestId:", tea.StringValue(verifyResponse.RequestId))

	return tea.BoolValue(verifyResponse.Value)
}

// Buat objek client SDK untuk instance KMS menggunakan konten ClientKey.
func getDkmsClientByClientKeyContent() *dedicatedkmssdk.Client {
	// Buat konfigurasi client SDK untuk instance KMS.
	config := &dedicatedkmsopenapi.Config{
	        // Setel protokol koneksi ke "https". Layanan instance KMS hanya mengizinkan akses melalui protokol HTTPS.
		Protocol: tea.String("https"),
		// Ganti dengan konten file ClientKey.
		ClientKeyContent: tea.String("<CLIENT_KEY_CONTENT>"),
		// Ganti dengan kata sandi enkripsi yang dimasukkan saat membuat ClientKey.
		Password: tea.String("<CLIENT_KEY_PASSWORD>"),
		// Setel titik akhir ke <KMS_INSTANCE_ID>.cryptoservice.kms.aliyuncs.com.
		Endpoint: tea.String("<ENDPOINT>"),
	}
	// Buat objek client SDK untuk instance KMS.
	client, err := dedicatedkmssdk.NewClient(config)
	if err != nil {
		// Tangani pengecualian.
		panic(err)
	}
	return client
}

// Buat objek client SDK untuk instance KMS menggunakan jalur file ClientKey.
func getDkmsClientByClientKeyFile() *dedicatedkmssdk.Client {
	// Buat konfigurasi Client DKMS.
	config := &dedicatedkmsopenapi.Config{
		// Setel protokol koneksi ke "https". Layanan instance KMS hanya mengizinkan akses melalui protokol HTTPS.
		Protocol: tea.String("https"),
		// Ganti dengan jalur file ClientKey.
		ClientKeyFile: tea.String("<CLIENT_KEY_FILE>"),
		// Ganti dengan kata sandi enkripsi yang dimasukkan saat membuat ClientKey.
		Password: tea.String("<CLIENT_KEY_PASSWORD>"),
                 // Setel titik akhir ke <KMS_INSTANCE_ID>.cryptoservice.kms.aliyuncs.com.
		Endpoint: tea.String("<ENDPOINT>"),
	}
	// Buat objek client SDK untuk instance KMS.
	client, err := dedicatedkmssdk.NewClient(config)
	if err != nil {
		// Tangani pengecualian.
		panic(err)
	}
	return client
}

Penjelasan contoh

Inisialisasi client

Anda dapat membuat objek client SDK instance KMS menggunakan konten ClientKey atau jalur file ClientKey.

import (
    dedicatedkmsopenapi "github.com/aliyun/alibabacloud-dkms-gcs-go-sdk/openapi"
    dedicatedkmssdk "github.com/aliyun/alibabacloud-dkms-gcs-go-sdk/sdk"
  "github.com/alibabacloud-go/tea/tea"
)

// Gunakan konten ClientKey untuk membuat objek client SDK instance KMS.
func getDkmsClientByClientKeyContent() *dedicatedkmssdk.Client {
	// Buat konfigurasi client SDK instance KMS.
	config := &dedicatedkmsopenapi.Config{
	        // Setel protokol koneksi ke "https". Layanan instance KMS hanya mengizinkan akses melalui protokol HTTPS.
		Protocol: tea.String("https"),
		// Ganti dengan konten file ClientKey.
		ClientKeyContent: tea.String("<CLIENT_KEY_CONTENT>"),
		// Ganti dengan kata sandi enkripsi yang dimasukkan saat membuat ClientKey.
		Password: tea.String("<CLIENT_KEY_PASSWORD>"),
		// Setel titik akhir ke <KMS_INSTANCE_ID>.cryptoservice.kms.aliyuncs.com.
		Endpoint: tea.String("<ENDPOINT>"),
	}
	// Buat objek client SDK instance KMS.
	client, err := dedicatedkmssdk.NewClient(config)
	if err != nil {
		// Penanganan abnormal.
		panic(err)
	}
	return client
}

// Gunakan jalur file ClientKey untuk membuat objek client SDK instance KMS.
func getDkmsClientByClientKeyFile() *dedicatedkmssdk.Client {
	// Buat konfigurasi client DKMS.
	config := &dedicatedkmsopenapi.Config{
		// Setel protokol koneksi ke "https". Layanan instance KMS hanya mengizinkan akses melalui protokol HTTPS.
		Protocol: tea.String("https"),
		// Ganti dengan jalur file ClientKey.
		ClientKeyFile: tea.String("<CLIENT_KEY_FILE>"),
		// Ganti dengan kata sandi enkripsi yang dimasukkan saat membuat ClientKey.
		Password: tea.String("<CLIENT_KEY_PASSWORD>"),
                 // Setel titik akhir ke <KMS_INSTANCE_ID>.cryptoservice.kms.aliyuncs.com.
		Endpoint: tea.String("ENDPOINT"),
	}
	// Buat objek client SDK instance KMS.
	client, err := dedicatedkmssdk.NewClient(config)
	if err != nil {
		// Penanganan abnormal.
		panic(err)
	}
	return client
}

Panggil API Sign untuk melakukan penandatanganan digital menggunakan kunci asimetris

// Contoh penandatanganan
func signSample(client *dedicatedkmssdk.Client, keyId string, message []byte, messageType string) *SignatureContext {
	signRequest := &dedicatedkmssdk.SignRequest{
		KeyId:       tea.String(keyId),
		Message:     message,
		MessageType: tea.String(messageType),
	}
	// Verifikasi sertifikat server.
	ca, err := ioutil.ReadFile("path/to/caCert.pem")
	if err != nil {
		panic(err)
	}
	runtimeOptions := &dedicatedkmsopenapiutil.RuntimeOptions{
		Verify: tea.String(string(ca)),
	}
	// Atau, abaikan sertifikat.
	//runtimeOptions := &dedicatedkmsopenapiutil.RuntimeOptions{
	//	IgnoreSSL: tea.Bool(true),
	//}
	// Panggil API penandatanganan untuk penandatanganan.
	signResponse, err := client.SignWithOptions(signRequest, runtimeOptions)
	if err != nil {
		panic(err)
	}

	// ID Kunci.
	_keyId := tea.StringValue(signResponse.KeyId)
	// Nilai tanda tangan.
	_signature := signResponse.Signature
	// Jenis pesan.
	_messageType := tea.StringValue(signResponse.MessageType)
	// Algoritma tanda tangan.
	_algorithm := tea.StringValue(signResponse.Algorithm)

	fmt.Println("KeyId:", _keyId)
	fmt.Println("Signature:", _signature)
	fmt.Println("MessageType:", _messageType)
	fmt.Println("RequestId:", tea.StringValue(signResponse.RequestId))

	return &SignatureContext{
		KeyId:       _keyId,
		Signature:   _signature,
		MessageType: messageType,
		Algorithm:   _algorithm,
	}
}

Panggil API Verify untuk memverifikasi tanda tangan digital menggunakan kunci asimetris

// Contoh verifikasi tanda tangan.
func verifySample(client *dedicatedkmssdk.Client, message []byte, ctx *SignatureContext) (_value bool) {
	verifyRequest := &dedicatedkmssdk.VerifyRequest{
		KeyId:       tea.String(ctx.KeyId),
		Message:     message,
		MessageType: tea.String(ctx.MessageType),
		Signature:   ctx.Signature,
		Algorithm:   tea.String(ctx.Algorithm),
	}
	// Verifikasi sertifikat server.
	ca, err := ioutil.ReadFile("path/to/caCert.pem")
	if err != nil {
		panic(err)
	}
	runtimeOptions := &dedicatedkmsopenapiutil.RuntimeOptions{
		Verify: tea.String(string(ca)),
	}
	// Atau, abaikan sertifikat.
	//runtimeOptions := &dedicatedkmsopenapiutil.RuntimeOptions{
	//	IgnoreSSL: tea.Bool(true),
	//}
	// Panggil API verifikasi tanda tangan untuk verifikasi tanda tangan.
	verifyResponse, err := client.VerifyWithOptions(verifyRequest, runtimeOptions)
	if err != nil {
		panic(err)
	}

	// Hasil verifikasi tanda tangan.
	_value = tea.BoolValue(verifyResponse.Value)
	// Jenis pesan
	_messageType := verifyResponse.MessageType

	fmt.Println("KeyId:", tea.StringValue(verifyResponse.KeyId))
	fmt.Println("Value:", _value)
	fmt.Println("MessageType:", tea.StringValue(_messageType))
	fmt.Println("RequestId:", tea.StringValue(verifyResponse.RequestId))

	return tea.BoolValue(verifyResponse.Value)
}