힘내 오류-gpg가 데이터에 서명하지 못했습니다


149

방금 git 사용을 시작했으며 homebrew를 통해 git 및 gpg를 설치합니다. 어떤 이유로 든, git commit 이 주제와 관련하여 너무 많은 다른 stackoverflow 질문을 보았을 때이 오류가 발생 하지만 아무도 나를 위해 일하지 않았습니다. 성공적으로 업로드 할 수 있도록이 오류를 어떻게 해결할 수 있습니까?

error: gpg failed to sign the data
fatal: failed to write commit object

3
Mac 사용자의 경우. 나는이 문제가 있었다. 이 페이지의 조언을 통해 두 가지 버전의 gpg가 설치되어있을 수 있음을 알 수있었습니다. 양조장과 GPG Suite 중 하나. 시스템 키 체인에서 암호문을 캐싱 할 수 있기 때문에 GPG Suite를 사용하고 싶었습니다. 추출 버전을 제거하면 문제가 해결되었습니다. gpg-agent를 죽이는 것에 대한 @sideshowbarker의 답변과 함께. 그래서 각각의 구성이 서로 방해한다고 가정합니다.
Michael Welch



방금 gpg 서명 문제에 부딪 쳤습니다. 문제는 내 git repo에 로컬 gpg.signingkey 세트가 없지만 gllobal 하나는 없다는 것입니다. git config --local user.signingkey올바른 키로 설정 하면 다시 자동 서명됩니다. 어쩌면 함께 글로벌 한 설정을 해제git config --global --unset user.signingkey
MarcusJ

답변:


210

문제 해결을 위해 먼저 두 가지를 시도해보십시오.

  • git config --global gpg.program gpg2git가 사용 되도록 하기 위해 rungpg2 하지gpg
  • 실행 echo "test" | gpg2 --clearsign하여 gpg2자체 작동 하는지 확인

모든 것이 제대로 보인다면 다음 시도해야 할 것이 있습니다.

  • 실행 brew install pinentry당신은 좋은 도구가 암호 항목을 설치했는지 확인

설치 후 다시 시도한 git commit후에도 여전히 " failed to sign the data"오류가 발생하는 경우 :

  • 실행 gpgconf --kill gpg-agent중단 할 수있는 실행중인 에이전트를 죽일

그 말한다면 gpgconf설치되어 있지 않거나이없는 --kill옵션을, 당신은 수있는 이 시도 :

  1. cp ~/.gnupg ~/.gnupg-GOOD 당신의 사본을 저장 ~/.gnupg필요한 경우 나중에 되돌리려면
  2. brew install gnupg21 GnuPG 2.1을 설치하는 방법

당신의 사본을 저장하는 이유 ~/.gnupgDIR 때문에, / GnuPG는 2.1 잠재적으로 만들고 있다는 것이다 GnuPG는 2.0 이전 버전과의 호환 및 이전없는 방법으로 몇 가지 주요 데이터를 변경 하면 다시 나중에 가고, 당신이 할 수 싶어요 mv ~/.gnupg ~/.gnupg21 && mv ~/.gnupg-GOOD ~/.gnupg.


그렇지 않으면 작동하는 GnuPG 환경이 있는지 확인하기 위해 실행할 몇 가지 기본 단계가 있습니다.

  • run gpg2 -K --keyid-format SHORT, 하나 이상의 키 페어가 있는지 확인

그 결과로 GnuPG에서 사용할 비밀 키가 없다면, 하나를 만들어야합니다 :

  • 을 실행 gpg2 --gen-key하여 GnuPG가 키 페어 생성 단계를 안내하도록합니다.

"부적절한 ioctl for device" 오류 메시지가 표시되면 다음을 수행하십시오.

  • 실행 export GPG_TTY=$(tty)및 / 또는 해당를 추가하려면 ~/.bashrc또는˜/.bash_profile

두 번째 명령을 실행할 때이 오류가 발생합니다. gpg : 기본 비밀 키 없음 : 비밀 키 없음 gpg : [stdin] : clearsign failed : 비밀 키 없음
Entitize

