tencent cloud

License連携

PDF
フォーカスモード
フォントサイズ
最終更新日: 2026-02-04 14:24:01
Marketplace経由でインストールされたソフトウェアに対して、Marketplaceは Licenseを発行します。ソフトウェアプロセス内では、Licenseの読み取りおよび検証が可能です。

Licenseの役割は何ですか?

Licenseは、ソフトウェアのエンドユーザー向けのライセンスであり、権限付与の内容は以下を含みます:
使用期限:ソフトウェアの期限が切れた場合、プロセスはサービス拒否または機能制限サービスを提供することがあります。
仕様:ソフトウェアは権限付与された仕様(コンカレント数やユーザー数などの制限)に基づいて実行可能です。

Marketplace Licenseとの連携の利点は何ですか?

円滑:注文すると自動的にLicenseが発行され、待つ必要がありません。
柔軟性:契約更新やスケールアップ・スケールダウンなどの柔軟なニーズをサポートします。
信頼性:Tencent Cloud公式発行のロール紐付けに基づくインスタンス関連付けLicenseであり、偽造や複製が困難です。

License取引と出荷




サービスプロバイダーは、アプリケーションパッケージに対応する商品の仕様を定義する必要があります。定義された仕様は、ユーザーが購入する際に確定され、Licenseの仕様として扱われます。
Licenseは、お客様が購入したソフトウェア仕様に基づいて発行され、発行されたライセンスには以下の情報が含まれます:
関連付けられたソフトウェアパッケージ
関連付けられたソフトウェアインスタンス
権限付与の仕様情報
権限付与モード(永続/サブスクリプション)
権限付与状態(有効/期限切れ/無効)
発行時間、有効化時間、有効期限切れ時間、失効時間

License検証

サービスプロバイダーのアプリケーションイメージは、クラウドAPIでLicenseを検証できます。手順は次のとおりです。



ソフトウェアのLicenseを検証するための核心的な手順は次のとおりです:
インストールパラメータcloudapp_cam_roleを取得します。CAMロールを使用して一時キーを申請し、クラウドAPIを呼び出します。詳細はドキュメントクラウドAPIの呼び出しをご参照ください。
cloudapp.VerifyLicense APIを呼び出すことで、現在のプロセスに関連付けられたLicense情報を取得します。
ソフトウェアプロセスは、必要に応じてLicenseの状態を検証するか、仕様に基づいて機能制御を行います。
License情報の例は以下の通りです:
{
"Response": {
"RequestId": "9026a0fe-992e-4015-a5d5-95a322333853",
"License": {
"ActivationDate": "2024-12-10T09:46:58+08:00",
"AuthorizedCloudappId": "cloudapp-2gwvcfb1",
"AuthorizedCloudappRoleId": "0",
"AuthorizedSpecification": [
{
"ParamKey": "version",
「ParamKeyName」: 「バージョン」
"ParamValue": "basic",
"ParamValueName": "基本版"
},
{
"ParamKey": "scale",
"ParamKeyName": "仕様",
"ParamValue": "single",
"ParamValueName": "単一スレッド"
}
],
"AuthorizedUserUin": "100000888888",
"BillingMode": 1,
"ExpirationDate": "2025-01-10T09:46:58+08:00",
"IssueDate": "2024-12-10T09:46:46+08:00",
"LicenseId": "100000888888:pkg-la39nlb7:cloudapp-2gwvcfb1:6006",
"LicenseMode": "Subscription",
"LicenseStatus": "Active",
"LicenseType": "Standard",
"LifeSpan": 1,
"LifeSpanUnit": "M",
"ProviderId": 100000099,
"SoftwarePackageId": "pkg-la39nlb7"
},
"Signature": "T2mbjUr8Q8I0nekShP7WJs7MvUq8Ovv0lrWkn5PEIPVlFYWpaRJOWBviQstCUaotFE89QQdbDEDaP9XVXtPfFt47Zp/BN+qaajTNdUN/HL8IAsC15OsDjGtXgdezPcRwDNx0SfaWBmBeJuB2xgFxvF7/tKcWKEltAf+tE4/SPMcIFDQPOqQD1gpdC0HM3nSL92uP+yN6jCRGbTSZXN8L5RAC64f9XfSuFIIhDGQpKbXDalmrxxUHMRG6Qcs5TtQw7vdQvpwRY1NeRWC49g97ZZaboveK0skG1ym3wfk0Z8slkEzlVWbLmYe4VjJpdMpQv29XPrCUHc3tPJ4beb9FiJ1N4kzUflmr6bo75zRm4XSs8NIjN/jONPArt+6dTua9MITNtqP4nqKtwS6lw3GBZeTljb+wz5FlV1tKYoYMaBJSZyAu27mT7nwt1HJ34XLOw/yvgeGmqNDe6kAqxJ9tg/kEmw6TZP8UiKeWITsRCYXkdsyfeCnacVyiWFcsonOJoG4+wujnjroXEMgymw/CiddQD13PH4sLscpqgxlvXntVf2ljYP0ryFnO/bcq5I3L6FIVtOhpb6yjdWAl1A5FO9KG7jNT9aD11f38G7t1A4PIi2OdBQpcOLfYO3fqoimbAqiWVy8ww9N63ejnN+7ioJ/km2zBrAejFRv7Qes+p6c=",
"Timestamp": "2025-01-09T10:28:57+08:00"
}
}
注目すべきフィールドは:
LicenseStatus:権限付与の状態。Activeの場合は権限が有効であることを表し、Deactiveの場合は権限が失効していることを表します。サービスプロバイダーは、LicenseStatusフィールドを使用して権限付与の有効性を判断する必要があります。
AuthorizedSpecification:権限付与された仕様であり、ソフトウェアプロセスはこの仕様に基づいてソフトウェアの動作を制御します。
LicenseMode:権限付与モード、サブスクリプションか永久買い切りです。
Signature:Response.License構造体に対する署名です。Licenseのセキュリティ要件が高い場合は、署名検証を実施できます(詳細はLicense署名検証方法を参照)。これにより、返されたライセンス情報が中間者による傍受や改ざんを受けていないことを確保できます。
Licenseの検証タイミングは、ソフトウェアプロセスが自ら決定することができ、一般的な方法としては以下が挙げられます:
定期的な検証、例えば毎日あるいは毎時間に検証します。
オンデマンド検証を実施します。例えば、Licenseの検証が必要な製品機能を呼び出す際に検証を行います。

