key_load_public: định dạng không hợp lệ


99

Tôi đã sử dụng Trình tạo khóa PuTTY để tạo khóa RSA-2 4096 bit với cụm mật khẩu.

Tôi lưu .ppk và một khóa công khai định dạng openSSL. Khóa công khai định dạng putty không hoạt động.

Trong mọi trường hợp, lỗi của tôi như sau:

$ ssh -T git@github.com
key_load_public: invalid format
Enter passphrase for key '/c/Users/Dan/.ssh/id_rsa':
Hi Dan! You've successfully authenticated, but GitHub does not provide shell access.

Vấn đề là gì?

Tôi sử dụng Pageant để tải các phím và tôi sử dụng Git Bash để thử kết nối ssh. Tôi cũng đã tải khóa vào GitHub, không chắc mình đang làm gì sai.

Tôi đã thử thêm một dòng mới và không thêm một dòng mới trong GitHub


Bạn nghĩ tại sao nó không hoạt động? Nó cho biết đã xác thực thành công .
Roland Smith,

2
@RolandSmith Nó nói với tôi key_load_public: invalid formatngay khi tôi thực hiện lệnh trước khi nhập cụm mật khẩu?
JordanGS

1
Thực hiện: 'ssh -vvv -T git@github.com' để biết thêm thông tin, có thể ~ / .ssh / known_hosts bị lỗi - ssh đang tìm khóa công khai của github. Bạn có thể chạy 'khóa tệp' để tìm định dạng của tệp chính.
mosh

Câu trả lời:


182

Như Roland đã đề cập trong câu trả lời của họ, đó là một cảnh báo rằng ssh-agentkhông hiểu định dạng của khóa công khai và thậm chí sau đó, khóa công khai sẽ không được sử dụng cục bộ.

Tuy nhiên, tôi cũng có thể giải thích và trả lời lý do tại sao lại có cảnh báo đó. Nó chỉ đơn giản là tóm tắt thực tế là PuTTY Key Generator tạo ra hai định dạng khóa công khai khác nhau tùy thuộc vào những gì bạn làm trong chương trình.

Lưu ý: Trong suốt phần giải thích của tôi, các tệp chính mà tôi sẽ sử dụng / tạo sẽ được đặt tên id_rsavới phần mở rộng thích hợp của chúng. Hơn nữa, để thuận tiện cho việc sao chép-dán, thư mục mẹ của các khóa sẽ được giả định là ~/.ssh/. Điều chỉnh các chi tiết này cho phù hợp với nhu cầu của bạn như mong muốn.

Các định dạng

Liên kết đến tài liệu PuTTY có liên quan

SSH-2

Khi bạn lưu khóa bằng Trình tạo khóa PuTTY bằng nút "Lưu khóa công khai", khóa đó sẽ được lưu ở định dạng do RFC 4716 xác định .

Thí dụ:

---- BEGIN SSH2 PUBLIC KEY ----
Comment: "github-example-key"
AAAAB3NzaC1yc2EAAAABJQAAAQEAhl/CNy9wI1GVdiHAJQV0CkHnMEqW7+Si9WYF
i2fSBrsGcmqeb5EwgnhmTcPgtM5ptGBjUZR84nxjZ8SPmnLDiDyHDPIsmwLBHxcp
pY0fhRSGtWL5fT8DGm9EfXaO1QN8c31VU/IkD8niWA6NmHNE1qEqpph3DznVzIm3
oMrongEjGw7sDP48ZTZp2saYVAKEEuGC1YYcQ1g20yESzo7aP70ZeHmQqI9nTyEA
ip3mL20+qHNsHfW8hJAchaUN8CwNQABJaOozYijiIUgdbtSTMRDYPi7fjhgB3bA9
tBjh7cOyuU/c4M4D6o2mAVYdLAWMBkSoLG8Oel6TCcfpO/nElw==
---- END SSH2 PUBLIC KEY ----

OpenSSH

Trái với suy nghĩ của nhiều người, định dạng này không được lưu bởi trình tạo. Tuy nhiên, nó được tạo và hiển thị trong hộp văn bản có tiêu đề "Khóa công khai để dán vào tệp OpenSSH allow_keys". Để lưu nó dưới dạng tệp, bạn phải sao chép thủ công từ hộp văn bản và dán vào tệp văn bản mới.

