Set Up Secure Signing
To submit transactions to the XRP Ledger, you need a way to digitally sign them without compromising the security of your secret keys. (If others gain access to your secret keys, they have as much control over your accounts as you do, and can steal or destroy all your money.) This page summarizes how to set up such an environment so you can sign transactions securely.
Tip: If you are not submitting transactions to the network, you can safely use a trustworthy public server, such as the ones run by Ripple, to monitor for incoming transactions or read other network activity. All transactions, balances, and data in the XRP Ledger are public.
There are several configurations with varying levels of security that may be acceptable for your situation. Choose one of the following that best fits your needs:
- Run
rippled
locally, or in the same LAN. - Use a client library that can do local signing.
- Use a dedicated signing device that supports XRP Ledger signatures.
- Use a secure VPN to connect to a remote
rippled
machine you trust.
Insecure Configurations
Any configuration in which outside sources may gain access to your secret key is dangerous, and is likely to result in a malicious user stealing all your XRP (and anything else your XRP Ledger address has). Examples of such configurations include ones where you use the sign method of someone else's rippled
server over the internet, or you transmit your secret key in plain text over the internet to your own server.
You should maintain the secrecy of your secret keys at all times, which includes things like not emailing them to yourself, not typing them visibly in public, and saving them encrypted—never in plain text—when you are not using them. The balance between security and convenience depends in part on the value of your addresses' holdings, so you may want to use multiple addresses with different security configurations for different purposes.
Run rippled Locally
In this configuration, you run rippled
on the machine that generates the transactions. Since the secret key never leaves your machine, no one without access to your machine can get access to the secret key. You should, of course, follow industry-standard practices for securing your machine. To use this configuration:
-
Be sure that your local machine meets the minimum system requirements for
rippled
. -
When you need to sign transactions, connect to your server on
localhost
or127.0.0.1
. Use the sign method (for single signatures) or sign_for method (for multi-signatures).The example config file listens for connections on the local loopback network (127.0.0.1), with JSON-RPC (HTTP) on port 5005 and WebSocket (WS) on port 6006, and treats all connected clients as admin.
Caution: Using the commandline API for signatures is less secure than using the Websocket or JSON-RPC APIs through non-commandline clients. When using the commandline syntax, your secret key may be visible to other users in the system's process listing, and your shell history may save the key in plain text.
-
Maintain the server to keep it running, updated, and in sync with the network while you're using it.
Note: You can turn off your
rippled
server when you're not sending transactions, but it can take up to 15 minutes to sync with the network when you start it up again.
Run rippled on the same LAN
In this configuration, you run a rippled
server on a dedicated machine in the same private local area network (LAN) as the machine that generates the transactions to be signed. This configuration lets you assemble transaction instructions on one or more machines with very modest system specs, while using a single dedicated machine for running rippled
. This may appeal to you if you run your own datacenter or server room.
To use this configuration, set the rippled
server to accept wss
and https
connections within your LAN. You can use a self-signed certificate if you use certificate pinning , or you can use a certificate signed by an in-house or well-known Certificate Authority. Some certificate authorities, such as Let's Encrypt issue certificates automatically for free.
As always, follow industry-standard practices for securing your machines, such as using a firewall, anti-virus, appropriate user permissions, and so on.
Use a Client Library with Local Signing
This configuration uses a client library in the programming language you are using to sign transactions locally. You need a client library for the programming language you use. Ripple publishes the following client libraries that can sign transactions for the XRP Ledger locally:
- RippleAPI (ripple-lib) for JavaScript
- Signing Library for C++ (included with
rippled
)
If you use a client library not published by Ripple, make sure it uses proper, secure implementations of the signing algorithm(s) it implements. (For example, if it uses the default ECDSA algorithm, it should also use deterministic nonces as described in RFC-6979 .) All of Ripple's published libraries listed above follow industry best practices.
For best security, be sure to keep your client library updated to the latest stable version.
Local Signing Example
The following code sample shows how to sign transaction instructions locally with ripple-lib
for JavaScript and xrpl-py
for Python:
'use strict'
const RippleAPI = require('ripple-lib').RippleAPI
// Load address & secret from environment variables:
const from_address = process.env['MY_ADDRESS']
const secret = process.env['MY_SECRET']
// Can sign offline if the txJSON has all required fields
const api = new RippleAPI()
const txJSON = JSON.stringify({
"Account": from_address,
"TransactionType":"Payment",
"Destination":"rf1BiGeXwwQoi8Z2ueFYTEXSwuJYfV2Jpn",
"Amount":"13000000",
"Flags":2147483648,
"LastLedgerSequence":7835923,
"Fee":"13",
"Sequence":2
})
const signed = api.sign(txJSON, secret)
console.log("tx_blob is:", signed.signedTransaction)
console.log("tx hash is:", signed.id)
# Define signer address
import os
my_secret = os.getenv("MY_SECRET")
from xrpl.wallet import Wallet
wallet = Wallet(seed="MY_SECRET")
print(wallet.classic_address) # "raaFKKmgf6CRZttTVABeTcsqzRQ51bNR6Q"
from xrpl.models.transactions import Payment
from xrpl.utils import xrp_to_drops
my_payment = Payment(
account=test_wallet_1.classic_address,
amount=xrp_to_drops(22),
fee="10",
destination="rPT1Sjq2YGrBMTttX4GZHjKu9dyfzbpAYe",
sequence=16126889,
)
print("Payment object:", my_payment)
# Sign transaction -------------------------------------------------------------
import xrpl.transaction
signed = xrpl.transaction.safe_sign_transaction(my_payment, test_wallet_1)
print("Signed transaction blob:", signed)
For greater security, you can load your secret keys from a management tool such as Vault .
Use a Dedicated Signing Device
Some companies sell dedicated signing devices, such as the Ledger Nano S , which are capable of signing XRP Ledger transactions using a secret key that never leaves the device. Some devices may not support all types of transactions.
Setting up this configuration depends on the specific device. You may need to run a "manager" application on your machine to interact with the signing device. See the manufacturer's instructions for how to set up and use such a device.
Use a Secure VPN with a Remote rippled Server
This configuration uses a rippled
server hosted remotely, such as in a colocation facility or a distant datacenter, but connects to it securely using an encrypted VPN.
To use this configuration, follow the steps for running rippled
on a private LAN, but use a VPN to connect to the LAN of the remote rippled
server. Instructions for setting up the VPN are specific to your environment and are not described in this guide.