License開発デバッグ

アプリケーションパッケージのpackage.yamlに以下の形式でspecs仕様設定を追加することにより、アプリケーション開発版のインストール時に仕様情報と権限付与モードを選択してLicenseを作成することが可能になります。
# <package.yaml>
# アプリケーションパッケージ仕様の宣言
specs:
- key: version
name: バージョン
enum:
- value: standard
name: 標準版
- value: advanced
name: アドバンスト版
- value: enterprise
name: エンタープライズ版
- key: cluster_mode
name: クラスタ・モード
enum:
- value: single
name:シングルクラスタ
- value: double
name: デュアルクラスタ
- value: triple
name: 3クラスタ

License署名検証方法

署名はRSA-PSS-SHA256アルゴリズムで実装されています。以下の公開鍵を使用して署名検証を行ってください:
-----BEGIN PUBLIC KEY-----
MIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEA5EQJv0v0f1hrB7NIGwXi
hFmw+ugrJi7gnmOqaiYp7oFrzf4RSJ3DPr4K01F+CrjTdCPghDLq4fsKVxxHAjNj
nbstbVlHZEVOfzQ4umeocJpxWFuyKyGwHv+obnEZ/4689fxVpTbG3IbUTGn1TRJs
9s3xM8nFd6LLAoh1Hhrdf2D4mLRToLvtRVat1l8fH3gsM+RoG4L4h+3hghn4bpyA
na2MBFDzvmBeVGUVzqRjSvUaexd+Bo1wTsllAdqjP6MTlAAWGmIAMStBSRS+YpRQ
xjhE9Rdb9zTE54q3Ui7UJg5BMe+R3kVrBINbnT6Va8/Lzjg4+THdpMTLr6fY6ObF
7r+i/924XgxqQOFvGaFJSyjXTORnK42T5YRr5TSqxr9CzhybPcdRvws2GdAq9f55
8whj1DYcgg0X8kR06Iu+/9Mk/CqssdrZ8LYDwSkDI8S/RwpdNQfifUa8wyY0R2xN
nY+bnkrjvGPz7Rokr0Ki9/orT9i4yQWA1mMCDi2vcP+oXqrEs7XAyH85gDSzuTp+
dXbTYPZpIAK6Kejwssw1IE1lGNP4PNQZk9EXU7+vB1csz4GUao7Mr7F5VbrGKvTs
aGxbIc6b0MDWMEFA7L/CWC9UtReWCk1MYwJzy105bWU/VBpYJPmyZTFRQaY2MEH4
fnsK2+jtZ1IYIQw/YsHU6CcCAwEAAQ==
-----END PUBLIC KEY-----
署名検証は以下の二つのフィールドに関わります:
Response.Signature:署名のことであり、Response.LicenseのJSON構造体を圧縮して改行を除去した後、RSA-PSS-SHA256署名を行うことです。
Response.License:署名されたJSON構造体を指します。署名検証時には、この構造体が改行を除去して圧縮されたJSONデータであることを保証する必要があります。
署名検証のサンプルコードについて、現在Golang版をご提供しています。その他の言語のサンプルは後日提供予定です。
Go Lang
// VerifySignWithSha256RSAはRSA公開鍵を使用して署名を検証します。
// @Param   publicKey PEM形式のPKIX RSA公開鍵
// @Param   signature base64でエンコードされた署名
// @Param   message 署名検証対象のコンテンツ
// @Return  error  署名検証が成功した場合はnilを返し、そうでない場合はエラーを返します。
func VerifySignWithSha256RSA(publicKey string, signature string, message []byte) error {
// 公開鍵を解析する
publicKeyBlock, _ := pem.Decode([]byte(publicKey)) // pem形式の公開鍵を読み取る
// PKIX形式のRSA公開鍵を復号する
rsaPublicKeyPKIX, err := x509.ParsePKIXPublicKey(publicKeyBlock.Bytes)
if err != nil {
return err
}
rsaPublicKey, ok := rsaPublicKeyPKIX.(*rsa.PublicKey)
if !ok {
return fmt.Errorf("public key is not rsa public key")
}
// メッセージのSHA-256ハッシュを計算する
hash := sha256.New()
hash.Write(message)
hashedMessage := hash.Sum(nil)
// signatureを取得する
signatureFromBase64, err := base64.StdEncoding.DecodeString(signature)
if err != nil {
return err
}
// 公開鍵を使用して署名を検証する
return rsa.VerifyPSS(rsaPublicKey, crypto.SHA256, hashedMessage, signatureFromBase64, nil)
}