Đối với khóa hiển thị ở trên, đây sẽ là:

ssh-rsa AAAAB3NzaC1yc2EAAAABJQAAAQEAhl/CNy9wI1GVdiHAJQV0CkHnMEqW7+Si9WYFi2fSBrsGcmqeb5EwgnhmTcPgtM5ptGBjUZR84nxjZ8SPmnLDiDyHDPIsmwLBHxcppY0fhRSGtWL5fT8DGm9EfXaO1QN8c31VU/IkD8niWA6NmHNE1qEqpph3DznVzIm3oMrongEjGw7sDP48ZTZp2saYVAKEEuGC1YYcQ1g20yESzo7aP70ZeHmQqI9nTyEAip3mL20+qHNsHfW8hJAchaUN8CwNQABJaOozYijiIUgdbtSTMRDYPi7fjhgB3bA9tBjh7cOyuU/c4M4D6o2mAVYdLAWMBkSoLG8Oel6TCcfpO/nElw== github-example-key

Định dạng của khóa đơn giản ssh-rsa <signature> <comment>và có thể được tạo bằng cách sắp xếp lại tệp có định dạng SSH-2.

Tạo lại khóa công khai

Nếu bạn đang sử dụng ssh-agent, bạn cũng sẽ có quyền truy cập vào ssh-keygen.

Nếu bạn có ( id_rsatệp) Khóa Riêng OpenSSH , bạn có thể tạo Tệp Khóa Công khai OpenSSH bằng cách sử dụng:

ssh-keygen -f ~/.ssh/id_rsa -y > ~/.ssh/id_rsa.pub

Nếu bạn chỉ có Khóa cá nhân PUTTY ( id_rsa.ppktệp), trước tiên bạn sẽ cần chuyển đổi nó.

  1. Mở Trình tạo khóa PuTTY
  2. Trên thanh menu, nhấp vào "Tệp"> "Tải khóa cá nhân"
  3. Chọn id_rsa.ppktệp của bạn
  4. Trên thanh menu, nhấp vào "Chuyển đổi"> "Xuất khóa OpenSSH"
  5. Lưu tệp dưới dạng id_rsa(không có phần mở rộng)

Bây giờ bạn đã có OpenSSH Private Key, bạn có thể sử dụng ssh-keygencông cụ như trên để thực hiện các thao tác trên khóa.

Phần thưởng: Định dạng khóa công khai được mã hóa PEM PKCS # 1

Thành thật mà nói, tôi không biết chìa khóa này được sử dụng để làm gì vì tôi không cần nó. Nhưng tôi có nó trong ghi chú của mình mà tôi đã đối chiếu trong nhiều năm và tôi sẽ đưa nó vào đây vì sự tốt lành hữu ích. Tệp sẽ trông như thế này:

-----BEGIN RSA PUBLIC KEY-----
MIIBCAKCAQEAhl/CNy9wI1GVdiHAJQV0CkHnMEqW7+Si9WYFi2fSBrsGcmqeb5Ew
gnhmTcPgtM5ptGBjUZR84nxjZ8SPmnLDiDyHDPIsmwLBHxcppY0fhRSGtWL5fT8D
Gm9EfXaO1QN8c31VU/IkD8niWA6NmHNE1qEqpph3DznVzIm3oMrongEjGw7sDP48
ZTZp2saYVAKEEuGC1YYcQ1g20yESzo7aP70ZeHmQqI9nTyEAip3mL20+qHNsHfW8
hJAchaUN8CwNQABJaOozYijiIUgdbtSTMRDYPi7fjhgB3bA9tBjh7cOyuU/c4M4D
6o2mAVYdLAWMBkSoLG8Oel6TCcfpO/nElwIBJQ==
-----END RSA PUBLIC KEY-----

Tệp này có thể được tạo bằng Khóa Riêng OpenSSH (như được tạo trong "Tạo lại Khóa Công cộng" ở trên) bằng cách sử dụng:

ssh-keygen -f ~/.ssh/id_rsa -y -e -m pem > ~/.ssh/id_rsa.pem

Ngoài ra, bạn có thể sử dụng Khóa công khai OpenSSH bằng:

ssh-keygen -f ~/.ssh/id_rsa.pub -e -m pem > ~/.ssh/id_rsa.pem

