本文へ移動
LICENTIVO / INTEGRATION

C++ アプリのオフラインライセンス認証:ファイル交換による実装

端末に紐付いたリクエスト・応答ファイルで C++ アプリを認証します。CMake の実装例に沿って、署名付きライセンス、端末の紐付け、オフライン利用期限を確認します。

オフライン ワークフロー · C++17更新日

1. オフラインポリシーを選択します

ネットワークから隔離された端末の C++ アプリでは、端末に紐付いた認証リクエストを出力し、インターネット接続端末で承認してから、元の端末へ署名付き応答を取り込みます。このファイル交換方式には、オフライン認証を許可するポリシーの端末固定ライセンスが必要です。フローティングライセンスにはオンラインセッションが必要です。

デバイス枠は現在のアクティベーション数で計算し、解除すると返却されます。通常ライセンスはオフラインでも枠を使用し、フローティングライセンスはリース満了時にも自動返却されます。

  1. [コンソール] > [製品] から製品 ID をコピーします。その製品の署名公開鍵を開き、すべてのキー ID/公開鍵のペアを初期化コードに貼り付けて、YOUR_PRODUCT_ID、YOUR_KEY_ID、および YOUR_PUBLIC_KEY を置き換えます。迅速な統合により、これらのパブリック コード定数を生成できます。製品構成ファイルは必要ありません。 SDK のデフォルトは https://www.licentivo.com. です

2. ネイティブ SDK をインストールします

CMake 3.18 以降をインストールします。Windows x64 では Visual Studio 2022 C++ Build Tools と対応する MSVC SDK パッケージを使い、-G "Visual Studio 17 2022" -A x64 を指定します。Linux x64 では C11・C++17 コンパイラーを使います。SDK_PREFIX はインストーラーが表示した CMake プレフィックスに置き換えてください。サンプルを offline.cpp として保存し、下の CMakeLists.txt を同じディレクトリへ配置します。導入とビルドは接続可能な端末で完了し、実行ファイルと実行時依存ファイルをオフライン端末へコピーします。

コンパイラーと CPU アーキテクチャに合う、共有ライブラリ版 libcurl の開発パッケージをインストールします。Windows MSVC x64 では、CURL_DIR を CURLConfig.cmake があるディレクトリに置き換え、ローカル実行時は curl の bin ディレクトリを PATH に追加します。アプリ配布時には必要な DLL を同梱してください。Linux では、ディストリビューションの共有ライブラリ版 libcurl 開発パッケージを使います。

Windows · PowerShell
& ([scriptblock]::Create((Invoke-WebRequest 'https://www.licentivo.com/assets/sdk/releases/v0.11.6/install.ps1').Content)) -Language cpp -Toolchain msvc
Linux · Bash
curl --fail --silent --show-error --location --proto '=https' --proto-redir '=https' 'https://www.licentivo.com/assets/sdk/releases/v0.11.6/install.sh' | bash -s -- cpp
CMake · CMakeLists.txt
cmake_minimum_required(VERSION 3.18)
project(offline_activation LANGUAGES C CXX)
find_package(Licentivo 0.11.6 REQUIRED)
add_executable(offline offline.cpp)
target_link_libraries(offline PRIVATE Licentivo::CPP)
set_target_properties(offline PROPERTIES CXX_STANDARD 17 CXX_STANDARD_REQUIRED ON)
Windows x64 · PowerShell · MSVC
cmake -S . -B build -G "Visual Studio 17 2022" -A x64 -DCMAKE_PREFIX_PATH="SDK_PREFIX" -DCURL_DIR="CURL_DIR"
if ($LASTEXITCODE -ne 0) { throw 'CMake configure failed. Check the SDK prefix and matching libcurl development package.' }
cmake --build build --config Release --target offline
if ($LASTEXITCODE -ne 0) { throw 'Build failed.' }
Linux x64 · Bash
set -e
cmake -S . -B build -DCMAKE_BUILD_TYPE=Release -DCMAKE_PREFIX_PATH="SDK_PREFIX"
cmake --build build --target offline

3. SDK を使用したエクスポートとインポート

例を offline.cpp として保存し、SDK が有効な CMake プロジェクトに追加します。オフライン コンピューターでオフライン リクエスト YOUR_LICENSE_KEY を実行します。オンライン クライアントを開かずに、activation.request.json が生成されます。

そのリクエストを接続されているコンピューターに移動します。ベンダー コンソールまたは関連する顧客のポータルで、リクエストをアップロードし、その承認された応答をダウンロードします。これを「activation.response.json」として保存し、両方のファイルを元のコンピュータに戻して、オフライン インポート YOUR_LICENSE_KEY を実行します。