// 使用例
const publicKeyPkix = "-----BEGIN PUBLIC KEY-----\\nMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAvIPknZUDTxI8ep3wDFsN\\nC2vF1sTUfF8f6pnjSduwtIc5yUYV/1hONRe4DwWRiXQPrDRTjlDridNRfglmktoe\\ngUewNKfluGlxuTrUV35BBSGXdFTWJNg8/9j5zpsQS69mjwlh0wO8RxL0N9JatyHD\\nHZBg9psp4RGj57wxEdyANv5IUvPQ0MUwuZ64UATl/0VI5eRM1FCJI5rE9kC+eJyH\\n+c/63SNqBoSjG2kmXUb4nN8DPoDs90oA0wS2Yq1kr83kPAaFpcCIvnNKbXCK/hbY\\nJymt92Tcd8/viCxcEd88hacfzavWkyiLPl0W7Golnn2N9ZIyPwUb3a52yC4HiS5h\\n4XQSogiFluMQ+OIm4YwoaGgTILoU/Ip03LX7AILNI/Fcx9oGsLv2v4Lj01bStdJj\\n7EaCeitIw3SVyjlNAaoBTLzee0opBgVHGf8AnCzzf6qe7a0ics+pJbJi8+SGN6CF\\nOBZxeQxqu7ZE9c6y05ZYQEh0e5V/5KlIZMG0FtmyMY1Q1l2CHjVJz4xzG8t8asqZ\\njg7uVpsnQhOxrbz68cAnw9X/9297K62VnECa8z9/3kSfY0SWd+lmc5HpFRzRJPt8\\nDLjFR/r/turTJ+HnvUe1aJzD2oa8D8Y09T6gQWmAlmqLOnt7aSPm/zN3rVt/6CPY\\n6EKSQMgJ7oOgKg4FybkNELcCAwEAAQ==\\n-----END PUBLIC KEY-----"

