---
title: "เก็บคีย์เทรดและ secret ของแอปไว้นอกดิสก์ของเซิร์ฟเวอร์"
description: "erpc worker เก็บคีย์เทรดและ secret ของแอปไว้ใน 1Password, พวงกุญแจของ OS หรือ keystore ที่เข้ารหัส และส่งให้แอปในหน่วยความจำ"
canonical: "https://erpc.global/th/doc/erpc-cli/worker-secrets/"
locale: "th"
---

# เก็บคีย์เทรดและ secret ของแอปไว้นอกดิสก์ของเซิร์ฟเวอร์

`erpc worker` เก็บคีย์เทรดและ secret ของแอปไว้ใน 1Password, พวงกุญแจของคุณ หรือ keystore ที่เข้ารหัส และส่งให้แอปในหน่วยความจำ โดยไม่ส่งลงดิสก์ของเซิร์ฟเวอร์เลย

หน้านี้อธิบาย ERPC CLI `v0.1.0-rc.4` ซึ่งเป็นเวอร์ชัน pre-release

## คีย์เทรดไปถึงแอปอย่างไร

แอปที่มี wallet จะได้รับคีย์ทาง pipe เมื่อแอปเริ่มทำงาน บนเซิร์ฟเวอร์ไม่มี `wallet.json` ไม่มี `.env` และไม่มีสำเนาใด ๆ erpc ไม่เขียนคีย์ลงดิสก์ใดโดยไม่เข้ารหัส: ไฟล์เดียวที่ erpc เก็บคีย์ไว้คือไฟล์ของ keystore บนเครื่องของคุณ ซึ่งเข้ารหัสด้วยวลีรหัสผ่านของคุณ

- **ที่เก็บ:** `erpc worker key new` สร้างคีย์ใน 1Password เมื่อ `erpc login` เก็บเซสชันไว้ที่นั่น มิฉะนั้นจะสร้างในพวงกุญแจ หรือไม่เช่นนั้นก็สร้างใน keystore ส่วน `erpc.toml` จะบันทึกการอ้างอิงของคีย์และคีย์สาธารณะของคีย์นั้น
- **บนเซิร์ฟเวอร์:** เอเจนต์ของ erpc worker เก็บคีย์ไว้ในหน่วยความจำเท่านั้น เอเจนต์ทำให้ตัวเอง dump ไม่ได้และล็อกหน่วยความจำของตัวเอง แล้วส่งคีย์ให้แอปทาง file descriptor จากนั้นแอปจะล้างคีย์ทิ้งหลังอ่าน
- **หลังรีบูต** worker จะกลับมาในสถานะถูกล็อก: แอปจะไม่รันจนกว่า `erpc worker start` จะส่งคีย์อีกครั้ง เอเจนต์ที่ล้มเหลวหรือถูก kill จะถูก systemd เริ่มใหม่ และกลับมาในสถานะถูกล็อกในแบบเดียวกัน
- **การอัปเดต package ไม่รีสตาร์ท worker** `deploy` สั่งให้ `needrestart` ไม่แตะ unit ของ worker: ในโหมดอัตโนมัติ เครื่องมือนี้จะเลื่อน unit เหล่านี้ออกไป และเมื่อถามในเทอร์มินัล คำตอบเริ่มต้นสำหรับ unit เหล่านี้คือ no ดังนั้นการอัปเดตด้านความปลอดภัยที่ทำโดยไม่มีคนดูแลจะไม่รีสตาร์ทแอป เมื่อเขียนกฎนั้นไม่ได้ การ deploy จะแจ้งให้ทราบแล้วทำงานต่อ และ worker จะรันโดยไม่มีการป้องกันนี้

คีย์เทรดถูกระบุโดย `[wallet]` และไม่มีสิ่งอื่นระบุ และ erpc จะอ่านคีย์นี้เฉพาะเมื่อมีคนอยู่ที่เทอร์มินัลเท่านั้น: ไม่อ่านให้เครื่องมือ AI และไม่อ่านด้วย service account ของ 1Password บรรทัดใน `[secrets]` ที่ระบุการอ้างอิงของ `[wallet]` หรือบัญชี `keychain:` หรือ `keystore:` ที่ลงท้ายด้วย `.wallet` จะถูกปฏิเสธ ใน keystore รายการที่เก็บไว้เป็นคีย์จะไม่เปิดออกมาเป็น secret ส่วนใน 1Password และภายใต้บัญชีของพวงกุญแจที่ใช้ชื่ออื่น ไม่มีสิ่งใดระบุว่าเป็นคีย์: `erpc.toml` ที่ไม่มี `[wallet]` แต่ระบุรายการดังกล่าวไว้ใต้ `[secrets]` จะทำให้รายการนั้นถูกอ่านเป็น secret