@Entitize gpg가 서명에 사용할 키가 없다고 생각하는 것 같습니다. 답변에 추가 한 추가 단계를 참조하십시오. 당신이 gpg2 --gen-key전에 실행 적이 없다면 , 그것이 당신이 먼저해야 할 일입니다.
sideshowbarker

2
echo "test"를 실행할 때 | gpg2 --clearsign, 다음을 제공합니다. gpg-agent [-] : 명령 get_passphrase 실패 : 장치에 대한 부적절한 ioctl gpg : 에이전트 관련 문제 : 장치에 대한 부적절한 ioctl gpg : 기본 암호 키 없음 : 작업이 취소되었습니다 gpg : [stdin] : clearsign failed : 작업이 취소되었습니다. 나는 다른 많은 가능성을 시도했지만 아무 효과가 없습니다. GPG없이 GIT를 사용하는 방법이 있습니까?
Entitize

9
시도해 볼 수 있습니다 export GPG_TTY=$(tty). gpg없이 git을 사용하는 방법이있는 한 기본적으로 또는 git config --global commit.gpgsign false커밋의 전역 적으로 설정되지 않은 gpg 서명을 실행 하여 실행할 수 있어야합니다 .
sideshowbarker

10
Mac OS X에서 나는로 디버깅을 시작 echo "test" | gpg2 --clearsign하고 오류를 발견 하고이 스레드 로 연결되어 내 문제를 해결 export GPG_TTY=$(tty)했습니다. 내 ˜/.bash_profile파일에 넣은 다음 다시로드했습니다.source ˜/.bash_profile
herrera

71

Git은 어떤 키로 서명하고 있는지 알아야합니다.

GPG, gpg-agent 및 gpg.conf 파일을 설정 한 후 ( 이 안내서 참조 ) 다음을 실행해야합니다.

git config --global user.signingkey EB11C755

분명히, 공개 키를 자신의 것으로 바꾸십시오. 기본적으로 모든 커밋에 서명하려면 다음을 사용하십시오.

git config --global commit.gpgsign true

7
다른 사람이 내가 한 일을 할만큼 어리석은 경우를 대비하여이 문제가 발생했습니다. "signinkey"가 아니라 "signingkey"라는 철자를 확인하십시오.
ZNK

1
말 그대로 @ZNK 의이 의견은 나를 위해했습니다. 나는 "signingkey"대신 "signkey"라는 철자를 썼다
jzatt

1
수락 된 대답은 이것을 첫 번째 문제 해결 단계로 인용해야합니다. 때로는 모든 키가 이미 배치되어 있기 때문에 사용할 키를 잊어 버릴 수 있습니다.
f055

41

어떻게 든 git은 모든 커밋마다 GPG 서명을하도록 구성됩니다. git을 사용하여 커밋하거나 푸시하는 데 GPG로 서명 할 필요는 없습니다. gpg 서명 메커니즘이 아직 구성되지 않았기 때문에 오류가 발생했을 수 있습니다.

git을 처음 사용하는 경우 먼저 GPG 서명없이 먼저 작동하도록하고 나중에 필요할 경우 나중에 로그인을 추가하십시오.

다음을 수행하여 gpg와 관련하여 자식이 어떻게 구성되어 있는지 확인할 수 있습니다.

git config -l | grep gpg

다음을 포함하여 0 개 이상의 라인을 생성 할 수 있습니다.

commit.gpgsign=true

"commit.gpgsign"이 true이면 gpg 서명이 활성화 된 것입니다. 다음과 같이 비활성화하십시오.

git config --global --unset commit.gpgsign

그런 다음 커밋을 다시 실행하십시오. 이제 gpg 서명없이 실행해야합니다. 기본 git이 작동하면 gpg signing을 다시 믹스에 추가해야합니다.


12
대박! git config --global --unset commit.gpgsign나를 위해 일했다 :)
hpaknia

와!! 그것은 나를 위해 일했다 : git config --global --unset commit.gpgsign
Hardy Mathew

32

@sideshowbarker 및 @Xavier Ho 솔루션을 참조하십시오. 다음 단계를 통해 문제를 해결했습니다.