func TestVerifySignWithSha256RSA(t *testing.T) {
type args struct {
publicKey string
signature string
message   []byte
}
tests := []struct {
name    string
args    args
wantErr bool
}{
{
name:    "署名検証",
wantErr: false,
args: args{
publicKey: publicKeyPkix,
signature: "T2mbjUr8Q8I0nekShP7WJs7MvUq8Ovv0lrWkn5PEIPVlFYWpaRJOWBviQstCUaotFE89QQdbDEDaP9XVXtPfFt47Zp/BN+qaajTNdUN/HL8IAsC15OsDjGtXgdezPcRwDNx0SfaWBmBeJuB2xgFxvF7/tKcWKEltAf+tE4/SPMcIFDQPOqQD1gpdC0HM3nSL92uP+yN6jCRGbTSZXN8L5RAC64f9XfSuFIIhDGQpKbXDalmrxxUHMRG6Qcs5TtQw7vdQvpwRY1NeRWC49g97ZZaboveK0skG1ym3wfk0Z8slkEzlVWbLmYe4VjJpdMpQv29XPrCUHc3tPJ4beb9FiJ1N4kzUflmr6bo75zRm4XSs8NIjN/jONPArt+6dTua9MITNtqP4nqKtwS6lw3GBZeTljb+wz5FlV1tKYoYMaBJSZyAu27mT7nwt1HJ34XLOw/yvgeGmqNDe6kAqxJ9tg/kEmw6TZP8UiKeWITsRCYXkdsyfeCnacVyiWFcsonOJoG4+wujnjroXEMgymw/CiddQD13PH4sLscpqgxlvXntVf2ljYP0ryFnO/bcq5I3L6FIVtOhpb6yjdWAl1A5FO9KG7jNT9aD11f38G7t1A4PIi2OdBQpcOLfYO3fqoimbAqiWVy8ww9N63ejnN+7ioJ/km2zBrAejFRv7Qes+p6c=",
"{\\"ActivationDate\\":\\"2024-12-10T09:46:58+08:00\\",\\"AuthorizedCloudappId\\":\\"cloudapp-2gwvcfb1\\",\\"AuthorizedCloudappRoleId\\":\\"0\\",\\"AuthorizedSpecification\\":[{\\"ParamKey\\":\\"version\\",\\"ParamKeyName\\":\\"バージョン\\",\\"ParamValue\\":\\"basic\\",\\"ParamValueName\\":\\"ベーシック版\\"},{\\"ParamKey\\":\\"scale\\",\\"ParamKeyName\\":\\"仕様\\",\\"ParamValue\\":\\"single\\",\\"ParamValueName\\":\\"シングルスレッド\\"}],\\"AuthorizedUserUin\\":\\"100000888888\\",\\"BillingMode\\":1,\\"ExpirationDate\\":\\"2025-01-10T09:46:58+08:00\\",\\"IssueDate\\":\\"2024-12-10T09:46:46+08:00\\",\\"LicenseId\\":\\"100000888888:pkg-la39nlb7:cloudapp-2gwvcfb1:6006\\",\\"LicenseMode\\":\\"Subscription\\",\\"LicenseStatus\\":\\"Active\\",\\"LicenseType\\":\\"Standard\\",\\"LifeSpan\\":1,\\"LifeSpanUnit\\":\\"M\\",\\"ProviderId\\":100000099,\\"SoftwarePackageId\\":\\"pkg-la39nlb7\\"}"
},
},
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
if err := VerifySignWithSha256RSA(tt.args.publicKey, tt.args.signature, tt.args.message); (err != nil) != tt.wantErr {
t.Errorf("VerifySignWithSha256RSA() error = %v, wantErr %v", err, tt.wantErr)
}
})
}
}

Licenseに関するよくある質問

Licenseの接続は必要ですか?自身でLicenseを生成と検証することは可能ですか?

必要です。接続後、ユーザーのソフトウェア課金と権限付与はオンラインで自動連携が可能になります。例:
無料トライアルから課金への移行は、Licenseのアップデートのみで完了します。ユーザーがインスタンスを更新する必要はなく、データを保持できます。
継続シナリオでは、Licenseが自動的にリフレッシュされるため、サービスプロバイダに連絡して手動で更新する必要はありません。
スケールアップ/ダウンの場合でも、Licenseは自動的にリフレッシュされ、インスタンスの交換は必要ありません。
ソフトウェア自体がフリーウェアである場合、ソフトウェアのライセンス認証は不要であり、Licenseの導入を確認する必要はありません。

サービスプロバイダーはLicenseの発行を把握できますか?

一時的に感知できません。

署名を検証するための公開鍵はどのように保存しますか?

公開鍵はLicense情報の署名検証に使用され、VerifyLicense内のLicense情報がTencent Cloudによって発行され中間者による改ざんが行われていないことを保証します。ベンダーがLicense署名を検証する際には、License署名検証方法で提供される公開鍵をロードすることを確認すべきです。さもなければ、License情報が中間者攻撃や改ざんを受ける可能性があります。したがって、公開鍵を容易に変更可能な設定ファイルや類似の独立設定に晒すべきではありません。ソフトウェアクライアントにオフライン保存する必要がある場合は、少なくとも公開鍵設定を難読化/強化されたクライアント実行ファイル内に保持すべきです。

ヘルプとサポート

この記事はお役に立ちましたか?

フィードバック