openssl smime -sign을 사용하여 -out xml에서 다이제스트 값을 얻는 방법은 무엇입니까?

openssl smime -sign을 사용하여 -out xml에서 다이제스트 값을 얻는 방법은 무엇입니까?

순서를 알고 싶습니다.openssl smime 서명소화 값을 얻기 위해.

아래와 같은 것 -


MIME-Version: 1.0
Content-Type: multipart/signed;protocol="application/pkcs7-
signature";micalg="sha-256";boundary="707e08bf1d5b44f6b18bc0999df569c8"

This is an S/MIME signed message

--707e08bf1d5b44f6b18bc0999df569c8
<cms>
<file>
<name>index.xml</name>
<digest>4pDBO3/ZNCpaAvxOWbQ0AUnDbT1oAaWMrPIDZz/a1i0=</digest>
<digesttype>sha256</digesttype>
<path>.</path>
</file>
</cms>
--707e08bf1d5b44f6b18bc0999df569c8
Content-Type: application/pkcs7-signature; name="smime.p7s"
Content-Transfer-Encoding: base64
Content-Disposition: attachment; filename="smime.p7s"

MIAGCSqGSIb3DQEHAqCAMIACAQExDzANBglghkgBZQMEAgEFADCABgkqhkiG9w0B

...

생성하는 명령은 무엇입니까?

다음을 사용하여 확인하세요 -

openssl smime -verify -in sign -CAfile Sign_Key.crt -out xmlwithdigest
openssl dgst -binary -sha256 infile  | openssl base64

그런 다음 소화 값을 비교하시겠습니까?

답변1

귀하의 이메일은 분명히 S/MIME 일반 텍스트로 서명된(분리 서명이라고도 함) 이메일을 보내려는 시도입니다.rfc5751초 3.4.3et pred는 실제로 정확하지는 않지만 첫 번째 부분은 데이터 엔터티이며 MIME 헤더가 없습니다.

OpenSSL을 포함한 일부 소프트웨어는 이러한 편향을 처리할 수 있지만 OpenSSL(여전히!)은 메시지처럼 최신 버전의 하위 유형을 사용하는 x-pkcs7-signature대신 v2 하위 유형(rfc2311)을 사용하여 독립적인 서명을 생성합니다 .pkcs7-signature

이러한 S/MIME 메시지에 사용되는 PKCS7/CMS 분리 서명에는 사용되거나 사용되지 않을 수 있는 몇 가지 선택적 구성 요소가 있습니다. 표시된 잘린 데이터에서는 메시지가 어떤 옵션을 사용하는지 알 수 없으며 어떤 경우에도 해당 옵션에 어떤 방식으로 관심이 있는지 표시하지 않았습니다.

생성하는 명령은 무엇입니까?

OpenSSL을 사용하여,openssl smime -sign -sha256 -signer $certfile [-inkey $keyfile] 아니요 -nodetach이전 하위 유형 및 를 사용하여 위에서 언급한 것을 제외하고 이 형식으로 메시지를 생성합니다 x-. -inkey개인 키가 인증서와 동일한 파일에 포함된 경우 이 옵션을 생략할 수 있습니다. 당신은 선택할 수 있습니다:

  • 서명자의 인증서를 포함하거나 제외합니다.

  • 추가(체인) 인증서를 명시적으로 포함

  • 시스템 매뉴얼 페이지에 설명된 대로 signedAttributes를 사용하거나 사용하지 않고또는 온라인. 명명된 파일에서 입력 및 출력을 수행하거나 stdin 및 stdout을 사용할 수 있으며, 이는 차례로 셸(또는 운영 체제)에 의해 리디렉션되거나 파이프될 수 있습니다.

    매우 오래된 OpenSSL 버전(0.9.8 이하) 외에도 실제로 다음의 openssl cms상위 집합인 OpenSSL 버전을 사용할 수도 있습니다.openssl smime기본값S/MIME 실행 - 가져오기누구나 openssl smime 또는 openssl cms-outformCMS를 수행하려면 서명이나 암호화, -inform확인 또는 암호 해독을 지정해야 합니다 !

Q의 명령은 smime verifyS/MIME 서명을 확인한 다음(기본적으로 적용 가능한 인증서 체인도 있지만 독립 실행형 인증서를 사용하는 것 같아서 실제 체인이 없음) 이를 폐기하고 서명된 데이터만 출력합니다. 이 예에서는 XML입니다.

외부 라벨<cms> 할 수 있다이는 이 데이터가 PKCS7(rfc5652 et pred)의 후속인 암호화 메시지 구문을 나타내기 위한 것이지만 이 데이터 조합은 어떤 CMS 메시지에도 해당하지 않음을 의미합니다. 이름은 특정 파일의 해시를 포함하고 있음을 나타냅니다. 파일의 (의도된) 복사본이 있고 파일의 해시를 확인하려는 경우 OpenSSL은 이를 자동으로 수행할 수 없습니다( {md5,sha1,etc}sum -c간단한 임시 텍스트로 도 가능). 일반적인 Unix 명령을 사용하여 확인됩니다). 두 번째 명령이 올바르게 시작되었는지 수동으로 확인하여 XML에서 해시를 추출하려면 다음을 수행할 수 있습니다.

 $ grep -Po '<digest>\K[^<]*' 

또는 PCRE의 grep이 없는 경우 sed awk perl여기에 있는 다른 Q는 거의 확실히 동등한 항목을 다루고 두 해시를 shell test "$x" == "$y", [ "$x" == "$y" ]bash, ksh, zsh [[또는 awk기타와 비교합니다.perl

OTOH, 귀하의 질문이 실제로만들다XML 본문의 경우 OpenSSL은 나머지 부분에 대해 해시 값만 수행할 수 있으므로 표준 텍스트 도구 또는 XML 도구를 사용해야 합니다.

관련 정보