brew로 설치된 gpg2를 가정하고

git config --global gpg.program gpg2
brew install pinentry
gpgconf --kill gpg-agent
gpg2 -K --keyid-format SHORT
// no key found then generate new one
gpg2 --gen-key

gpg2 -K --keyid-format SHORT 

           

... /. gnupg / pubring.gpg

sec rsa2048 / 0A61C6FC 2017-06-29 [SC] [만료 : 2019-06-29]

git config --global user.signingkey 0A61C6FC

동료가 생각 나게하기 위해 추가해야합니다.

export GPG_TTY=$(tty)

zsh를 사용하는 경우 ~ / .zshrc에, 그렇지 않으면 ~ / .bash_profile에 추가하십시오.


macOS의 경우

gpg2는 brew에서 gpg와 결합되므로 gpg 명령은 gpg2를 가리 킵니다.

brew install gpg2

양조 정보 gpg

gnupg : 안정 2.2.6 (병)

git config --global gpg.program gpg
gpg -K --keyid-format SHORT 

암호 입력을위한 pinentry-mac이 있습니다.

brew install pinentry-mac
vim ~/.gnupg/gpg-agent.conf

라인 추가

Pinentry- 프로그램 / usr / local / bin / pinentry-mac

동료가 생각 나게하기 위해 추가해야합니다.

export GPG_TTY=$(tty)

zsh를 사용하는 경우 ~ / .zshrc에, 그렇지 않으면 ~ / .bash_profile에 추가하십시오.


1
macOS 10.15 (Catalina)는 GnuPG 버전 2.2.17과 함께 제공되므로 직접 업데이트를 관리하지 않는 한 별도로 설치할 필요가 없습니다.
Josh Habdas

18

나는 그것을 사용하고 있습니다. zsha를 지원하며 Linux 용 Windows 서브 시스템에서 작동합니다.

export GPG_TTY=$(tty)

2
MacOS Catalina에서 zsh를 사용하고 있으며 이것이 작동하는 데 필요한 유일한 변경이었습니다. 감사.
JP Lew

키를 WSL 환경에 복사 한 후 OP에 오류가 발생했습니다. 키의 암호 문구를 입력하려면이 작업을 수행해야했습니다. 감사.
narwic

10

키가 만료되었는지 확인하십시오. 만료 날짜를 수정하면 (원하지 않는 한 새 키를 만들 필요가 없음) git정상적으로 작동합니다.

만료 된 키를 수정하는 한 가지 방법 :

(참고 : $명령 행 프롬프트를 표시하고 프롬프트 뒤에 명령을 입력하십시오. 각 명령 후에 Enter를 누르십시오)

$ gpg2 --list-keys적절한 키 ID를 찾습니다 (다음 \에 나오는 문자)pub 선)

$ gpg2 --edit-key <key id> -프롬프트가 다음과 같이 gpg 쉘이 열립니다. gpg>

gpg> expire -기본 키의 새 만료 날짜를 설정하려면 지침을 따르십시오

다음으로 만료 된 하위 키가있는 경우 ( sub라인에 표시) 만료 날짜도 재설정하십시오.

gpg> key 1 -첫 번째 하위 키를 선택합니다 gpg> expire -지침에 따라 새 만료 날짜를 설정합니다

필요에 따라 각 후속 하위 키에 대해 반복하십시오.


만료 날짜가없는 gpg 키를 실행하려고 할 때 마다이 문제가 발생했습니다. 어떤 이유로 git은 그것을 좋아하지 않습니다. 이 방법을 사용하여 만료 날짜를 추가하면 (앞으로 얼마나 멀리 있든) 문제를 해결하는 것으로 보입니다.
some_guy632

save완료되면 gpg 프롬프트에서 입력하는 것을 잊지 마십시오 !
daviewales

5

이것은 우분투 18.04에서 나를 위해 일했습니다.

gpg 키 확인

gpg -K --keyid-format LONG

빈 응답을 받으면 GPG 키를 생성하십시오.

gpg --generate-key