Người giới thiệu:


Khi bạn chuyển đổi khóa cá nhân của mình thành khóa OpenSSH, theo ý kiến ​​của tôi, bạn nên để tệp không có phần mở rộng và không thích hợp hơn. Git-client của tôi sẽ không kết nối với kho lưu trữ từ xa khi một tiện ích mở rộng được sử dụng cho khóa cá nhân.
Lập trình

@ Programmer1994 Các hướng dẫn chuyển đổi được bao gồm như là bước để chuyển đổi .ppkmột .pubtập tin. Tác dụng phụ của id_rsakhóa cá nhân trung gian thực sự được sử dụng bởi một chương trình khác đã bị bỏ qua. Tôi đã thay đổi ngôn ngữ "tốt nhất là không có phần mở rộng" thành "(không có phần mở rộng)" để xóa mọi sự mơ hồ. Tôi cũng đã nhân cơ hội để nói lại một số bất bình xuất hiện bất cứ khi nào tôi nhìn lại câu trả lời này. Cảm ơn sự đóng góp của bạn.
samthecodingman

Cảm ơn vì câu trả lời. Tôi đã sử dụng lệnh trong phần câu trả lời của bạn "Tạo lại khóa công cộng" và nó đã giải quyết được vấn đề của tôi.
desmond 13

bạn đã nói về khóa công khai. nhưng vấn đề được tạo ra từ khóa riêng tư id_rsa. Tôi nhận được cảnh báo tương tự khi sử dụng khóa ssh riêng tư của mình khi cố gắng truy cập máy chủ git qua ssh.
ahnbizcad

5
ssh-keygen -f ~/.ssh/id_rsa -y > ~/.ssh/id_rsa.pubđiều này đã giải quyết nó. CÁM ƠN!
Dwza

15

Có một giải pháp đơn giản nếu bạn có thể cài đặt và sử dụng công cụ puttygen. Dưới đây là các bước. Bạn nên có cụm mật khẩu của khóa cá nhân.

bước 1: Tải xuống puttygen mới nhất và mở puttygen

bước 2: Tải tệp khóa cá nhân hiện có của bạn, xem hình ảnh bên dưới

Tải khóa cá nhân hiện có

bước 3: Nhập cụm mật khẩu cho khóa nếu được hỏi và nhấn ok

nhập cụm từ diễn đạt

bước 4: như thể hiện trong hình dưới đây, chọn tab menu "chuyển đổi" và chọn "Xuất khóa OpenSSH"

lưu tệp OpenSSH

Lưu tệp khóa riêng mới ở vị trí ưu tiên và sử dụng cho phù hợp.


2
Tôi nhận được load pubkey invalid formatcảnh báo khi tôi xuất khóa bằng khóa Export OpenSSH . Nó biến mất khi sử dụng phím Export OpenSSH (buộc định dạng tệp mới) .
elsamuko

Trong linux, apt install putty-toolshoặc yum install puttysau đósudo puttygen private.ppk -O private-openssh-new -o private.pem
Đánh máy

8

TL; DR: cũng đảm bảo rằng của bạn id_rsa.pubđang ở trong ascii / UTF-8.

Tôi đã gặp vấn đề tương tự, tuy nhiên chỉ riêng câu trả lời được chấp nhận không hoạt động do mã hóa văn bản, đây là một vấn đề bổ sung, dễ bỏ sót.

Khi tôi chạy

ssh-keygen -f ~/.ssh/id_rsa -y > ~/.ssh/id_rsa.pub

trong Windows PowerShell, nó lưu đầu ra id_rsa.pubdạng mã hóa UTF-16 LE BOM , không phải ở dạng UTF-8 . Đây là thuộc tính của một số cài đặt PowerShell, đã được thảo luận trong Sử dụng PowerShell để ghi tệp trong UTF-8 mà không cần BOM . Rõ ràng, OpenSSH không nhận ra mã hóa văn bản cũ và tạo ra một lỗi giống hệt:

key_load_public: invalid format

Sao chép và dán đầu ra của ssh-keygen -f ~/.ssh/id_rsa -yvào trình soạn thảo văn bản là cách đơn giản nhất để giải quyết vấn đề này.

Tái bút Đây có thể là một bổ sung cho câu trả lời được chấp nhận , nhưng tôi chưa có đủ nghiệp để bình luận ở đây.