## เลือกที่เก็บค่า

การใช้ 1Password ไม่ใช่ข้อบังคับ `erpc worker key new` และ `erpc worker secret put` จะเก็บสิ่งที่ได้รับไว้ในที่เก็บแรกที่ใช้ได้จากรายการต่อไปนี้ เว้นแต่ `--store` จะระบุไว้ (`--store 1password --vault <id>`, `--store keychain`, `--store keystore`):

1. **1Password** เมื่อ `erpc login` เก็บเซสชันไว้ที่นั่น หรือเมื่อระบุ `--vault`
2. **พวงกุญแจของ OS** ในระบบที่พวงกุญแจเก็บค่าไว้ได้หลังรีบูต: macOS, Windows และ Linux ที่มี keyring ของเดสก์ท็อปในเซสชันที่เข้าสู่ระบบอยู่
3. **keystore ของ erpc** บนเครื่อง Linux ที่ไม่มี keyring แบบนั้น ได้แก่ เซิร์ฟเวอร์แบบ headless, WSL หรือการเข้าสู่ระบบผ่าน SSH ส่วน `--store keychain` บนเครื่องแบบนี้จะถูกปฏิเสธ

ในพวงกุญแจหรือ keystore คีย์จะมีอยู่บนเครื่องนั้นเครื่องเดียวเท่านั้น โดยไม่มีสำเนาและไม่มีการซิงก์ และเครื่องอื่นจะอ่านการอ้างอิง `keychain:` หรือ `keystore:` ไม่ได้

หากเครื่องสูญหายหรือถูกล้างข้อมูล wallet ก็จะหายไปด้วย: เก็บไว้ใน wallet เพียงเล็กน้อย หรือใช้ 1Password ซึ่งทุกเครื่องที่ลงชื่อเข้าใช้ vault อ่านได้ ลงชื่อเข้าใช้ 1Password ด้วย `erpc login --store 1password-desktop` หรือผ่าน `op signin` ในที่ที่ไม่มีแอปเดสก์ท็อป

service account ของ 1Password เก็บ secret ของแอปได้ แต่ erpc จะไม่อ่านคีย์เทรดด้วย service account เมื่อใช้ 1Password การอ่านแต่ละครั้งอาจแสดงหน้าต่างขอการอนุมัติในแอป และ erpc จะแสดง spinner ระหว่างรอ

## เก็บ secret

secret เช่น API token และ RPC key จะถูกเก็บด้วยวิธีเดียวกัน แต่ไปถึงแอปในรูปของตัวแปรสภาพแวดล้อม ไม่ใช่ทาง pipe `erpc worker secret put <NAME>` จะเก็บค่า และ `[secrets]` ใน `erpc.toml` จะเก็บเฉพาะการอ้างอิงของค่านั้น

```bash
erpc worker secret put API_TOKEN --generate          # the bot's own API token, made for you and shown to nobody
erpc worker secret put ERPC_API_KEY --from-account   # the account's RPC key, read from your account (or SOLANA_RPC_ENDPOINT in [vars])
```

- **`--generate`** สร้างค่าให้: ไบต์สุ่ม 32 ไบต์ ในรูปอักขระเลขฐานสิบหก 64 ตัว
- **`--from-account`** เก็บ RPC key ตัวแรกในบัญชีของคุณที่ shared RPC ยอมรับ โดยจะลองคีย์ตามลำดับ เริ่มจากคีย์หลัก ด้วย `getHealth` คีย์ละหนึ่งครั้ง และให้เวลาตอบ 8 วินาที คีย์ที่ได้รับคำตอบ 401 หรือ 403 จะถูกปฏิเสธแล้วลองคีย์ถัดไป และจะเก็บเฉพาะคีย์ที่ RPC ยอมรับเท่านั้น คำสั่งจะแจ้งว่าเป็นคีย์หลักของบัญชีหรือคีย์อื่น (`account_key` เมื่อใช้ `--json`)
- ค่าทั้งสองแบบจะไม่ถูกแสดงออกมา แม้ใช้ `--json` ก็ตาม การใช้ keystore ครั้งแรก หรือ keystore ที่ถูกล็อก ต้องมีคนอยู่ที่เทอร์มินัล
- การลองคีย์ทำจากเครื่องนี้ ดังนั้นคีย์ที่จำกัดไว้เฉพาะที่อยู่ของเซิร์ฟเวอร์จะถูกปฏิเสธที่นี่ แม้จะใช้ได้บนเซิร์ฟเวอร์ก็ตาม เมื่อทุกคีย์ถูกปฏิเสธ `--from-account` จะไม่เก็บอะไรเลย และให้คุณเก็บคีย์ที่ต้องการเอง โดยพิมพ์แบบไม่แสดงบนจอ หรือส่งเข้ามาทาง pipe เมื่อถาม RPC ไม่ได้ คำสั่งจะไม่เก็บอะไรเลย และ `erpc.toml` จะยังเหมือนเดิม ให้รันคำสั่งเดิมอีกครั้ง

