ssh 키를 사용하여 파일에 서명 할 수 있습니까?


36

SSH를 사용합니다 (리눅스에서는 OpenSSH 5.5p1). 암호가있는 키가 있습니다. 컴퓨터에 일반적인 로그인에 사용합니다.

파일 서명에도 사용할 수 있습니까?

내가 이해하는 것처럼 SSH 키는 RSA (또는 DSA) 키이며 SSH 로그인 프로세스 중에 서버로 보낸 메시지에 서명하는 데 사용됩니다. 따라서 원칙적으로 실제로는 사물에 서명하는 데 사용될 수 있습니다.

그러나 내가 알 수있는 한, 키를 사용하여 임의의 파일에 서명하는 방법은 없습니다 (PGP와 마찬가지로). 이것을 할 수있는 방법이 있습니까?


OpenSSH 는 dat 프로토콜Ed25519 를 사용하지 않습니까? 도구의 문제인 것 같습니다.
Pablo A

답변:


24

OpenSSH 도구만으로는이를 수행 할 방법이 없을 수 있습니다.

그러나 OpenSSL 도구를 사용하면 매우 쉽게 수행 할 수 있습니다. 실제로 두 가지 방법이 있습니다. 아래 예에서는 ~/.ssh/id_rsa개인 키입니다.

한 가지 방법은 dgst를 사용하는 것입니다 .

openssl dgst -sign ~/.ssh/id_rsa some-file

다른 하나는 pkeyutl을 사용 하고 있습니다 .

openssl pkeyutl -sign -inkey ~/.ssh/id_rsa -in some-file

이 두 가지 모두 이진 서명을 표준 출력에 씁니다. dgst-hex 옵션은 서명 형식에 대한 세부 정보와 함께 텍스트 표현을 인쇄 하는 옵션을 사용합니다. pkeyutl-hexdump조금 덜 유용한 옵션을 사용합니다. 둘 다 RSA 및 DSA 키를 모두 허용합니다. 출력 형식이 무엇인지 전혀 모른다. 두 명령은 다른 형식을 생성합니다. 나는 pkeyutldgst 보다 더 현대적이라고 생각된다 .

해당 서명을 확인하려면

openssl dgst -verify $PUBLIC_KEY_FILE -signature signature-file some-file

과:

openssl pkeyutl -verify -inkey $PUBLIC_KEY_FILE -sigfile signature-file -in some-file

여기서 문제는 $PUBLIC_KEY_FILE입니다. OpenSSL은 OpenSSH의 공개 키 형식을 읽을 수 없으므로을 사용할 수 없습니다 id_rsa.pub. 몇 가지 옵션이 있지만 이상적인 것은 아닙니다.

OpenSSH 버전이 5.6 이상인 경우 다음을 수행 할 수 있습니다.

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

공개 키를 PEM 형식의 표준 출력에 쓰고 OpenSSL에서 읽을 수 있습니다.

개인 키가 있고 RSA 키인 경우 공개 키를 추출 할 수 있습니다 (공개 키를 파생시킬 수 없기 때문에 PEM으로 인코딩 된 개인 키 파일에 공개 키 사본이 포함되어 있다고 가정합니다) 개인 키 자체에서)를 사용하고 다음을 사용하십시오.

openssl rsa -in ~/.ssh/id_rsa -pubout

DSA에 해당하는 것이 있는지 모르겠습니다. 이 방법을 사용하려면 개인 키 소유자의 협조가 필요합니다. 개인 키는 공개 키를 추출하여 원하는 검증 자에게 보내야합니다.

마지막으로 Lars라는 챕터작성한 Python 프로그램을 사용 하여 공개 키를 OpenSSH에서 OpenSSL 형식으로 변환 할 수 있습니다 .


1
"개인 키 자체에서 공개 키를 파생시킬 수 없습니다"는 사실이 아닙니다. 실제로 (실제로 사용되는 모든 암호화 시스템에서) 공개 키는 대부분 개인 키에서 쉽게 파생됩니다.
kirelagin

