Tạo SSH key RSA, ECDSA, Ed25519 ngay trên trình duyệt, đúng định dạng ssh-keygen
Cần một cặp khóa để đăng nhập máy chủ qua SSH, thêm deploy key cho GitHub, hay ký JWT bằng RS256, ES256 mà máy đang dùng không có sẵn ssh-keygen hoặc openssl? Công cụ này tạo SSH key RSA, ECDSA hoặc Ed25519 bằng Web Crypto ngay trong trình duyệt, xuất khóa bí mật định dạng OpenSSH hoặc PKCS#8, khóa công khai PEM, JWK và dòng ssh-rsa, ssh-ed25519 kèm vân tay SHA256 khớp với ssh-keygen.
Tính năng nổi bật
- Sinh khóa RSA 2048, 3072, 4096 bit với mục đích RSASSA-PKCS1-v1_5, RSA-PSS hoặc RSA-OAEP
- Sinh khóa ECDSA trên đường cong P-256, P-384, P-521 và Ed25519 trên trình duyệt hỗ trợ
- Khóa bí mật định dạng OpenSSH gốc (openssh-key-v1) dùng ngay với ssh, và định dạng PKCS#8 PEM cho OpenSSL, thư viện JWT
- Khóa công khai dạng SPKI PEM và dòng OpenSSH ssh-rsa, ecdsa-sha2-nistp256, ssh-ed25519 có chú thích
- Vân tay SHA256 cùng định dạng với lệnh ssh-keygen -l để đối chiếu khi thêm khóa lên máy chủ
- Xuất JWK công khai và bí mật, kèm JWK Thumbprint theo RFC 7638 dùng làm kid
- Khóa bí mật được ẩn mặc định, tải về thành tệp đặt tên sẵn theo quy ước id_rsa, id_ed25519
- Toàn bộ quá trình sinh khóa diễn ra trong trình duyệt, không có khóa nào được gửi đi
Khi nào nên tạo khóa trên trình duyệt, khi nào không
Cách chuẩn để tạo SSH key vẫn là chạy ssh-keygen -t ed25519 trên chính máy sẽ dùng khóa đó: khóa bí mật sinh ra tại chỗ, không đi qua bất kỳ ứng dụng nào khác. Nhưng có những lúc bạn cần nhanh một cặp khóa mà không có terminal: đang dùng máy tính công ty bị khóa quyền cài phần mềm, cần một khóa JWK để thử cấu hình JWT, cần khóa công khai PEM cho môi trường thử nghiệm, hoặc đang học cách SSH key hoạt động và muốn nhìn tận mắt các định dạng khác nhau của cùng một khóa. Công cụ này dùng Web Crypto, bộ mật mã tích hợp sẵn trong trình duyệt với nguồn số ngẫu nhiên của hệ điều hành, và không gửi khóa đi đâu. Với khóa có giá trị lâu dài như khóa đăng nhập máy chủ production hay khóa ký phát hành phần mềm, hãy vẫn tạo bằng ssh-keygen hoặc openssl trên máy của bạn.
Lợi ích khi sử dụng
- Có SSH key dùng được ngay khi máy không có ssh-keygen hay openssl
- Một lần sinh khóa có đủ các định dạng: OpenSSH, PEM, JWK
- Vân tay hiển thị khớp với ssh-keygen nên dễ đối chiếu khi thêm khóa lên máy chủ
- Hiểu rõ sự khác nhau giữa PKCS#8, SPKI, JWK và định dạng dây của SSH
- Khóa không rời khỏi trình duyệt của bạn
Cách tạo SSH key RSA hoặc Ed25519
- 1Chọn loại khóa: Ed25519 cho SSH trên hệ thống mới, ECDSA khi cần tương thích chuẩn NIST, RSA khi hệ thống cũ chỉ hỗ trợ RSA hoặc cần JWT RS256.
- 2Với RSA, chọn độ dài khóa (3072 bit là mặc định của ssh-keygen) và mục đích dùng trong Web Crypto; với ECDSA, chọn đường cong.
- 3Nhập chú thích để nhận ra khóa sau này, thường là email hoặc tên máy.
- 4Bấm Sinh cặp khóa. Sao chép dòng khóa công khai OpenSSH để dán vào ~/.ssh/authorized_keys hoặc phần SSH keys của GitHub, GitLab.
- 5Tải khóa bí mật định dạng OpenSSH, lưu vào ~/.ssh, chạy chmod 600 rồi đặt passphrase bằng ssh-keygen -p -f.
- 6Chạy ssh-keygen -l -f với tệp .pub để kiểm tra vân tay SHA256 trùng với vân tay hiển thị trên trang.
Chọn RSA, ECDSA hay Ed25519
Ed25519 là thuật toán được khuyên dùng cho SSH hiện nay: khóa công khai chỉ 32 byte, ký và xác minh nhanh, không phải chọn độ dài, và thiết kế ít bẫy triển khai hơn ECDSA. GitHub, GitLab và OpenSSH từ bản 6.5 đều hỗ trợ. ECDSA trên P-256, P-384, P-521 phù hợp khi tổ chức yêu cầu đường cong theo chuẩn NIST, và là lựa chọn phổ biến cho JWT ES256. RSA vẫn tương thích rộng nhất, cần thiết với thiết bị mạng, hệ thống cũ hoặc dịch vụ chỉ nhận ssh-rsa; hãy dùng tối thiểu 2048 bit, ssh-keygen hiện mặc định 3072 bit. Lưu ý Ed25519 trong Web Crypto chỉ có trên trình duyệt mới (Chrome 137, Firefox 129, Safari 17 trở lên); trình duyệt cũ sẽ nhận thông báo lỗi rõ ràng thay vì sinh khóa sai.
OpenSSH, PKCS#8, SPKI, JWK: cùng một khóa, nhiều cách viết
Một cặp khóa chỉ là vài con số, nhưng mỗi phần mềm muốn nhận chúng theo cách đóng gói riêng. Khóa bí mật định dạng OpenSSH bắt đầu bằng -----BEGIN OPENSSH PRIVATE KEY----- là định dạng mặc định của ssh-keygen. PKCS#8 bắt đầu bằng -----BEGIN PRIVATE KEY----- là chuẩn chung mà OpenSSL, Node.js, Java và phần lớn thư viện JWT đọc được. Khóa công khai SPKI bắt đầu bằng -----BEGIN PUBLIC KEY----- dùng khi dịch vụ yêu cầu khóa công khai PEM. JWK là dạng JSON dùng trong JOSE, JWT và các endpoint JWKS. Dòng ssh-ed25519 AAAA... là khóa công khai theo định dạng dây của SSH, mã hóa base64, đặt trong authorized_keys. Công cụ xuất đủ các dạng này từ cùng một cặp khóa.
OpenSSH có đọc được khóa PKCS#8 không
Với RSA và ECDSA thì có: OpenSSH đọc được trực tiếp tệp PKCS#8 PEM chưa mã hóa, lệnh ssh-keygen -y -f khoa.pem in ra đúng khóa công khai. Chúng tôi đã kiểm tra với OpenSSH 9.7 cho cả RSA 2048 đến 4096 bit và ECDSA P-256 đến P-521. Với Ed25519 thì bản OpenSSH đó báo invalid format khi đọc PKCS#8, nên công cụ xuất thêm khóa bí mật theo định dạng OpenSSH gốc cho mọi thuật toán, và đây là định dạng nên dùng cho SSH. Nếu đang có tệp PKCS#8 RSA hoặc ECDSA, lệnh ssh-keygen -p -f khoa.pem sẽ đặt passphrase và ghi lại tệp ở định dạng OpenSSH.
Vân tay SHA256 và cách đối chiếu
Vân tay là giá trị băm SHA-256 của khóa công khai theo định dạng dây SSH, viết dạng base64 không có dấu = ở cuối, ví dụ SHA256:gc/p8xcV3wD9F/cMEpig.... Đây chính là chuỗi ssh-keygen -l in ra, GitHub hiển thị trong trang SSH keys và máy chủ ghi vào log khi bạn đăng nhập. Sau khi tải tệp .pub, chạy ssh-keygen -l -f id_ed25519.pub: vân tay phải trùng từng ký tự với vân tay trên trang. Chúng tôi đã đối chiếu vân tay của công cụ với ssh-keygen cho cả bảy tổ hợp thuật toán và độ dài, đồng thời dùng khóa bí mật định dạng OpenSSH để ký và xác minh bằng ssh-keygen -Y.
Mục đích RSA trong Web Crypto ảnh hưởng gì
Web Crypto buộc khai báo mục đích khi sinh khóa RSA: RSASSA-PKCS1-v1_5 để ký (JWT RS256, cũng là kiểu chữ ký SSH dùng), RSA-PSS để ký kiểu PSS (JWT PS256), RSA-OAEP để mã hóa. Lựa chọn này chỉ thay đổi trường alg và key_ops trong JWK. Tệp PEM, khóa OpenSSH và vân tay không phụ thuộc lựa chọn, vì về mặt toán học vẫn là cùng một cặp số RSA với số mũ công khai 65537. Nếu chỉ cần SSH key, để mặc định là đủ.
Bảo vệ khóa bí mật sau khi tải về
Khóa bí mật tải từ trang chưa có passphrase. Việc đầu tiên nên làm là chuyển tệp vào ~/.ssh, chạy chmod 600 để chỉ tài khoản của bạn đọc được (OpenSSH từ chối khóa có quyền quá rộng), rồi chạy ssh-keygen -p -f để đặt passphrase. Xóa bản còn lại trong thư mục Tải về, đừng để tệp trong thư mục đồng bộ đám mây, đừng gửi qua chat hay email. Nếu nghi ngờ khóa đã lộ, gỡ khóa công khai khỏi authorized_keys và các dịch vụ đã thêm, rồi tạo khóa mới. Khóa công khai thì thoải mái chia sẻ, đó là phần duy nhất máy chủ cần.
Giới hạn của công cụ
Công cụ không đặt passphrase cho khóa bí mật, bạn cần tự đặt bằng ssh-keygen -p sau khi tải. Không hỗ trợ khóa gắn phần cứng như ed25519-sk dùng khóa bảo mật FIDO, không hỗ trợ DSA đã lỗi thời. Ed25519 phụ thuộc trình duyệt có hỗ trợ trong Web Crypto. Công cụ không đọc hay chuyển đổi khóa có sẵn của bạn; để xem thông tin một khóa công khai hay chứng chỉ PEM có sẵn, hãy dùng công cụ giải mã PEM. Và như đã nói, với khóa quan trọng lâu dài, ssh-keygen hoặc openssl trên máy của bạn vẫn là lựa chọn nên ưu tiên.
Câu hỏi thường gặp (FAQ)
Tạo SSH key trên trình duyệt có an toàn không?
Khóa được sinh bằng Web Crypto với nguồn ngẫu nhiên của hệ điều hành và không gửi đi đâu. Tuy vậy khóa từng hiện trên trang, đi qua clipboard hay thư mục Tải về vẫn có rủi ro lộ qua tiện ích trình duyệt hoặc phần mềm đồng bộ. Với khóa production, hãy tạo bằng ssh-keygen trên máy của bạn.
Nên chọn RSA hay Ed25519 cho SSH?
Ed25519 nếu hệ thống hỗ trợ: khóa ngắn, nhanh, an toàn. Chọn RSA 3072 hoặc 4096 bit khi phải làm việc với thiết bị hoặc dịch vụ cũ chỉ nhận ssh-rsa.
RSA 2048 bit còn đủ an toàn không?
2048 bit vẫn được xem là mức tối thiểu chấp nhận được hiện nay. ssh-keygen mặc định 3072 bit, và 3072 hoặc 4096 bit phù hợp hơn cho khóa dùng nhiều năm.
Dán khóa nào lên GitHub?
Dán dòng khóa công khai OpenSSH bắt đầu bằng ssh-ed25519, ecdsa-sha2-nistp256 hoặc ssh-rsa vào mục SSH and GPG keys. Không bao giờ dán khóa bí mật.
Vì sao có hai định dạng khóa bí mật?
Định dạng OpenSSH dùng cho ssh, giống tệp ssh-keygen tạo ra. PKCS#8 PEM dùng cho OpenSSL, Node.js, Java và thư viện JWT. Cả hai chứa cùng một khóa.
OpenSSH có dùng được tệp PKCS#8 không?
Với RSA và ECDSA thì được, đã kiểm tra với OpenSSH 9.7. Với Ed25519 thì bản OpenSSH đó không đọc được PKCS#8, nên hãy dùng định dạng OpenSSH mà công cụ xuất sẵn.
Làm sao đặt passphrase cho khóa vừa tải?
Chạy ssh-keygen -p -f ~/.ssh/id_ed25519, để trống passphrase cũ và nhập passphrase mới hai lần.
Vì sao ssh báo lỗi UNPROTECTED PRIVATE KEY FILE?
Tệp khóa bí mật có quyền đọc quá rộng. Chạy chmod 600 với tệp đó rồi thử lại.
Vân tay SHA256 dùng để làm gì?
Để xác nhận hai nơi đang nói về cùng một khóa. Chạy ssh-keygen -l -f với tệp .pub và so với vân tay trên trang hoặc trong danh sách SSH keys của GitHub.
Chú thích trong khóa SSH có ảnh hưởng gì không?
Không ảnh hưởng tới bảo mật hay việc đăng nhập, chỉ giúp bạn nhận ra khóa trong authorized_keys. Thường ghi email hoặc tên máy.
Dùng khóa này để ký JWT được không?
Được. Khóa RSA cho RS256 hoặc PS256, ECDSA P-256 cho ES256, P-384 cho ES384, P-521 cho ES512. Dùng tệp PKCS#8 PEM hoặc JWK bí mật để ký, và khóa công khai PEM hoặc JWK để xác minh.
JWK Thumbprint là gì?
Là giá trị băm SHA-256 của các trường bắt buộc trong JWK công khai theo RFC 7638, thường dùng làm kid để nhận diện khóa trong một tập JWKS.
Công cụ có lưu khóa của tôi không?
Không. Khóa chỉ nằm trong bộ nhớ của tab trình duyệt và mất khi bạn tải lại trang hoặc sinh cặp khóa mới.
Từ khóa liên quan
- tạo ssh key rsa
- tạo ssh key online
- rsa key generator
- ssh key generator
- tạo khóa ed25519
- ssh-keygen online
- tạo cặp khóa rsa
- rsa public key private key
- tạo khóa ecdsa
- pem private key
- pkcs8 private key
- openssh private key
- ssh-rsa public key
- ssh key github
- authorized_keys
- ssh fingerprint sha256
- jwk generator
- rs256 key pair
- tạo khóa jwt
- web crypto generate key