วิธีเก็บคีย์ด้วยตนเอง:

```bash
erpc worker secret put ERPC_API_KEY        # asks for the value, unseen
```

- `--replace` เก็บค่าใหม่สำหรับชื่อที่ตั้งไว้แล้ว ส่วน `erpc worker secret list` แสดงรายการการตั้งค่าที่เป็น secret ตามชื่อ และที่เก็บของแต่ละรายการ
- การตั้งค่าที่สายข้อมูลให้มา (`GRPC_ENDPOINT`, `SHREDS_ENDPOINT`, `SOLANA_SEND_RPC_ENDPOINT`) ไม่ถือเป็น secret ในทุกกรณี: `--grpc`, `--shreds` และ `--unlimited` จะตั้งค่าเหล่านี้

การอ้างอิงใน `[secrets]` หรือ `[wallet]` เป็นแบบใดแบบหนึ่งต่อไปนี้:

| การอ้างอิง | ตำแหน่งของค่า |
| --- | --- |
| `op://<vault-id>/<item-id>/<field>` | 1Password ตาม id ของ vault และ item |
| `keychain:<service>/<account>` | พวงกุญแจของ OS บนเครื่องที่เก็บค่านั้นไว้ |
| `keystore:<service>/<account>` | keystore ของ erpc บนเครื่องที่เก็บค่านั้นไว้ |

## keystore

keystore คือไดเรกทอรี `~/.erpc/keystore` (`keystore` ภายใต้ `ERPC_HOME` เมื่อตั้งค่าไว้) บน Linux และ macOS ไดเรกทอรีของ keystore มีสิทธิ์ `0700` และไฟล์มีสิทธิ์ `0600` ส่วนบน Windows erpc ไม่ได้ตั้งสิทธิ์ใด ๆ เอง

- `master.json` เก็บ master key แบบสุ่มขนาด 32 ไบต์ ซึ่งถูกปิดผนึกด้วยคีย์ที่ PBKDF2-HMAC-SHA256 (600,000 รอบ) สร้างจากวลีรหัสผ่านของคุณ แต่ละรายการเก็บค่าหนึ่งค่า ซึ่งถูกปิดผนึกด้วย ChaCha20-Poly1305 ภายใต้คีย์ของรายการนั้นเอง
- **วลีรหัสผ่าน:** `key new` หรือ `secret put` ครั้งแรกที่ใช้ keystore จะให้คุณตั้งวลีรหัสผ่าน โดยพิมพ์สองครั้งในเทอร์มินัล ยาว 12 อักขระขึ้นไป erpc รับวลีรหัสผ่านจาก prompt แบบซ่อนนั้นเท่านั้น ไม่รับจาก argument, ตัวแปรสภาพแวดล้อม หรือ pipe
- **การปลดล็อกบน Linux:** เมื่อวลีรหัสผ่านเปิด keystore แล้ว การปลดล็อกจะถูกเก็บไว้ใน persistent keyring ของ kernel ในหน่วยความจำ จนกว่าเครื่องจะรีสตาร์ท จนกว่า keyring จะไม่มีการใช้งานจนครบระยะหมดอายุ (สามวัน เว้นแต่ระบบจะกำหนดเป็นอย่างอื่น) หรือจนกว่าจะใช้ `erpc worker secret lock` ส่วน `erpc worker secret unlock` จะถามวลีรหัสผ่านไว้ล่วงหน้าและแจ้งว่าการปลดล็อกมีผลถึงเมื่อใด ใน shell ที่เริ่มโดยไม่มีการเข้าสู่ระบบของตัวเอง (`su` ที่ไม่มี `-`, `sudo -E`) การปลดล็อกจะไม่ถูกเก็บไว้ และแต่ละคำสั่งจะถามวลีรหัสผ่าน
- **เมื่อไม่มีใครอยู่ที่เทอร์มินัล** คำสั่งที่ต้องใช้ keystore จะใช้การปลดล็อกที่มีอยู่ หากไม่มีจะล้มเหลว โดยระบุ `erpc worker secret unlock` ไว้ keystore ที่ปลดล็อกแล้วจะส่งมอบ secret แต่ไม่ส่งมอบคีย์เทรด
- **บน macOS และ Windows** (`--store keystore`) การปลดล็อกจะไม่ถูกเก็บไว้: แต่ละคำสั่งที่ต้องใช้ keystore จะถามวลีรหัสผ่านหนึ่งครั้ง จึงต้องมีเทอร์มินัล