C++17 · offline.cpp
#include "licentivo.hpp"
#include <fstream>
#include <iostream>
#include <iterator>
#include <stdexcept>
#include <string>

// BEGIN LICENTIVO PRODUCT
// Copy Product ID and all key ID/public key pairs from Console > Products > Signing public keys.
static const std::string PRODUCT_ID = "YOUR_PRODUCT_ID";
static const std::string TRUSTED_KEYS_JSON = R"({"YOUR_KEY_ID":"YOUR_PUBLIC_KEY"})";
// END LICENTIVO PRODUCT

std::string readText(const char* path) {
    std::ifstream file(path);
    if (!file) throw std::runtime_error("Cannot read file");
    return {std::istreambuf_iterator<char>(file), {}};
}

int main(int argc, char** argv) {
    try {
        // Product settings are in code; the key is entered by the customer.
        if (argc < 3) throw std::runtime_error("Usage: offline request|import LICENSE_KEY");
        auto client = licentivo::Client::ForProduct(PRODUCT_ID, TRUSTED_KEYS_JSON, argv[2]);
        if (std::string(argv[1]) == "request") {
            std::ofstream file("activation.request.json");
            file << client.OfflineRequest();
            if (!file) throw std::runtime_error("Cannot save request");
            std::cout << "Created activation.request.json\n";
        } else if (std::string(argv[1]) == "import") {
            client.ImportOffline(readText("activation.request.json"),
                                 readText("activation.response.json"));
            client.RunFeature("export", [] {
                std::ofstream file("licensed-report.txt");
                file << "Licensed offline export\n";
                if (!file) throw std::runtime_error("Cannot save report");
            });
            std::cout << "Created licensed-report.txt\n";
        } else {
            throw std::runtime_error("Unknown operation");
        }
    } catch (const std::exception& error) {
        std::cerr << error.what() << '\n';
        return 1;
    }
}
Windows · export request
./build/Release/offline.exe request YOUR_LICENSE_KEY
Windows · import approved response
./build/Release/offline.exe import YOUR_LICENSE_KEY
Linux · export request
./build/offline request YOUR_LICENSE_KEY
Linux · import approved response
./build/offline import YOUR_LICENSE_KEY

4. 結果を確認する

  1. インポートが成功し、licensed-report.txt が作成されていることを確認します。
  2. 保存されているデバイス認証情報と同じキャッシュの場所を使用して再起動します。オフライン リースがまだ有効であれば、利用権のある機能を使用できるはずです。
  3. 別の通常のコンピュータにインポートしてみてください。デバイス検証ではその応答が拒否されるはずです。
  4. 認証の有効期限とオフライン期間を確認してください。ファイルをインポートしても、元のライセンスが延長されたり、署名された制限を超えて使用が許可されたりすることはありません。

C インターフェイスの使用

C では、製品 ID、信頼する公開鍵、顧客ライセンスキーを ln_init_product に渡し、未起動のクライアントを作成します。ln_offline_request でリクエストを生成し、ln_import_offline でリクエストと応答を検証して取り込みます。返された文字列は ln_free_string、クライアントは ln_destroy で解放してください。

完全オフライン環境での初回認証では、オンライン起動を試みる ln_start や ln_open を呼び出さないでください。上記のリクエスト生成・応答取込を使い、署名付き応答の検証は SDK に任せます。業務コードで署名を独自に解析しないでください。

一般的な障害と運用上の制限

製品 ID、すべてのキー ID/公開鍵のペア、および顧客のライセンス入力を確認します。公開検証キーは製品に属します。顧客のライセンスと保存されたデバイスの認証情報は別のものです。開発テスト キーやベンダー管理 API キーを配布しないでください。

無効な応答は、元の要求、製品、デバイス、署名キー、またはアプリケーションのバージョンが一致しないことを意味する可能性があります。署名された応答を、要求を生成したコンピューターに返します。 JSON ペイロードを編集したり、検証を無効にしたりしないでください。

期限切れのリクエストには、新しいリクエストと承認が必要です。期限切れのリースは更新するか、ポリシーに従って承認された別のファイル交換が必要です。完全にオフラインの場合、オンラインの従量制リザーブ/コミット操作は利用できません。

リモートのバインド解除または失効は、古いデバイスの次回のオンライン チェックで判明します。永続的にオフラインのデバイスは、サーバー側の変更をすぐには学習できません。その制限を念頭に置いて、オフライン期間を選択してください。