Agent skill

External Signer

by Nethereum in Nethereum/Nethereum

Help users own an ERC-4337 smart account whose ECDSA key never lives in the application process — sign UserOperations with AWS KMS, Azure Key Vault, an HSM, a Ledger, or a Trezor instead of an…

MITAuto-check passedSecurity

Install External Signer

skills CLI
$ npx skills add Nethereum/Nethereum --skill external-signer -a claude-code

Project install by default; add -g for ~/.claude/skills/.

GitHub CLI
$ gh skill install Nethereum/Nethereum external-signer --agent claude-code

Project scope by default; add --scope user for a personal install. Needs GitHub CLI 2.90.0 or later (public preview).

Manual copy
$ git clone --depth 1 https://github.com/Nethereum/Nethereum.git skills-src && mkdir -p .claude/skills && cp -r skills-src/plugins/nethereum-skills/skills/external-signer .claude/skills/external-signer && rm -rf skills-src

Use ~/.claude/skills/ instead of .claude/skills for a personal install. The folder must contain SKILL.md.

Claude Code skills documentation · loads skills from .claude/skills/

Facts

Skill name
external-signer
GitHub stars
2.3k
Token cost
~2.3k tokens
SKILL.md length
821 words
Files
1
Skills in repo
71
Repo updated
First seen
Licence
MIT

At a glance

Help users own an ERC-4337 smart account whose ECDSA key never lives in the application process — sign UserOperations with AWS KMS, Azure Key Vault, an HSM, a Ledger, or a Trezor instead of an…

  • The user mentions KMS signing
  • SKILL.md covers When to Use This, Packages, The Simple Way and Mental Model: Same ECDSA…, plus 3 more sections
  • Calls dotnet
  • Azure Key Vault

What it does

External Signer is an agent skill from Nethereum/Nethereum. Help users own an ERC-4337 smart account whose ECDSA key never lives in the application process — sign UserOperations with AWS KMS, Azure Key Vault, an HSM, a Ledger, or a Trezor instead of an in-memory private key, using Nethereum.AccountAbstraction and IEthExternalSigner. Use whenever the user mentions KMS signing, Azure Key Vault, AWS Key Management Service, HSM-backed wallets, custody, Ledger/Trezor hardware wallet signing for a smart account, MPC signers, or 'the key must never be in memory' requirements, in…

Its SKILL.md is about 2.3k tokens, which your agent loads only when the skill is triggered. It is a single SKILL.md file with no bundled scripts.

It sits in Security, covering Cryptography. It works with Amazon Web Services, Azure Key Vault, C# and .NET. The repository describes itself as: Ethereum .Net cross platform integration library. The licence is MIT.

When your agent uses it

  • The user mentions KMS signing
  • Azure Key Vault
  • AWS Key Management Service
  • HSM-backed wallets

Example prompts

  • “the key must never be in memory”
  • “/external-signer”

What it can do on your machine

Read from SKILL.md and the folder at commit 229f278. It shows what the files ask for, not the result of running them.

  • Tool permissions

    Pre-approves nothing: there is no allowed-tools line, so your agent's usual permission prompts apply.

    From allowed-tools in the SKILL.md frontmatter.

  • Runs code

    Shell commands in SKILL.md call:

    • dotnet

    From the folder's file list and the shell code blocks in SKILL.md.

  • Network

    Links to these hosts (documentation or services it may open):

    • docs.nethereum.com

    From URLs in SKILL.md, links to its own repository left out.

  • Credentials

    Names no API keys, tokens, secrets or passwords.

    From names ending in _API_KEY, _TOKEN, _SECRET, _KEY or _PASSWORD in SKILL.md.

Context cost

External Signer loads about 2.3k tokens when it runs. Until then it costs about 136 tokens; SKILL.md has 821 words of instructions outside code blocks.

Always · name and description, kept in context so the agent knows when to use it
~136
When it runs · the whole SKILL.md, loaded when a task matches
~2.3k

Estimates: characters ÷ 4, the usual rule of thumb; real counts depend on the model's tokenizer. Scripts and assets cost tokens only if the agent reads them.

Safety

Auto-check passed

The automated check found no risky patterns in SKILL.md.