첫 번째 명령을 다시 실행하면 다음과 같이 출력됩니다.

sec   rsa3072/95A854E0593B3214 2019-05-06 [SC] [expires: 2021-05-05]
      AF2F7514568DC26B0EB97B9595A854E0593B74D8
uid                 [ultimate] yourname<your_email>
ssb   rsa3072/EFD326E6C611117C 2019-05-06 [E] [expires: 2021-05-05]

자식 노래 키 설정

git config --global user.singingkey 95A854E0593B3214

그럼 잘 가세요! (-전역은 선택 사항입니다)

또는 ssh 키로 서명하지 않아도되는 경우

git config commit.gpgsign false

여기여기 의이 질문에 따른 보안 문제로 인해 권장되지 않습니다.


"또는 ssh 키로 서명하지 않아도되는 경우"ssh는 서명과 어떤 관계가 있습니까?
riffraff

SSH는 서명 커밋과 관련이 없습니다. 그들은 GPG 커밋 서명을 끄고 SSH 키를 사용하여 커밋을 실제로 git 서버에 푸시 할 때 인증하는 것에 의존합니다. SSH 인증을 사용하여 서명되지 않은 커밋을 푸시하기 위해 푸시 할 수 있습니다.
phouse512

4

gpg.program을 gpg의 절대 경로로 수정해야했습니다.

git config --global gpg.program "C:\Program Files (x86)\GnuPG\bin\gpg.exe"

cygwin과 함께 Windows를 사용하고 있습니다.


3
이것이 나를위한 해결책이었습니다. 초콜릿을 사용하여 gnupg를 설치했습니다.
Alex S

고마워, 나도 일 했어 내가 한choco install gpg4win
Gokul NC

4

해결책:

Issue: Disabled loopback pinentry mode

이 문제를 해결하려면 ~ / .gnupg / gpg.conf 에서 루프백 연결 모드를 활성화해야합니다 .

cat <<'EOF' >> ~/.gnupg/gpg.conf

use-agent 
pinentry-mode loopback

EOF

또한 ~ / .gnupg / gpg-agent.conf에도 (파일이 없으면 파일을 만듭니다) :

cat <<'EOF' >> ~/.gnupg/gpg-agent.conf

allow-loopback-pinentry

EOF

그런 다음 에이전트를 다시 시작하면 echo RELOADAGENT | gpg-connect-agent좋습니다.

출처


1
와우, 가능한 모든 해결책을 시도하는 데 몇 시간을 소비 한 결과 문제가 해결되었습니다. 감사합니다!
매트

천만에요. 실제로 소스 덕분입니다. 나는 이것도 붙어 있었다.
Rahul Thakur

3

이 오류는 GPG 키가 만료 된 경우에도 발생할 수 있습니다. 새 키를 생성하고 Git에 추가하면 문제가 해결됩니다.


3

gnupg 2.x로 업그레이드 한 후이 문제가 발생했습니다. 그것은 gpg2 다르게 키를 참조하는 것을 알 것이다 : 나는 아직도 가지고 signingkey = ABC98F11내에서 (GPG V1 설정) ~/.gitconfig. gpg2의 키 식별자가 더 깁니다. 그들과 함께 그들을 봐gpg --list-secret-keys


1

나는 / /에 git대해 3 개의 별도 키로 키를 만들었고 키는 미래에 만료 된 것으로 표시했습니다 (며칠 동안 잘 작동 한 후).certifysignencrypt

pub   rsa4096/4CD1E9DA 2017-04-26 [C] [expired: 2017-04-28]
      Key fingerprint = 4670 59C1 7592 08B8 7FA5  313B 2A42 B6A6 4CD1 E9DA
uid         [ expired] Stuart Cardall (GIT Development Keys) <xxxxxx>
sub   rsa4096/5195E715 2017-04-26 [E] [expired: 2019-04-26]
sub   rsa4096/DB74C297 2017-04-26 [S] [expired: 2019-04-26]
sub   rsa2048/A3913A3C 2017-04-28 [] [expired: never     ]

문제를 해결하기 위해 별도의 하위 키를 추가하지 않고 새 키를 만들었습니다.


