安全な署名
トランザクションをXRP Ledgerに送信するには、秘密鍵のセキュリティを損なわない方法でトランザクションにデジタル署名する必要があります。(他の人があなたの秘密鍵にアクセスできる場合、その人はあなたと同じようにあなたのアカウントを操作できるため、すべての資金が盗まれたり消却されたりする可能性があります。)このページでは、トランザクションに安全に署名できる環境の設定方法について説明します。
セキュリティのレベルが異なるさまざまな構成があるため、状況に応じて適したものは異なります。次の中からニーズに最適なものを選択してください。
rippled
をローカルで実行または同じLAN内で実行- ローカル署名を行えるクライアントライブラリを使用
- XRP Ledgerの署名に対応した専用の署名デバイスを使用
- 信頼できるリモート
rippled
マシンに接続するために安全なVPNを使用
安全でない構成
外部のソースからあなたの秘密鍵にアクセスできる構成は危険で、不正使用者によってあなたのすべてのXRP(およびあなたのXRP Ledgerのアドレスにあるすべてのもの)が盗まれる可能性があります。そのような構成の例としては、インターネット経由で他の人のrippled
サーバのsignメソッドを使用する構成や、秘密鍵をインターネットを経由してプレーンテキストで自己所有サーバに送信する構成などがあります。
秘密鍵の秘匿性は常に保持する必要があります。自分にメールで送信したり、人の目に触れるところで入力したりしてはいけません。秘密鍵を使用しないときは、決してプレーンテキストではなく、暗号化された形式で保存する必要があります。セキュリティと利便性のバランスは、アドレスの保有額によっても変わります。さまざまな目的に合わせてさまざまなセキュリティ構成の複数のアドレスを使用することをお勧めします。
ローカルでrippledを実行する
この構成では、トランザクションを生成するマシンでrippled
を実行します。 秘密鍵はマシンから出ていかないため、マシンへのアクセス権がない人は秘密鍵にアクセスできません。もちろん、マシンのセキュリティ保護に関する業界標準のプラクティスに従ってください。この構成を使用するには、次の手順を実行します。
rippled
をインストールします。ローカルマシンが
rippled
の最小システム要件を満たしていることを確認します。トランザクションに署名する必要がある場合は、
localhost
または127.0.0.1
のサーバに接続します。シングル署名の場合はsignメソッド、マルチシグの場合はsign_forメソッドを使用します。構成ファイルの例では、ローカルループバックネットワーク上(127.0.0.1)のポート5005でJSON-RPC(HTTP)、ポート6006でWebSocket(WS)の接続をリッスンし、接続されるすべてのクライアントを管理者として扱っています。
注意署名にコマンドラインAPIを使用する場合は、コマンドラインでないクライアントでWebsocket APIやJSON-RPC APIを使用する場合よりもセキュリティが弱くなります。コマンドライン構文を使用すると、秘密鍵がシステムのプロセスリストで他のユーザに見える可能性があり、シェル履歴にプレーンテキスト形式でキーが保存される可能性があります。サーバの使用中は、稼働状態と最新状態を維持して、ネットワークと同期されるようにしておく必要があります。
注記トランザクションを送信していないときはrippled
サーバをオフにすることが 可能 ですが、再び起動したときにネットワークとの同期に最大15分かかります。
同じLAN内でrippledを実行する
この構成では、署名するトランザクションを生成するマシンと同じプライベートローカルエリアネットワーク(LAN)内の専用マシンでrippled
サーバを実行します。この構成では、rippled
を実行する専用の1台のマシンを使用しながら、中程度のシステムスペックの1台以上のマシンでトランザクションの指示を組み立てることができます。自己所有のデータセンターやサーバルームがある場合に魅力的な選択肢です。
この構成を使用するには、rippled
サーバをLAN内のwss
およびhttps
接続を受け入れるように設定します。証明書ピンニングを使用する場合は自己署名証明書を使用できます。あるいは、社内や既知の認証局が署名した証明書を使用できます。Let's Encryptなどの一部の認証局は無料で証明書を自動発行しています。
必ず、マシンのセキュリティ保護に関する業界標準のプラクティスに従ってください。例えば、ファイアウォール、ウイルス対策、適切なユーザ権限を使用するなどです。
ローカル署名機能のあるクライアントライブラリを使用する
この構成では、使用するプログラミング言語で、署名を組み込んだクライアントライブラリを使用します。ローカル署名を実行できるライブラリの一覧は、クライアントライブラリをご覧ください。
署名ライブラリのセキュリティベストプラクティス
署名ライブラリのセキュリティを最適化するために、次のベストプラクティスを使用してください。
使用する署名ライブラリが、署名アルゴリズムを適切かつ安全に実装 していることを確認してください。例えば、ライブラリがデフォルトのECDSAアルゴリズムを使用する場合、RFC-6979に記述されているように、決定論的なnoncesも使用すべきです。
上記のすべての公開ライブラリは、業界のベストプラクティスに従っています。
クライアントライブラリを最新の安定版に更新してください。
セキュリティ強化のため、Vaultなどの管理ツールから秘密鍵を読み込みます。
ローカル署名の例
以下は、以下の言語とライブラリを使用して、ローカルでトランザクションに署名する方法の例です。
// Sample code demonstrating secure offline signing using xrpl.js library. const xrpl = require('xrpl') // Load seed value from an environment variable: const my_wallet = xrpl.Wallet.fromSeed(process.env['MY_SEED']) // For offline signing, you need to know your address's next Sequence number. // Alternatively, you could use a Ticket in place of the Sequence number. // This is useful when you need multiple signatures and may want to process transactions out-of-order. // For details, see: https://xrpl.org/tickets.html let my_seq = 21404872 // Provide *all* required fields before signing a transaction const txJSON = { "Account": my_wallet.address, "TransactionType":"Payment", "Destination":"rf1BiGeXwwQoi8Z2ueFYTEXSwuJYfV2Jpn", "DeliverMax":"13000000", "Flags":2147483648, "LastLedgerSequence":7835923, // Optional, but recommended. "Fee":"13", "Sequence": my_seq } const signed = my_wallet.sign(txJSON) console.log("tx_blob is:", signed.tx_blob) console.log("tx hash is:", signed.tx_json.hash)
専用の署名デバイスを使用する
専用の署名デバイスが各社から販売されており、例えばLedger Nano Sは、秘密鍵をデバイスから出さずに使ってXRP Ledgerトランザクションに署名できます。すべてのタイプのトランザクションに対応していないデバイスもあります。
この構成の設定は、特定のデバイスによって異なります。場合によっては、署名デバイスと通信するためにマシンで「マネージャー」アプリケーションを実行する必要があります。そのようなデバイスの設定と使用方法については、メーカーの手順をご覧ください。
リモートrippledサーバに対して安全なVPNを使用する
この構成では、コロケーション施設や遠隔地のデータセンターなどにあるリモートでホストされているrippled
サーバを使用し、暗号化されたVPNを使用してそのサーバに接続します。
この構成を使用するには、プライベートLANでrippled
を実行するための手順に従いますが、VPNを使用してリモートrippled
サーバのLANに接続します。VPNの設定手順は環境によって異なり、このガイドでは説明しません。