pkcs11-tool을 사용하여 pkcs#7 서명을 생성할 수 있습니까?

pkcs11-tool을 사용하여 pkcs#7 서명을 생성할 수 있습니까?

Ubuntu 17.10에서 스마트 카드로 문자열에 서명하려고 합니다. 나에게 필요한 것은 pkcs7-signedData객체이다. 저 할 수 있어요일부다음 명령 서명을 사용하면일부바이너리 foo.sig파일. 그것은 무엇입니까? 이것을 PKCS#7 서명으로 어떻게 바꾸나요?

$ echo foobar | pkcs11-tool --module ./VdsPKCS1164.so --login --pin $PIN \
   --sign --id 5378 --output-file foo.sig
Using slot 0 with a present token (0x1)
Using signature algorithm RSA-PKCS

$ openssl asn1parse -in foo.sig
Error: offset too large

$ openssl asn1parse -inform der -in foo.sig
Error in encoding
139905918145984:error:0D07207B:asn1 encoding routines:ASN1_get_object:header too long:../crypto/asn1/asn1_lib.c:101:

답변1

광범위한 연구 결과:

pkcs11-tool --sign이 명령은 선택된 해시 알고리즘의 바이너리 결과를 생성합니다. 이는 PKCS 구조 자체는 아니지만 타사 라이브러리와 함께 사용하여 asn1호환 가능한 콘텐츠를 생성할 수 있습니다. 이는 지루하고 권장되지 않는 프로세스이지만 검증 가능한 pkcs7-signedData서명을 구축할 수 있습니다.

openssl smime -signpkcs11권장 명령: 동일한 모듈이 포함된 엔진을 사용하도록 구성해야 하며 pkcs11-tool추가 라이브러리 없이 PKCS#7 구조를 빌드할 수 있습니다.

OpenSSL 구성 파일 예:

openssl_conf = openssl_def

[openssl_def]
engines = engine_section

[engine_section]
pkcs11 = pkcs11_section

[pkcs11_section]
dynamic_path = /usr/lib/x86_64-linux-gnu/openssl-1.0.0/engines/pkcs11.so
engine_id = pkcs11
MODULE_PATH = ./VdsPKCS1164.so
PIN = 1234
default_algorithms = ALL
init = 1

PKCS#7 서명을 생성하는 명령 예:

$ echo foobar > input.data
$ OPENSSL_CONF=./openssl.cnf openssl smime -sign -engine pkcs11 \
    -md sha1 -binary -in input.data -out foo.sig -outform der \
    -keyform engine -inkey id_5378 -certfile extra.cert.pem -signer cert.pem

cert.pem다음 명령을 사용하여 파일(및 필요한 경우 추가 인증서)을 토큰 카드에서 추출하고 PEM으로 변환할 수 있습니다.

$ pkcs11-tool --module ./VdsPKCS1164.so --login --pin $PIN \
    --read-object --type cert -id 5378 --output-file cert.crt
$ openssl x509 -inform der -in cert.crt -out cert.pem

관련 정보