Có thể không có cách nào để làm điều này với các công cụ OpenSSH.
Nhưng nó có thể được thực hiện khá dễ dàng với các công cụ OpenSSL. Trong thực tế, có ít nhất hai cách để làm điều đó. Trong các ví dụ dưới đây, ~/.ssh/id_rsa
là khóa riêng của bạn.
Một cách là sử dụng dgst :
openssl dgst -sign ~/.ssh/id_rsa some-file
Khác là sử dụng pkeyutl :
openssl pkeyutl -sign -inkey ~/.ssh/id_rsa -in some-file
Cả hai đều viết một chữ ký nhị phân cho đầu ra tiêu chuẩn. dgst có một -hex
tùy chọn sẽ in một văn bản đại diện, với một số chi tiết về hình thức của chữ ký. pkeyutl có một -hexdump
tùy chọn ít hữu ích hơn một chút. Cả hai sẽ chấp nhận cả khóa RSA và DSA. Tôi không biết định dạng của đầu ra là gì. Hai lệnh tạo ra các định dạng khác nhau. Tôi có ấn tượng rằng pkeyutl được coi là hiện đại hơn dgst .
Để xác minh những chữ ký đó:
openssl dgst -verify $PUBLIC_KEY_FILE -signature signature-file some-file
và:
openssl pkeyutl -verify -inkey $PUBLIC_KEY_FILE -sigfile signature-file -in some-file
Vấn đề ở đây là $PUBLIC_KEY_FILE
. OpenSSL không thể đọc định dạng khóa chung của OpenSSH, vì vậy bạn không thể chỉ sử dụng id_rsa.pub
. Bạn có một vài lựa chọn, không có lý tưởng.
Nếu bạn có phiên bản OpenSSH từ 5.6 trở lên, rõ ràng bạn có thể làm điều này:
ssh-keygen -e -f ~/.ssh/id_rsa.pub -m pem
Cái nào sẽ ghi khóa công khai vào đầu ra tiêu chuẩn ở định dạng PEM, mà OpenSSL có thể đọc được.
Nếu bạn có khóa riêng và đó là khóa RSA, thì bạn có thể trích xuất khóa chung từ nó (Tôi giả sử tệp khóa riêng được mã hóa PEM bao gồm một bản sao của khóa chung, vì không thể lấy được khóa chung từ chính khóa riêng) và sử dụng:
openssl rsa -in ~/.ssh/id_rsa -pubout
Tôi không biết nếu có DSA tương đương. Lưu ý rằng phương pháp này đòi hỏi một số sự hợp tác từ chủ sở hữu của khóa riêng, người sẽ phải trích xuất khóa công khai và gửi nó đến người xác minh.
Cuối cùng, bạn có thể sử dụng chương trình Python được viết bởi một chap có tên Lars để chuyển đổi khóa chung từ định dạng OpenSSH sang định dạng OpenSSL.