1
Như bạn đã khám phá, đường ống hoạt động khác trong Powershell. Bạn sẽ sử dụng ssh-keygen -f ~/.ssh/id_rsa -y | ac ~/.ssh/id_rsa.pubthay thế.
samthecodingman

7

Trong trường hợp bạn sao chép khóa công khai của mình bằng khay nhớ tạm và dán nó, có thể xảy ra trường hợp chuỗi khóa công khai có thể bị hỏng chứa dòng mới.

Đảm bảo chuỗi khóa công khai của bạn được tạo thành một dòng.


5

Có vẻ như sshkhông thể đọc khóa công khai của bạn. Nhưng điều đó không quan trọng.

Bạn tải khóa công khai của mình lên github, nhưng bạn xác thực bằng khóa riêng của mình . Xem ví dụ: phần FILES trong ssh(1).


2
Nói tóm lại, vào putty key gen, nhấp vào chuyển đổi -> mở khóa ssh và lưu vào id_rsa - đảm bảo rằng biến HOME env của bạn đang trỏ đến thư mục .ssh mà bạn đang xem, xóa tất cả các bản sao khác của tệp id_rsa khỏi hệ thống của bạn
Kalpesh Soni

2

Thay vì lưu trực tiếp khóa cá nhân, Hãy chuyển đến Chuyển đổi và Xuất Khóa SSh. Có cùng một vấn đề và điều này đã làm việc cho tôi


1

Tôi đã có cùng một cảnh báo. Đó là một chiếc chìa khóa rất cũ. Tôi đã tạo lại khóa trên OpenSSH 7 hiện tại và lỗi đã biến mất.


1

Lỗi gây hiểu nhầm - nó cho biết " pubkey" trong khi trỏ đến tệp khóa riêng tư ~/.ssh/id_rsa.

Trong trường hợp của tôi, nó chỉ đơn giản là một khóa công khai bị thiếu (vì tôi chưa khôi phục nó từ một kho tiền).


CHI TIẾT

Tôi đã từng bỏ qua việc triển khai ~/.ssh/id_rsa.pubbằng các tập lệnh tự động.

Tất cả các sshcách sử dụng đều hoạt động, nhưng lỗi khiến tôi nghĩ đến một mớ hỗn độn có thể xảy ra.

Không hề - straceđã giúp nhận thấy rằng trình kích hoạt thực sự là *.pubtệp:

strace ssh example.com
...
openat(AT_FDCWD, "/home/uvsmtid/.ssh/id_rsa.pub", O_RDONLY) = -1 ENOENT (No such file or directory)
...
write(2, "load pubkey \"/home/uvsmtid/.ssh/"..., 57) = 57
load pubkey "/home/uvsmtid/.ssh/id_rsa": invalid format

0

Vì vậy, sau khi cập nhật, tôi đã gặp vấn đề tương tự. Tôi đang sử dụng PEM key_filekhông có tiện ích mở rộng và chỉ cần thêm vào đã .pemkhắc phục sự cố của mình. Bây giờ là tập tin key_file.pem.


0

Nếu bạn đang sử dụng Windows 10 với SSH tích hợp, kể từ tháng 8 năm 2020, nó chỉ hỗ trợ các phím ed25519. Bạn sẽ gặp key_load_public: invalid formatlỗi nếu sử dụng ví dụ như khóa RSA.

Theo như vấn đề GitHub này, nó sẽ được khắc phục thông qua Windows Update một thời gian vào năm 2020. Vì vậy, một giải pháp là chỉ cần đợi bản cập nhật xuất xưởng.

Nếu bạn không thể chờ đợi, cách giải quyết là tạo một khóa ed25519 mới, dù sao đây cũnglời khuyên tốt .

> ssh-keygen -o -a 100 -t ed25519

Bạn có thể sử dụng nó với ví dụ: github, nhưng một số hệ thống cũ hơn có thể không hỗ trợ định dạng mới hơn này.

Sau khi tạo khóa, nếu bạn đang sử dụng một trong các tính năng dưới đây, đừng quên cập nhật chúng!

  1. ~\.ssh\config vẫn có thể trỏ đến khóa cũ.
  2. Thêm khóa mới vào ssh-agent thông qua ssh-addlệnh
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.