Setelah menginisialisasi SDK client instance KMS, Anda dapat menggunakannya untuk memanggil API Sign dan Verify dalam proses penandatanganan dan verifikasi. Topik ini menyediakan contoh kode terkait.
Contoh lengkap
Penjelasan contoh
Inisialisasi client
import com.aliyun.dkms.gcs.openapi.models.Config;
import com.aliyun.dkms.gcs.sdk.Client;
public static void initClient() throws Exception {
// Protokol koneksi. Atur nilainya ke https. Layanan instance KMS hanya mengizinkan akses melalui protokol HTTPS.
Config config = new Config();
config.setProtocol("https");
// Kunci client.
config.setClientKeyFile("<CLIENT_KEY_FILE>");
// Kata sandi kunci client.
config.setPassword("<PASSWORD>");
// Titik akhir instance KMS Anda. Atur nilainya dalam format berikut: <KMS_INSTANCE_ID>.cryptoservice.kms.aliyuncs.com.
config.setEndpoint("<ENDPOINT>");
// Sertifikat otoritas sertifikat (CA) dari instance KMS. Anda dapat menentukan jalur ke file sertifikat CA atau memasukkan isi sertifikat CA.
config.setCaFilePath("<CA_CERTIFICATE_PATH>");
// Sebagai alternatif, atur isi sertifikat CA dari instance KMS.
//config.setCa("<CA_CERTIFICATE_CONTENT");
client = new Client(config);
}Panggil API Sign untuk menandatangani data menggunakan kunci asimetris
/**
* Gunakan KMS untuk menandatangani pesan.
*
* @param keyId
* @param algorithm
* @param message
* @param messageType
* @return
* @throws Exception
*/
public static SignContext asymmetricSign(String keyId, String algorithm, String message, String messageType) throws Exception {
SignRequest signRequest = new SignRequest();
signRequest.setKeyId(keyId);
signRequest.setAlgorithm(algorithm);
signRequest.setMessage(getDigest(message));
signRequest.setMessageType(messageType);
try {
// Jika Anda ingin mengabaikan sertifikat server, Anda dapat menggunakan kode yang dikomentari berikut untuk memanggil operasi.
//RuntimeOptions runtimeOptions = new RuntimeOptions();
//runtimeOptions.setIgnoreSSL(true);
//SignResponse signResponse = client.signWithOptions(signRequest, runtimeOptions);
SignResponse signResponse = client.sign(signRequest);
// Nilai tanda tangan.
byte[] signature = signResponse.getSignature();
System.out.println("================sign================");
System.out.printf("KeyId: %s%n", signResponse.getKeyId());
System.out.printf("Tanda tangan: %s%n", Arrays.toString(signature));
System.out.println("================sign================");
return new SignContext(signResponse.getKeyId(), signResponse.getSignature(), signResponse.getAlgorithm(), signResponse.getMessageType());
} catch (TeaException e) {
System.out.printf("Kode: %s%n", ((TeaException) e).getCode());
System.out.printf("Pesan: %s%n", ((TeaException) e).getMessage());
System.out.printf("HttpCode: %s%n", ((TeaException) e).getData().get("httpCode"));
System.out.printf("HostId: %s%n", ((TeaException) e).getData().get("hostId"));
System.out.printf("RequestId: %s%n", ((TeaException) e).getData().get("requestId"));
e.printStackTrace();
throw new RuntimeException(e);
} catch (Exception e) {
System.out.printf("Pesan kesalahan sign: %s%n", e.getMessage());
e.printStackTrace();
throw new RuntimeException(e);
}
}
Panggil API Verify untuk memverifikasi tanda tangan menggunakan kunci asimetris
Hasil penandatanganan dan verifikasi menggunakan KMS sesuai dengan standar algoritma yang berlaku. Selain memanggil API Verify untuk memverifikasi tanda tangan, Anda juga dapat mengunduh kunci publik dari KMS dan memverifikasi tanda tangan menggunakan pustaka kriptografi lainnya.
/**
* Gunakan KMS untuk memverifikasi tanda tangan pesan.
*
* @param signContext
* @throws Exception
*/
public static void asymmetricVerify(final SignContext signContext, String message) throws Exception {
VerifyRequest verifyRequest = new VerifyRequest();
verifyRequest.setKeyId(signContext.getKeyId());
verifyRequest.setAlgorithm(signContext.getAlgorithm());
verifyRequest.setMessage(getDigest(message));
verifyRequest.setMessageType(signContext.getMessageType());
verifyRequest.setSignature(signContext.getSignature());
try {
// Jika Anda ingin mengabaikan sertifikat server, Anda dapat menggunakan kode yang dikomentari berikut untuk memanggil operasi.
//RuntimeOptions runtimeOptions = new RuntimeOptions();
//runtimeOptions.setIgnoreSSL(true);
//VerifyResponse verifyResponse = client.verifyWithOptions(verifyRequest, runtimeOptions);
VerifyResponse verifyResponse = client.verify(verifyRequest);
System.out.println("================verify================");
System.out.printf("KeyId: %s%n", verifyResponse.getKeyId());
System.out.printf("Nilai: %s%n", verifyResponse.getValue());
System.out.println("================verify================");
} catch (TeaException e) {
System.out.printf("Kode: %s%n", ((TeaException) e).getCode());
System.out.printf("Pesan: %s%n", ((TeaException) e).getMessage());
System.out.printf("HttpCode: %s%n", ((TeaException) e).getData().get("httpCode"));
System.out.printf("HostId: %s%n", ((TeaException) e).getData().get("hostId"));
System.out.printf("RequestId: %s%n", ((TeaException) e).getData().get("requestId"));
e.printStackTrace();
} catch (Exception e) {
System.out.printf("Pesan kesalahan verify: %s%n", e.getMessage());
e.printStackTrace();
}
}