힘내 오류-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.