Automated static check — not a guarantee. Review scripts before installing. It scans the text of SKILL.md for risky patterns (piping downloads into a shell, reading credential files, hidden Unicode, destructive commands); files beside SKILL.md are not scanned.

SKILL.md

The full file from Nethereum/Nethereum at commit 229f278, republished under its MIT licence (© Nethereum). 821 words, ~2,278 tokens.

Download SKILL.mdSave it as .claude/skills/external-signer/SKILL.md (or your agent's skills folder).
name
external-signer
description
Help users own an ERC-4337 smart account whose ECDSA key never lives in the application process — sign UserOperations with AWS KMS, Azure Key Vault, an HSM, a Ledger, or a Trezor instead of an in-memory private key, using Nethereum.AccountAbstraction and IEthExternalSigner. Use whenever the user mentions KMS signing, Azure Key Vault, AWS Key Management Service, HSM-backed wallets, custody, Ledger/Trezor hardware wallet signing for a smart account, MPC signers, or 'the key must never be in memory' requirements, in .NET/C#.
user-invocable
true

External Signers: Own a Smart Account with a KMS, HSM, or Hardware Wallet

For institutional and custody use cases, an in-memory EthECKey isn't acceptable — the signing key has to live in a cloud Key Management Service, a hardware security module, or a physical device, and must never be readable by the application process itself. IEthExternalSigner is Nethereum's seam for that: signing happens as a remote or hardware operation instead of an in-process ECDSA computation.

The account itself doesn't change. It is still a plain ECDSA-owned NethereumSmartAccount, installed with the same EcdsaValidatorModule used everywhere else in Account Abstraction. Only where the key lives and who computes the signature changes — the generic on-ramp doesn't care which IAccountSigningService you hand it, so wiring an external signer in is exactly the same shape as wiring a raw key, one level removed.

When to Use This

  • User needs a smart account's signing key in a KMS/HSM, never in application memory
  • User mentions AWS Key Management Service, Azure Key Vault, custody infrastructure
  • User wants a Ledger or Trezor hardware wallet to control a smart account
  • User is building institutional custody or compliance-driven signing
  • User wants to plug in a custom/MPC signer without changing the rest of the AA stack

Packages

bash
dotnet add package Nethereum.Web3
dotnet add package Nethereum.AccountAbstraction

Plus whichever signer package matches the backend:

BackendPackageType
AWS Key Management ServiceNethereum.Signer.AWSKeyManagementNethereum.Signer.AWSKeyManagement.AWSKeyManagementExternalSigner
Azure Key VaultNethereum.Signer.AzureKeyVaultNethereum.Signer.AzureKeyVault.AzureKeyVaultExternalSigner
Ledger hardware walletNethereum.Signer.LedgerNethereum.Ledger.LedgerExternalSigner
Trezor hardware walletNethereum.Signer.TrezorNethereum.Signer.Trezor.TrezorExternalSigner

Each derives from Nethereum.Signer.EthExternalSignerBase. You also need IAAClient registered (the standard AddNethereumAccountAbstraction setup) and the same NethereumAccountFactory + ECDSAValidator pair deployed on the target chain that any ECDSA-owned account uses — an external signer installs the identical validator, so there's nothing extra to deploy on-chain for it.

The Simple Way

Wrap any IEthExternalSigner in AccountSigningExternalService, then drive it through the same generic on-ramp as any other signer:

csharp
using Nethereum.Accounts.AccountMessageSigning;
using Nethereum.AccountAbstraction;
using Nethereum.AccountAbstraction.Client;
using Nethereum.AccountAbstraction.ERC7579.Modules;
using Nethereum.AccountAbstraction.Signing;
using Nethereum.Signer;

// externalSigner is any IEthExternalSigner - a KMS, HSM, or hardware-wallet signer whose private
// key never lives in this process.
IEthExternalSigner externalSigner = /* your KMS/HSM/hardware-wallet signer */;
var ownerAddress = await externalSigner.GetAddressAsync();

var signingService = new AccountSigningExternalService(externalSigner);
var validator = new EcdsaValidatorModule(deploymentAddresses.EcdsaValidatorAddress);
var initData = AccountInitDataBuilder.BuildEcdsa(deploymentAddresses.EcdsaValidatorAddress, ownerAddress);

var account = await aaClient.CreateAccountAsync(signingService, validator, initData);   // NethereumSmartAccount

myToken.UseAccountAbstraction(account, aaClient);
var receipt = (AATransactionReceipt)await myToken.TransferRequestAndWaitForReceiptAsync(recipient, amount);
Console.WriteLine($"UserOp success: {receipt.UserOpSuccess}, sender: {receipt.Sender}");

That's it — no code downstream of CreateAccountAsync knows or cares that the owner key lives in a KMS instead of memory. Every signature over a UserOperation hash is produced by a call out to externalSigner, never by an in-process private key.

Mental Model: Same ECDSA Account, Key Lives Elsewhere

An external-signer account is not a distinct account type — it's an ordinary ECDSA-owned NethereumSmartAccount with the same EcdsaValidatorModule and AccountInitDataBuilder.BuildEcdsa init data as a raw-key account. On-chain, the deployed ECDSAValidator reports the external signer's address as owner — indistinguishable from an account owned by an in-process key, because it's the same signature scheme (secp256k1/ECDSA) either way.

What changes is entirely client-side: AccountSigningExternalService wraps an IEthExternalSigner instead of an EthECKey, and its SignTypedDataV4/PersonalSign are delegated out to that signer — SignTypedDataJsonAsync for typed data, SignEthereumMessageAsync for personal-sign — as a KMS API call or HSM operation rather than an in-memory computation. Contrast this with a WebAuthn passkey (see the webauthn-passkeys skill): a passkey is a different signature scheme (P-256), whereas an external signer is still plain secp256k1 ECDSA — just computed somewhere else.

Show full SKILL.md (344 more words)Show less

Constructing a Signer per Backend

csharp
using Amazon;
using Nethereum.Signer.AWSKeyManagement;

// keyId identifies an asymmetric ECC_SECG_P256K1 key already created in AWS KMS.
IEthExternalSigner externalSigner = new AWSKeyManagementExternalSigner(
    keyId: "arn:aws:kms:...:key/...", region: RegionEndpoint.EUWest1);
csharp
using Azure.Identity;              // DefaultAzureCredential - add the Azure.Identity NuGet package
using Nethereum.Signer.AzureKeyVault;

// keyName identifies an EC-secp256k1 key already created in the given Key Vault.
IEthExternalSigner externalSigner = new AzureKeyVaultExternalSigner(
    keyName: "my-signing-key", vaultUri: "https://my-vault.vault.azure.net/", credential: new DefaultAzureCredential());

An MPC (multi-party computation) signer isn't shipped out of the box, but plugs in the exact same way: implement IEthExternalSigner (or derive from EthExternalSignerBase) against the MPC network's signing API, and hand it to AccountSigningExternalService unchanged.

The hardware-wallet signers (LedgerExternalSigner, TrezorExternalSigner) implement the same IEthExternalSigner, need a connected device, and are typically used from a desktop app rather than a server process — see each package's README for device-transport setup. Signing a UserOperation's EIP-712 typed data through a Ledger specifically is not covered by an automated test in this codebase; verify on a real device before relying on it for AA (Ledger does not override the base typed-data signing path, so confirm the produced signature recovers to the owner under ECDSAValidator).

Common Mistakes

  • Trying to drive EIP-7702 with an external signer. IAAClient.ConfigureEip7702 takes an EthECKey ownerKey directly, because the 7702 authorisation tuple's secp256k1 signature has to be produced by the same key path Nethereum's transaction signing uses, not through the generic IAccountSigningService seam. An external signer can own a CREATE2-deployed modular account, but it cannot drive the 7702 upgrade-in-place tier — use the CREATE2 on-ramp shown above instead.
  • Not accounting for signing latency/availability as a distinct failure mode. Every signature is now a network round-trip (KMS throttling, an unplugged Ledger, a network partition to Azure) instead of a microsecond in-memory computation — a failed SignAsync/SignTypedDataJsonAsync surfaces as an exception before a UserOperation is ever sent, not as a bundler rejection.
  • Assuming the signer exposes key material. It doesn't need to, and Nethereum never asks for it — AccountSigningExternalService only calls GetAddressAsync() once (to build init data) plus the two signing methods.

Decision Guide

ScenarioApproach
Signing key must live in a cloud KMSAWSKeyManagementExternalSigner or AzureKeyVaultExternalSigner
Signing key must live on a physical deviceLedgerExternalSigner / TrezorExternalSigner
Custom custody backend (MPC network, internal HSM API)Implement IEthExternalSigner yourself
Device-native biometric passkey instead of ECDSAUse the webauthn-passkeys skill instead — different signature scheme
Upgrading an existing EOA in place (EIP-7702)Needs a raw EthECKey — external signers can't drive this tier

For full documentation, see: https://docs.nethereum.com/docs/account-abstraction/guide-external-signer

© Nethereum, MIT. Rendered from Markdown: HTML in the file is shown as text, images as links, and headings moved down two levels. Raw file

Files

Just SKILL.md in plugins/nethereum-skills/skills/external-signer of Nethereum/Nethereum.

Open the folder on GitHubat commit 229f278

Compare with similar skills

External Signer next to the 5 skills that share the most tags, products or categories with it. Stars are the repository's; “used in” counts other GitHub owners with a copy.

External Signer compared with similar skills
SkillStarsUsed inTokensAuto-checkLicenceRepo updated
External Signer this skillNethereum/Nethereum2.3k—~2.3kAutomated safety check: PassMIT
Azure Security Keyvault Keys Dotnetmicrosoft/skills3.1k5 repos~3.1kAutomated safety check: PassMIT
Migrate Dotnet9 To Dotnet10dotnet/skills5.6k2 repos~4.8kAutomated safety check: PassMIT
Nes Decompilejonathanpeppers/dotnes780—~1.6kAutomated safety check: PassMIT
Azure Keyvault Keys TSmicrosoft/skills3.1k5 repos~1.7kAutomated safety check: PassMIT
Azure Security Keyvault Keys Javamicrosoft/skills3.1k5 repos~2.9kAutomated safety check: PassMIT

Similar skills

  • Official

    Azure Key Vault Keys SDK for .NET. An agent skill from microsoft/skills.

    3.1k GitHub starsUsed in 5 repos~3.1k tokens
    SecurityAuto-check passed
  • Official

    Migrate a .NET 9 project or solution to .NET 10 and resolve all breaking changes.

    5.6k GitHub starsUsed in 2 repos~4.8k tokens
    DevOps & CloudAuto-check passed
  • Nes Decompile

    jonathanpeppers/dotnes

    Decompile NES ROM files (.nes) into C projects that can be rebuilt with dotnes.

    780 GitHub stars~1.6k tokensUpdated 15 days ago
    SecurityAuto-check passed
  • Azure Keyvault Keys TS

    microsoft/skills

    Official

    Manage cryptographic keys using Azure Key Vault Keys SDK for JavaScript (@azure/keyvault-keys).

    3.1k GitHub starsUsed in 5 repos~1.7k tokens
    SecurityAuto-check passed
  • Official

    Azure Key Vault Keys Java SDK for cryptographic key management.

    3.1k GitHub starsUsed in 5 repos~2.9k tokens
    SecurityAuto-check passed
  • Dotnet Inspect Decompiler

    richlander/dotnet-inspect

    Reconstruct a method or type as C and IL — decompiled source, annotated source with hidden facts, raw IL, fidelity levels, and IL-offset lookup.

    151 GitHub stars~2.4k tokensUpdated today
    SecurityAuto-check passed

More from Nethereum/Nethereum

All 71 skills in this repo
  • Aa Batching Paymasters

    Nethereum/Nethereum

    Help users batch multiple calls into a single UserOperation and sponsor gas with paymasters using Nethereum Account Abstraction.

    2.3k GitHub stars~1.5k tokensUpdated 4 days ago
    Auto-check passed
  • Aa Bundler

    Nethereum/Nethereum

    Help users run an ERC-4337 bundler using Nethereum — set up in-process or standalone bundlers with mempool, validation, reputation, and JSON-RPC server.

    2.3k GitHub stars~1.2k tokensUpdated 4 days ago
    Auto-check passed
  • Abi Encoding

    Nethereum/Nethereum

    Encode and decode Ethereum ABI data with Nethereum. An agent skill from Nethereum/Nethereum.

    2.3k GitHub stars~1.3k tokensUpdated 4 days ago
    Auto-check passed
  • Abi Retrieval

    Nethereum/Nethereum

    Fetch contract ABIs from Sourcify, Etherscan, and 4Byte Directory using the composite ABIInfoStorage pattern (.NET/C).

    2.3k GitHub stars~1.5k tokensUpdated 4 days ago
    Auto-check passed
  • Account Abstraction

    Nethereum/Nethereum

    Help users implement ERC-4337 Account Abstraction with Nethereum — send UserOperations, use smart accounts, route contract calls through a bundler, enable gasless transactions, or work with AA in…

    2.3k GitHub stars~1.7k tokensUpdated 4 days ago
    Auto-check passed
  • Address Utils

    Nethereum/Nethereum

    Validate and format Ethereum addresses with Nethereum. An agent skill from Nethereum/Nethereum.

    2.3k GitHub stars~1.2k tokensUpdated 4 days ago
    Auto-check passed

Categories

Questions about External Signer

What does External Signer do?

Help users own an ERC-4337 smart account whose ECDSA key never lives in the application process — sign UserOperations with AWS KMS, Azure Key Vault, an HSM, a Ledger, or a Trezor instead of an…. External Signer is an agent skill from Nethereum/Nethereum.AccountAbstraction and IEthExternalSigner.

When should I use External Signer?

External Signer fits situations like: the user mentions KMS signing; azure Key Vault; AWS Key Management Service; HSM-backed wallets.

How do I install External Signer in Claude Code?

Run `npx skills add Nethereum/Nethereum --skill external-signer -a claude-code`. Or copy the skill folder (plugins/nethereum-skills/skills/external-signer in Nethereum/Nethereum) into .claude/skills/external-signer in your project. Claude Code loads it when a task matches its description.

How do I install External Signer in Codex?

Run `npx skills add Nethereum/Nethereum --skill external-signer -a codex`. Or copy the skill folder (plugins/nethereum-skills/skills/external-signer in Nethereum/Nethereum) into .agents/skills/external-signer in your project. Codex loads it when a task matches its description.

Can I use External Signer in Cursor, Gemini CLI or GitHub Copilot?

Cursor, Gemini CLI, GitHub Copilot and OpenCode also load SKILL.md folders. With the skills CLI, run `npx skills add Nethereum/Nethereum --skill external-signer -a cursor` (or -a gemini-cli, github-copilot or opencode for the others). To copy it by hand, put the folder in .cursor/skills/external-signer, .gemini/skills/external-signer, .github/skills/external-signer and .opencode/skills/external-signer in your project.

What does External Signer need to run?

Going by SKILL.md and its folder, External Signer needs the command-line tools its instructions call (dotnet).

Does External Signer access the network?

SKILL.md names 1 domain. As links in the text: docs.nethereum.com. This is read from the text; nothing was executed.

Is External Signer safe to install?

Our automated static check of SKILL.md found no risky patterns, such as piping downloads into a shell, reading credential files or hidden Unicode. It is not a guarantee. Review the folder before installing.

What licence does External Signer use?

External Signer is published under the MIT licence (the repository's licence). It allows redistribution, so the full SKILL.md is shown on this page.

How many tokens does External Signer use?

About 2.3k tokens (SKILL.md is roughly 9.1k characters). Agents keep only the skill's name and description in context until a task matches; then they load SKILL.md in full.

What are the alternatives to External Signer?

Skills that share tags, products or a category with External Signer: Azure Security Keyvault Keys Dotnet (microsoft/skills, 3.1k stars), Migrate Dotnet9 To Dotnet10 (dotnet/skills, 5.6k stars), Nes Decompile (jonathanpeppers/dotnes, 780 stars) and Azure Keyvault Keys TS (microsoft/skills, 3.1k stars). The comparison table on this page puts their stars, adoption, token cost, safety result and licence side by side.

Who maintains External Signer?

Nethereum (a GitHub organization) maintains it in Nethereum/Nethereum, which has 2,260 GitHub stars. The repository holds 71 skills in this directory. The repository was last updated on October 5, 2026.

Source: Nethereum/Nethereum on GitHub. Facts on this page come from the repository at the commit we read; the author's words are quoted as theirs.