
PIV 지원 YubiKey에서 x509 인증서를 관리하고, 키와 인증서 요청을 생성하며, git 커밋과 파일에 서명하거나 검증합니다.
Pivit은 PIV 애플릿을 지원하는 스마트 카드(Yubikey)에 저장된 x509 인증서를 관리하고, 해당 인증서를 사용하여 데이터를 서명하고 검증하기 위한 명령줄 도구입니다.
커밋과 태그를 서명하고 검증하기 위해 git 명령줄이 외부 프로그램을 호출하는 방식과 완벽하게 호환됩니다.
brew install pivit
go install github.com/cashapp/pivit/cmd/pivit@latest
git이 pivit을 사용하여 서명을 생성하고 검증하도록 설정하려면 다음 명령을 실행하세요:
git config --(local|global) gpg.format x509
git config --(local|global) gpg.x509.program pivit
pivit --reset
Yubikey의 PIV 애플릿을 재설정하고 액세스할 새 PIN을 생성합니다.
pivit --generate [--p256] [--self-sign | --no-csr] [--assume-yes] [--pin-policy] [--touch-policy]
Yubikey의 카드 인증 슬롯에 새 키 쌍을 생성합니다.
이 명령은 또한 Yubico가 서명한 생성 키에 대한 x509 인증서를 생성하고 저장합니다.
--p256 옵션을 지정하면 타원 곡선 P-256을 사용하여 키 쌍이 생성됩니다.
그렇지 않으면 Curve P-384가 사용됩니다.
--self-sign 플래그를 추가하면 자체 서명 인증서를 생성합니다. 이 인증서는 새로 생성된 키로 서명됩니다.
자체 서명 인증서가 정말로 필요한지 확인하라는 메시지가 표시된 다음, PIN을 입력하라는 메시지가 표시되고, 마지막으로 Yubikey를 터치하라는 메시지가 표시됩니다.
출력 끝에는 CERTIFICATE_REQUEST 대신 3개의 CERTIFICATE 블록이 포함됩니다(아래 출력 예시 참조).
이 옵션은 주로 테스트 목적으로 유용합니다.
--assume-yes 플래그는 --self-sign 옵션과 함께 사용하여 y/n 프롬프트를 비활성화할 수 있습니다.
--no-csr 플래그를 추가하면 인증서 서명 요청 출력을 건너뜁니다. 이 경우 Yubikey를 터치하라는 메시지가 표시되지 않습니다.
이 옵션은 생성된 키가 기존 PKI의 일부가 될 필요가 없을 때 유용합니다.
Yubico의 인증서를 사용하여 키의 인증서를 계속 검증할 수도 있습니다 여기.
--pin-policy 플래그는 생성된 키에 접근할 때 PIN을 묻는 시점을 제어합니다.
never, once, always 중 하나로 설정합니다(기본값은 never).
--touch-policy 플래그는 생성된 키에 접근할 때 하드웨어를 물리적으로 터치하라는 메시지를 표시할 시점을 제어합니다.
never, cached, always 중 하나로 설정합니다(기본값은 always).
명령의 출력은 다음과 같습니다:
Printing Yubikey device attestation certificate:
----- BEGIN CERTIFICATE -----
...
----- END CERTIFICATE -----
Printing generated key certificate:
----- BEGIN CERTIFICATE -----
...
----- END CERTIFICATE -----
Printing certificate signing request:
----- BEGIN CERTIFICATE REQUEST -----
...
----- END CERTIFICATE REQUEST-----
마지막의 CERTIFICATE REQUEST는 새로 생성된 개인 키로 서명되며, CA가 서명한 인증서를 발급하는 데 사용할 수 있습니다.
자체 인증서를 발급하여 사용하기로 선택한 경우 다음 사항도 확인하는 것이 중요합니다:
Pivit은 환경 변수를 통해 CSR에 다양한 속성을 설정할 수 있게 해줍니다.
다음 인증서 옵션이 다음과 같이 설정됩니다:
Subject.CommonName은 PIVIT_EMAIL 환경 변수의 값으로 설정됩니다.Subject.Organization은 PIVIT_ORG 환경 변수의 값으로 설정됩니다.Subject.OrganizationalUnit은 PIVIT_ORG_UNIT 환경 변수의 값으로 설정됩니다.또한 인증서 요청에는 다음 Subject Alternative Name(SAN)이 포함됩니다:
PIVIT_EMAIL이 포함됩니다.PIVIT_CERT_URIS 환경 변수에 지정된 모든 URL이 포함됩니다(URI는 공백으로 구분됨).PIV 모듈은 키와 인증서를 저장할 수 있는 여러 슬롯을 지원합니다.
사용 가능한 슬롯 - 9a, 9c, 9d, 9e.
9e는 "카드 인증(Card Authentication)" 슬롯입니다.9a는 "인증(Authentication)" 슬롯입니다. 시스템 로그인과 같은 작업에 사용됩니다.9c는 "디지털 서명(Digital Signature)" 슬롯입니다. 문서 서명, 파일 및 실행 파일 서명에 사용됩니다.9d는 "키 관리(Key Management)" 슬롯입니다. 기밀 유지를 위해 이메일이나 파일을 암호화하는 등의 용도로 사용됩니다.자세한 정보를 참조하세요.
pivit은 -w 플래그를 사용하여 슬롯을 선택할 수 있습니다.
각 명령에서 슬롯을 지정하지 않으면 기본적으로 9e가 사용됩니다.
예를 들어:
인증서 생성
pivit --generate [-w slot]
서명
pivit -s -u userid [-w slot]
인증서 출력
pivit --print [-w slot]
기본적으로 pivit은 Yubikey 하나가 연결되어 있다고 가정합니다. 시스템에 여러 개의 카드 리더기나 Yubikey가 있거나, pivit이 의도한 Yubikey와 통신하고 있는지 확인하려면 PIVIT_YK_SERIAL 환경 변수를 통해 일련번호를 지정하세요.
예시:
PIVIT_YK_SERIAL=13078292 pivit --print
이는 모든 명령에서 사용할 수 있습니다.
pivit --import [--first-pem] [file]
file에서 인증서를 가져옵니다.
지정된 파일 이름에는 PEM 블록으로 인코딩된 직렬화된 x509 인증서가 포함되어 있어야 합니다.
이 작업은 Yubikey PIN을 입력하라는 메시지를 표시합니다.
--first-pem을 추가하면 file의 첫 번째 PEM 블록만 가져오고 나머지는 무시합니다. 이는 발급된 인증서를 체인 또는 번들로 제공하고 최종 엔터티 인증서를 첫 번째로 두는 CA(이것이 일반적인 규칙입니다)를 사용할 때 유용합니다.
pivit --print
Yubikey의 카드 인증 슬롯에 저장된 인증서를 지문과 함께 출력합니다.
예를 들어:
> pivit --print
bad126c47dc90e90e0c7ec90ec682b1717e52757
-----BEGIN CERTIFICATE-----
MIICczCCAVugAwIBAgIRANATKTxzlHOJgMdV30XRz5kwDQYJKoZIhvcNAQELBQAw
ITEfMB0GA1UEAwwWWXViaWNvIFBJViBBdHRlc3RhdGlvbjAgFw0xNjAzMTQwMDAw
MDBaGA8yMDUyMDQxNzAwMDAwMFowJTEjMCEGA1UEAwwaWXViaUtleSBQSVYgQXR0
ZXN0YXRpb24gOWUwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAAT1l76Mvo6dJ4CwX2QQ
HImYRWbxLqt1kCVsn0PUn20DYtSKLuq8kCnMAn+kdneqjtaaBmWuPJH+g7LMyI18
QDQp2w+qSOf9ZWrOupMAGM8EpWXNTSNKoE50JhKXFbudBByjTjBMMBEGCisGAQQB
gsQKAwMEAwUBAjAUBgorBgEEAYLECgMHBAYCBACDq1IwEAYKKwYBBAGCxAoDCAQC
AQIwDwYKKwYBBAGCxAoDCQQBBDANBgkqhkiG9w0BAQsFAAOCAQEAGSmu0PUMDfEb
PkmkJ/rKYvpOKhbmpryjXuZ7ENJ3jGq3foyLSN+aBbd3M1im2ejC6/upthcp1N5M
Mg2SN6MBRS4crtt43DVHepBPt2W07vW8h4uFosJX29HdhK0dP+RnBGDdWYo0nq7y
7q1Y1c0BI7oGnaORL0DzSDtdxAJAphjspWsWNCIP2DTWQPhLTg4DqmYd/ahygVsZ
IE64QvJDQC72Dfyad6tIajmtPncqPt857H0hEJv2X58iOoJA/wAeuId4or859cJU
GTDbN7Ke4LWXRbs7StJTgefmNgWmKjm1Q2qs80WGShyQ6OrxALejd8jivtcTwsDz
WvzdmHCOmg==
-----END CERTIFICATE-----
인증서 지문은 원시 인증서 바이트에 대해 SHA1 체크섬을 수행한 다음 체크섬을 16진수 문자열로 인코딩하여 계산됩니다.
커밋과 태그 서명 시 사용할 인증서를 git에 알리려면 인증서 지문을 사용하세요:
FINGERPRINT=`pivit --print | head -1`
git config --(local|global) user.signingkey $FINGERPRINT
pivit -s [-a] [-b] [-u userid] [--status-fd=[num]] [-t url] [file]
-a (--armor) - 서명을 ASCII armor로 감싸서 인쇄 가능하게 만들지 여부입니다.-b (--detach-sign) - 분리된 서명(detached signature)을 만듭니다.-u (--local-user) - 이메일 주소 또는 16진수 문자열로 인코딩된 키 지문입니다.--status-fd - 상태 메시지를 내보낼 파일 디스크립터입니다. 1은 stdout, 2는 stderr입니다.0 이하의 값이면 상태 메시지가 기록되지 않습니다.-t (--timestamp-authority) - 타임스탬프에 사용할 RFC3161 타임스탬프 기관의 URL입니다.file - 서명할 파일의 경로입니다. 파일 이름을 지정하지 않으면 stdin을 사용합니다.이 명령은 Yubikey를 깜빡이게 하며 터치할 때까지 블로킹됩니다.
git이 커밋과 태그 서명용으로 설정되면 다음 하드코딩된 매개변수 -sbau [user.signingkey] --status-fd=1을 사용합니다.
user.signingkey는 git의 로컬/글로벌 구성에서 가져옵니다.
참고: Pivit은 git 커밋 서명을 지원하도록 설계되었습니다.
하지만 사용 중인 키가--pin-policy=always로 생성된 경우 완전히 지원되지 않을 수 있습니다.
현재 Pivit은 명령줄에서만 PIN을 요청합니다. GitKraken 이나 SourceTree 같은 GUI 기반 git 클라이언트를 사용하는 경우 해당 프롬프트를 놓칠 수 있습니다.
pivit --verify [file ...]
파일 인자에 지정된 서명된 데이터를 검증합니다.
파일이 지정되지 않은 경우 stdin에서 읽습니다.
파일 경로가 하나 이하로 지정된 경우 서명이 서명된 데이터에 첨부되어 있다고 가정합니다.
그렇지 않으면 첫 번째 파일에 서명이 포함되고 두 번째 파일에 서명된 데이터가 포함된 것으로 가정합니다.
-를 지정하면 서명된 데이터를 stdin에서 읽어야 함을 나타냅니다.