Cách kiểm tra xem cặp khóa công khai / riêng tư RSA có khớp không


71

Tôi có hai tập tin, id_rsaid_rsa.pub. Lệnh nào có thể được sử dụng để xác nhận nếu chúng là một cặp hợp lệ ?


Tôi sẽ xác nhận câu trả lời của Michuelnik; nó đã cứu tôi khỏi phải tạo một cặp chìa khóa mới, cảm ơn. ssh -vgiúp rất nhiều
Chris K

Câu trả lời:


92

Tôi thích ssh-keygen -y -e -f <private key>cách này thay vì câu trả lời được chấp nhận của Làm thế nào để bạn kiểm tra khóa DSA công khai / riêng tư? trên Stack Overflow.

ssh-keygen -y -e -f <private key>lấy một khóa riêng và in khóa công khai tương ứng có thể được so sánh trực tiếp với các khóa chung có sẵn của bạn. (Gợi ý: hãy cẩn thận với các bình luận hoặc các tùy chọn chính.)

(Làm thế quái nào nó làm điều đó? Tôi chỉ có thể hy vọng khóa công khai được mã hóa trực tiếp hoặc gián tiếp trong khóa riêng ...)

Tôi cần điều này cho bản thân mình và sử dụng Bash one-liner sau đây. Nó sẽ không xuất ra gì nếu các khóa thuộc về nhau. Áp dụng một chút -qcho diff trong script và diff chỉ đặt mã trả về một cách thích hợp.

PRIVKEY=id_rsa
TESTKEY=id_rsa.pub
diff <( ssh-keygen -y -e -f "$PRIVKEY" ) <( ssh-keygen -y -e -f "$TESTKEY" )

1
@MichaelHampton: bây giờ tôi hiểu bình luận của bạn. "câu trả lời được chấp nhận" nên đề cập đến câu hỏi trên stackoverflow chứ không phải câu hỏi này ...
Michuelnik

1
@Sirch: Tôi nghĩ rằng quyết định khóa nào là riêng tư và khóa nào là công khai hoàn toàn ngẫu nhiên vì hai khóa bằng nhau. Những gì một khóa mã hóa chỉ có thể được giải mã với cái kia. Và nếu một khóa có thể được lấy từ khóa kia thì tất cả sẽ không hoạt động.
Michuelnik

1
@Michuelnik Bạn có thể lấy khóa công khai từ khóa riêng. Bạn không thể lấy được khóa riêng từ khóa chung. Không nói về tài liệu mà nó mã hóa.
Sirch

1
@Michuelnik imho, câu hỏi không có chủ đề về SO và về chủ đề ở đây (và / hoặc Superuser). imho, nó không nên được đánh dấu là trùng lặp và thay vào đó được gắn cờ ở đó để di chuyển. Nhưng nó được đề cập trên cả hai vì vậy tôi thích chia sẻ thông tin đầy đủ hơn.
Chris K

10
Miễn là id_rsa.pub tồn tại, ssh-keygen -y -e -f id_rsasẽ không kiểm tra id_rsa chút nào mà chỉ trả về giá trị từ id_rsa.pub. Vì vậy, ví dụ nếu bạn echo 5 > id_rsaxóa khóa riêng, sau đó thực hiện tìm khác biệt, khác biệt sẽ vượt qua! Ngoài ra, chạy ssh-keygen -yef fooở nơi foo không phải là khóa hợp lệ (và không có foo.pub tương ứng) sẽ chặn chờ người dùng nhập liệu, vì vậy hãy cẩn thận khi sử dụng mã này trong tập lệnh.

32

Tùy thuộc vào nơi bạn nhận được tệp khóa công khai mà bạn đang kiểm tra, câu trả lời được chấp nhận có thể cho kết quả dương tính giả. Điều này là do hành vi được mô tả trong nhận xét của @drewbenn. Cụ thể, khi tùy chọn -e được sử dụng với tệp khóa riêng làm tham số tùy chọn -f, nó chỉ đơn giản là vẹt (nhưng định dạng lại) những gì trong tệp khóa chung được liên kết.

Nói cách khác,

ssh-keygen -y -f id_rsa

(dường như) tạo ra giá trị khóa chung và

ssh-keygen -y -e -f id_rsa

đơn giản và kết quả đầu ra (và định dạng lại) phím trong hiện id_rsa.pub bất cứ điều gì .

Trong trường hợp của tôi, tôi phải xác minh rằng cặp này chưa bị hỏng. Vì vậy, tôi quyết định so sánh như sau:

ssh-keygen -y -f id_rsa | cut -d' ' -f 2

với

cut -d' ' -f 2 id_rsa.pub

Vì thế:

diff <(cut -d' ' -f 2 id_rsa.pub) <(ssh-keygen -y -f id_rsa | cut -d' ' -f 2)

Có lẽ điều này không linh hoạt, nhưng nó tốt hơn cho nhu cầu của tôi. Có lẽ nó giúp người khác.


5
Điều này thực sự nên thay thế câu trả lời được chấp nhận hoặc ít nhất là vượt qua nó về mặt nâng cấp.
thomanski

Cảm ơn bạn! Lệnh này không hoạt động với các khóa có cụm mật khẩu, nó không yêu cầu tương tác. Tôi đã trích xuất hai nội dung lệnh () vào các tệp và tìm khác chúng, nó hoạt động.
Yar Tư Nikitenko

5

Nếu chúng nằm trên hệ thống cục bộ id_rsa.pubcủa bạn $HOME/.ssh/authorized_keys, sshhãy localhostsử dụng id_rsakhóa và sử dụng khóa. Nếu nó hoạt động, sau đó họ phù hợp.

cat $HOME/.ssh/id_rsa.pub >> $HOME/.ssh/authorized_keys
ssh -i $HOME/.ssh/id_rsa localhost
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.