1

Git 설정이 gpgsign = true 로 설정 되었을 수 있습니다 . 커밋에 서명하지 않으려면 false로 설정하십시오. 저장소 폴더로 이동하여 파일을 변경하십시오.

나노 .git / config

이것으로부터...

[core]
    repositoryformatversion = 0
    filemode = true
    bare = false
    logallrefupdates = true
[remote "origin"]
    url = git@bitbucket.org:yourrepo/project.git
    fetch = +refs/heads/*:refs/remotes/origin/*
[branch "master"]
    remote = origin
    merge = refs/heads/master
[user]
    signingkey = <GPG-KEY>
[commit]
    gpgsign = true

이에...

[core]
    repositoryformatversion = 0
    filemode = true
    bare = false
    logallrefupdates = true
[remote "origin"]
    url = git@bitbucket.org:yourrepo/project.git
    fetch = +refs/heads/*:refs/remotes/origin/*
[branch "master"]
    remote = origin
    merge = refs/heads/master
[user]
    signingkey = <GPG-KEY>
[commit]
    gpgsign = false

1

나를 위해이 오류는 git tag -sDebian GNU / Linux에서 원격 액세스를 쉽게하기 pinentry-gnome3위해 pinentry-curses(사용 update-alternatives --config pinentry)으로 전환했을 때 발생하기 시작했습니다 . 그것은 단지로 발생 git tag -s하지와 gpg(예 : gpg --clearsign자체).

이 경우 다시 작동하는 데 필요한 유일한 변경 사항은 export GPG_TTY=$(tty)쉘 시작 파일 에 추가 하는 것이 었습니다 .

이 질문에 대한 다른 답변에서이 수정의 지표로 언급 된“부적절한 ioctl for device”오류 메시지를받지 못했습니다.

참고 :이 오류를 가져 오는 원인이 제안하는 사람들에 비해 완전히 다른 하나 때문에 export GPG_TTY=$(tty)이 문제가 언급 다른 답변이 필요이 질문에 다른 답변에서 (보통 사이드 힌트로)하기 전에, 내가 결정 export GPG_TTY=$(tty)의 주요 수정 될 수있다 및 경우에 따라서 만 필요한 것.


감사! update-alternatives --config pinentry나를 위해 그것을했다. 내 데스크탑에 SSH로 연결 pinentry되어 있으며 /usr/bin/pinentry-gnome3( SSH를 넣었을 때 또는 가상 콘솔로 전환 할 때 TTY 폴 백이 있어야 함) 으로 설정되었습니다 . 그러나 분명히 작동하지 않았습니다. /usr/bin/pinentry-tty나를 위해 트릭 을 수행 하도록 기본값을 설정하십시오 . 데스크탑으로 돌아 왔을 때 다시 설정해야 할 수도 있지만 현재로서는 좋습니다. export GPG_TTY=$(tty)충분하지 않았다. 나는 그것을했지만 pinentry커밋에 서명하기 전에 전환 해야했습니다.
Karl Wilbur

1

나를 위해 그것을 해결 한 것은 키의 이름이 내 자식 사용자 이름과 일치하는지 확인하는 것이 었습니다. 이메일도 일치해야한다고 생각합니다. 이것은 내 Mac에서 GPG KeyChain을 사용하는 것과 관련이 있습니다. 확실하지 않다.

나는 이것을 채울 때 키의 이름을 짓고 있다고 생각했지만 내 이름 (git user name)을 요구하고 있다고 생각합니다.

GPG 키 체인 양식


이 답변이 너무 늦어 져서 많은 사람들이 여기서 문제를 찾지 않을 것입니다.
MaciekS

1

macos 에서이 오류가 발생했습니다. 문제를 해결하고 시도 gpg2 --list-keys하여 키가 만료되었는지 확인 하기 위해 키를 나열하려고 시도 했습니다. 키가 만료되지 않았으며 사용하여 구성에 올바른 키가 설정되어 있는지 확인했습니다 git config --global user.signingkey.

해당 명령을 실행 한 후 갑자기 문제없이 서명 된 커밋을 다시 수행 할 수있었습니다. 구성 파일이나 키를 변경하지 않았습니다. 새로운 터미널 인스턴스도 만들지 않았습니다. gpg2가 어떻게 든 내 Mac에서 이상한 상태 인 것처럼 보였습니다.


0

설치 brew install gpg2후 수행 하는 문제를 해결했습니다.git config --global gpg.program gpg2


0

git config에서 키가 만료되면 동일한 오류가 발생할 수 있습니다.

내용을 확인하고 가치를 cat .git/config찾고 signingkey만료되었는지 확인하십시오. 그렇다면 새 것으로 업데이트하십시오.


0

당신이 사용하는 경우 스마트 카드 / yubikey을 당신의 GPG 키를 저장하고 사용자가 설정 한 signkey카드에 저장된 키에 의해 자식 설정의을 (그리고 모든 대답은 위의 문제를 해결하지 않는 것), 카드의 차단 된 PIN은이 될 수 있습니다 이 문제의 근본 원인.

차단 된 PIN을 확인하려면

gpg --card-status

카운터가

Reader ...........: Yubico YubiKey
PIN retry counter : 3 0 3

그런 다음 PIN이 차단됩니다 (3 번의 시도 실패 후).

PIN을 차단 해제하려면

gpg --card-edit
gpg/card> admin
Admin commands are allowed

gpg/card> passwd
gpg: OpenPGP card no. … detected

1 - change PIN
2 - unblock PIN
3 - change Admin PIN
4 - set the Reset Code
Q - quit

Your selection? 2
PIN unblocked and new PIN set.

1 - change PIN
2 - unblock PIN
3 - change Admin PIN
4 - set the Reset Code
Q - quit

Your selection? q

0

나를 위해 간단한 brew unintstall gnupg && brew cask reinstall gpg-suite 문제를 해결합니다.

(필자의 경우) 직접 homebrew-istalled gpg를 제거하고 전체 GPG Suite를 다시 설치합니다.


0

필자의 경우 커밋 서명 설명서에 제공된 gpg 구성과 smimesign 구성을 혼합했습니다. https://help.github.com/en/github/authenticating-to-github/telling-git-about-your-signing- 키

몇 시간 동안 작업 한 후 gpg와 관련된 모든 설정이 해제되고 gpg를 재구성하는 가장 좋은 방법을 찾았습니다.

@Jason Thrasher의 답변에서 언급했듯이 다음을 사용하여 gpg와 관련된 모든 git 구성을 찾으십시오.

git config -l | grep gpg

그런 다음 로컬을 사용하여 모든 것을 골라 볼리로 설정하고

git config --global --unset <config_name>
git config --local --unset <config_name>

그런 다음 위에 제공된 공식 문서에 따라 재구성하십시오. 도움이 되었기를 바랍니다.


또한 gpg2
Shubham Gupta

0

이전에 pinentry와 gpg 설정을했는데 아무데도 작동하지 않는 경우 :

gpg가 작동하는지 확인하십시오.

echo "test" | gpg --clearsign

이 표시되면 gpg: signing failed: No pinentrygpg 데몬 클라이언트를 다시 시작하면 때때로 중단됩니다.

gpgconf --kill gpg-agent

이제 작동해야합니다.

echo "test" | gpg --clearsign

0

제 경우 에는 암호 문구 프롬프트에 맞지 않는 git commit작은 tmux창 에서 실행할 때이 오류가 발생했습니다 .

$ echo "test" | gpg --clearsign
-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA256

test
gpg: signing failed: Screen or window too small
gpg: [stdin]: clear-sign failed: Screen or window too small

-6

이것은 당신이 그것을 제거하는 데 도움이 될 것입니다

git config commit.gpgsign false


1
나는 하향 투표를 이해하지 못하고, 그것은 나에게 매력처럼 제안 된 문제를 해결했습니다.
Jms

2
이 명령은 피해야합니다. 커밋을하는 사람을 인증하는 문제는 해결하지 않고 git commit에 서명하는 요구 사항 만 제거합니다.
Kyle
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.