@ kirelagin : 나는 그것을 몰랐다. 어떻게 할 수 있는지 더 많은 정보를 알려주시겠습니까?
Tom Anderson

1
나는이 주제에 대한 어떤 특정한 독서가 있는지 잘 모르겠다. 이산 로그 기반 암호화 시스템 (ElGamal)을 사용하십시오. 이 경우 개인 키는 (그룹 크기, 생성기, 전원)이고 공개 키는 (그룹 크기, 생성기, 생성기 = 전원)입니다. 따라서 로그는 어렵지만 전력은 아닙니다. 계산 만하면됩니다.
kirelagin

RSA의 경우이 반전은 실제로 어렵지만 여기서는 상황이 약간 다릅니다. 공개 키는 (n, d)이고 개인 키는 (n, d ^ (-1) mod phi (n))입니다. phi (n)을 저장하지 않으면 d를 반전시키는 것도 어려울 수 있지만 여기에 요령이 있습니다. 거의 모든 사람들이 e = 65537을 사용합니다 (키를 생성 할 때이 기본값을 변경하는 옵션이 있지만 본 적이 없습니다. 실용적이지 않기 때문에 그것을 사용하는 사람), 따라서 개인 키에서 공개 키를 파생시키는 것은 사소한 일입니다.
kirelagin

타원 곡선의 경우 실제로 불연속 로그 및 검정력과 동일하므로 반전이 쉽습니다. 즉, 다른 암호화 시스템에 대해서는 잘 모르겠지만 실제로 사용되는 것은 3 가지입니다.
kirelagin

10

@Tom의 대답은 시작하는 데 도움이되었지만 즉시 작동하지는 않았습니다.

이 명령은 다음과 함께 작동합니다.

  • OpenSSL 1.0.1 2012 년 3 월 14 일
  • OpenSSH_5.9p1

pkeyutl 사용

# openssl pkeyutl -sign -inkey ~/.ssh/id_sample -in $1 > $1.sig
# ssh-keygen -e -f ~/.ssh/id_sample.pub -m PKCS8 > pub
# openssl pkeyutl -verify -pubin -inkey pub -in $1 -sigfile $1.sig
Signature Verified Successfully

dgst 사용

# openssl dgst -sign ~/.ssh/id_sample $1 > $1.sig
# ssh-keygen -e -f ~/.ssh/id_sample.pub -m PKCS8 > pub
# openssl dgst -verify pub -signature $1.sig $1
Verified OK

pkeyutl 버전은 작은 크기의 파일에만 서명 할 수 있습니다. dgst는 임의로 큰 파일에 서명 할 수 있지만 결과에 서명하기 전에 요약이 필요하기 때문입니다.


나에게 Stephen.z의 대답은 즉시 사용되었습니다. 처음에 나는 Tom의 대답을 잠시 동안 가지고 놀았고 마침내 나에게 완벽하게 작동하는 Stephen.z의 대답을 찾았습니다. 감사합니다 Stephen.z!
Grzegorz Wierzowiecki

추신 : 여기 내 스 니펫을 공유했습니다 : gist.github.com/gwpl/2c7636f0b200cbfbe82cc9d4f6338585
Grzegorz Wierzowiecki

pkeyutl을 사용하여 파일의 해시에만 서명하려고 했습니까?
Gaia

-3

이러한 서명을 확인하려면 더 쉬운 솔루션 :

서명 된 문서가 동일한 지 확인하는 더 쉬운 방법은 디지털 서명 파일을 다시 생성 한 다음 diff를 사용하여 두 서명 파일이 동일한 지 확인하는 것입니다.


3
서명이 아닌 해시를 생각하고 있습니다. 비슷하지만 동일하지는 않습니다. 해시는 파일이 변경되지 않았 음을 확인합니다. 서명은 또한 언제 왔는지 확인합니다.
Piskvor
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.