### สิ่งที่ keystore ป้องกัน และสิ่งที่ไม่ได้ป้องกัน

- **สำรองข้อมูลไดเรกทอรี `keystore` และจำวลีรหัสผ่านไว้** erpc กู้คืนให้ไม่ได้ทั้งสองอย่าง และหากขาดอย่างใดอย่างหนึ่ง สิ่งที่ keystore เก็บไว้จะหายไป
- ใครก็ตามที่มีไฟล์ของ keystore และวลีรหัสผ่านจะได้คีย์ไป PBKDF2 ทำให้การเดาแต่ละครั้งช้าลง แต่ไม่ได้ทำให้วลีรหัสผ่านที่เดาได้กลายเป็นปลอดภัย
- ขณะที่ keystore ถูกปลดล็อก โปรแกรมใดก็ตามที่รันในฐานะคุณสามารถอ่าน master key จาก keyring ของ kernel (โปรแกรมที่เซสชันไม่มี keyring ของคุณก็เชื่อม keyring นั้นเข้ามาได้) และเปิดทุกรายการได้ รวมถึงรายการของคีย์ด้วย กฎของ erpc เอง (คีย์ที่ `[wallet]` ระบุจะถูกอ่านเฉพาะเมื่อมีคนอยู่ที่เทอร์มินัลเท่านั้น ไม่ถูกอ่านให้เครื่องมือ AI เด็ดขาด และคีย์ที่เก็บไว้ใน keystore จะไม่ถูกเปิดเป็น secret เด็ดขาด) คือสิ่งที่ erpc ทำ กฎเหล่านี้ไม่มีผลบังคับต่อโปรแกรมอื่นที่รันในฐานะคุณ โปรดรัน `erpc worker secret lock` เมื่อใช้งานเสร็จ
- ชื่อรายการไม่ได้ถูกซ่อน และขนาดของรายการจะบอกความยาวของค่า
- ไฟล์ที่ถูกแก้ไขจะเปิดไม่ได้ แต่สำเนาเก่าของรายการเดียวกันที่ถูกนำกลับมาวางไว้ที่เดิมจะเปิดได้
- `erpc worker secret rm` ลบรายการใน keystore ของ secret พร้อมบรรทัดของ secret นั้นใน `erpc.toml` (เว้นแต่การตั้งค่าอื่นของแอปจะระบุรายการเดียวกัน) และปล่อยค่าที่อยู่ใน 1Password หรือพวงกุญแจไว้ตามเดิม คำสั่งนี้ไม่ได้ล้างข้อมูลบนดิสก์ และสำเนาในข้อมูลสำรองของคุณจะยังคงอยู่
- erpc ไม่เคยลบหรือเขียนทับรายการของคีย์เทรด หากต้องการเปลี่ยนคีย์ ให้ย้ายเงินออกก่อน แล้วลบไฟล์ของคีย์และ `[wallet]` ด้วยตนเอง
- การตั้งค่าไม่สามารถใช้ชื่อ `WALLET` ได้ ไม่ว่าจะเป็นตัวพิมพ์ใหญ่หรือเล็ก ทั้งใน keystore และพวงกุญแจ ส่วน `--store 1password` รับชื่อนี้ได้

## ทำงานกับคีย์เทรด

| คำสั่ง | สิ่งที่ทำ |
| --- | --- |
| `erpc worker key new` | สร้างคีย์เทรดและแสดงคีย์สาธารณะที่ต้องโอนเงินเข้า |
| `erpc worker key import <FILE>` | ย้ายไฟล์คีย์ไปไว้ใน 1Password, พวงกุญแจ หรือ keystore แล้วเสนอให้ล้างไฟล์นั้นทิ้ง |
| `erpc worker key show` | แสดงคีย์สาธารณะของคีย์และที่เก็บคีย์ |
| `erpc worker key balance` | แสดงยอดคงเหลือของคีย์ ผ่านการตั้งค่า RPC ของแอปเอง |
| `erpc worker key send --to <ADDRESS> --sol <N>` | ลงนามการโอนหนึ่งรายการในหน่วยความจำ หลังจากคุณตอบ yes ในเทอร์มินัล ส่วน `--all` จะส่งทั้งหมดยกเว้นค่าธรรมเนียม |

เมื่อ erpc จบการทำงานโดยไม่รู้ว่าการโอนสำเร็จแล้วหรือไม่ ให้ตรวจสอบ signature ของการโอนนั้นก่อนส่งอีกครั้ง: การส่งครั้งที่สองคือการโอนครั้งที่สอง
