![postfix(S/MIME)를 사용하여 보내는 메일에 자동으로 서명](https://rvso.com/image/617828/postfix(S%2FMIME)%EB%A5%BC%20%EC%82%AC%EC%9A%A9%ED%95%98%EC%97%AC%20%EB%B3%B4%EB%82%B4%EB%8A%94%20%EB%A9%94%EC%9D%BC%EC%97%90%20%EC%9E%90%EB%8F%99%EC%9C%BC%EB%A1%9C%20%EC%84%9C%EB%AA%85.png)
postfix를 사용하여 보내는 메일에 자동으로 서명하고 싶습니다. 스크립트를 찾아서 postfix에 통합했습니다. 대부분 예상한 대로 작동하지만 두 가지 버그가 있으므로 이를 해결하는 데 도움을 주셨으면 합니다.
/home/xxx/sign.sh
#!/bin/bash
WORKDIR="/tmp"
SENDMAIL="/usr/sbin/sendmail -G -i"
EX_UNAVAILABLE=69
SENDER="$2"; RECIPIENT="$4"
MESSAGEFILE="$WORKDIR/message.$$"
trap "rm -f $MESSAGEFILE; rm -f $MESSAGEFILE.signed" 0 1 2 3 15
umask 077
cat > $MESSAGEFILE || { echo Cannot save mail to file; exit $EX_UNAVAILABLE;}
SUBJECT=$(reformail -x "Subject:" < $MESSAGEFILE)
openssl smime -sign -in $MESSAGEFILE -out $MESSAGEFILE.signed -from $SENDER -to $RECIPIENT -subject "$SUBJECT" -signer /home/xxx/sign.crt -inkey /home/xxx/sign_key.crt -text || { echo Problem signing message; exit $EX_UNAVAILABLE; }
$SENDMAIL "$@" < $MESSAGEFILE.signed
exit $?
이것은 postfix로의 구현입니다:
smtp inet n - - - - smtpd
-o content_filter=spamassassin
-o content_filter=meinfilter:dummy
meinfilter unix - n n - 2 pipe
flags=Rq user=xxx null_sender=
argv=/home/xxx/sign.sh -f ${sender} -- ${recipient}
버그는
제목 줄은 항상 비어 있습니다.이는 소프트웨어 종속성 누락으로 인해 발생합니다.- 전달된 메시지에는 헤더가 두 배로 표시됩니다(일반 헤더와 메시지에서).
여기에 원시 이메일 헤더와 본문이 있습니다. 아래에서 이중 헤더를 확인할 수 있습니다.
To: xxx
From: xxx
Subject: Testsubject
MIME-Version: 1.0
Content-Type: multipart/signed; protocol="application/x-pkcs7-signature"; micalg="sha-256"; boundary="----2466B05A8CF1ACF5CD6D9B7B8AE72747"
This is an S/MIME signed message
------2466B05A8CF1ACF5CD6D9B7B8AE72747
Content-Type: text/plain
Return-Path: <xxx>
Received: from [127.0.0.1] (xxx [xxx])
by xxx (Postfix) with ESMTPSA id xxx
for <xxx>; Fri, 13 Sep 2013 02:49:22 +0000 (UTC)
Message-ID: <xxx>
Date: Fri, 13 Sep 2013 04:49:21 +0200
From: xxx
User-Agent: Mozilla/5.0 (Windows NT 6.2; WOW64; rv:17.0) Gecko/20130801 Thunderbird/17.0.8
MIME-Version: 1.0
To: xxx
Subject: Testsubject
Content-Type: text/plain; charset=ISO-8859-15; format=flowed
Content-Transfer-Encoding: 7bit
Testmessage
------2466B05A8CF1ACF5CD6D9B7B8AE72747
Content-Type: application/x-pkcs7-signature; name="smime.p7s"
Content-Transfer-Encoding: base64
Content-Disposition: attachment; filename="smime.p7s"
LONGTEXTLONGTEXTWITHPUBLICKEYLONGTEXTLONGTEXTWITHPUBLICKEY
LONGTEXTLONGTEXTWITHPUBLICKEYLONGTEXTLONGTEXTWITHPUBLICKEY
LONGTEXTLONGTEXTWITHPUBLICKEYLONGTEXTLONGTEXTWITHPUBLICKEY
...
LONGTEXTLONGTEXTWITHPUBLICKEYLONGTEXTLONGTEXTWITHPUBLICKEY
LONGTEXTLONGTEXTWITHPUBLICKEYLONGTEXTLONGTEXTWITHPUBLICKEY
LONGTEXTLONGTEXTWITHPUBLICKEYLONGTEXTLONGTEXTWITHPUBLICKEY
이 두 가지 문제는 어떻게 해결될 수 있을까요?
답변1
서명된 이메일에 일반 텍스트 헤더를 추가하지 않으려면 -text
sign.sh 스크립트의 openssl 명령에서 옵션을 제거하세요. 명시된 바와 같이여기
-텍스트
this option adds plain text (text/plain) MIME headers to the supplied message if encrypting or signing. If decrypting or verifying it strips off text headers: if the decrypted or verified message is not of MIME type text/plain then an error occurs.
보내는 이메일에만 서명하려면 제출 포트(587) 또는 smtps(465)를 활성화 하고 해당 포트로만 master.cf
이동하는 것이 좋습니다.-o content_filter=meinfilter:dummy
#submission
submission inet n - n - - smtpd
-o content_filter=meinfilter:dummy
이는 일반적으로 TLS 및 인증과 관련된 해당 포트에 제출된 메일만 스크립트에 의해 서명된다는 의미입니다. 인증된 TLS 암호화 연결만 서버를 통해 릴레이되도록 허용할 수도 있습니다.