簡體   English   中英

使用 bash 發送 S/MIME 加密的 html 電子郵件

[英]Send S/MIME encrypted html email with bash

如何通過命令行發送加密html 格式的電子郵件?
這是我到目前為止的代碼:

# Encrypt email with a certificate
openssl cms -encrypt -in "/tmp/email_to_be_sent.html" -out "/tmp/encrypted.txt" -from $SENDER -to $RECEIVER -subject "Test: Encrypted message" -des3 "/tmp/$CERT.pem" 
# Send the encrypted email
cat "/tmp/encrypted.txt" | sendmail -f $SENDER $RECEIVER

生成的加密郵件/tmp/encrypted.txt如下

To: recipient@mail.com
From: sender@mail.com
Subject: Test: Encrypted message
MIME-Version: 1.0
Content-Disposition: attachment; filename="smime.p7m"
Content-Type: application/pkcs7-mime; smime-type=enveloped-data;name="smime.p7m"
Content-Transfer-Encoding: base64

MIIDjAYJKoZIhvcNAQcDoIIDfTCCA3kCAQAxggFZMIIBVQIBADA9MDcxHDAaBgNVBAoME0V1cm9wZWFu
AxAlApQsmjzCwQoonT57JetCp7DHJdHWU1bkLIZWPPBRwa2EB0ZdxOXIvtg7rJavnnbxeTghblM45Pur
A+6BDKJbWvXFyxb...

問題是,一旦進入收件人收件箱並解密,郵件就不是 html 格式,並且<html><body></body></html>之類的 html 代碼在郵件中仍然可讀。

S/MIME 要求對原始郵件進行封裝 這意味着原始消息是加密的,並且這個事實和加密類型被添加到外部消息頭中,因此客戶端知道如何處理消息內容。

因此,定義原始郵件格式的郵件標頭需要位於 S/MIME 信封內,以便客戶端在解密郵件后知道它是哪種內容類型。

正確的方法是從原始郵件中提取這些標題,然后將它們添加到原始郵件正文之前。 請注意,這些標頭必須從第一行開始,並且在這些標頭之后,在原始郵件正文開始之前需要一個空行。

應該移動到封裝的消息數據中的標頭是

  • MIME 版本(可選)
  • 內容類型
  • 內容傳輸編碼
  • 內容處置(如果存在)

“移動”意味着它們應該包含在封裝的消息數據中從外部消息頭中刪除。

其余標頭應留在信封郵件中。 然后openssl cms -encrypt命令將根據 S/MIME 加密消息的需要添加上述標頭。

例子

原始信息

From: someone@somedomain.net
To: receipient@otherdomain.net
Subject: It's a test
MIME-Version: 1.0
Content-Type: text/plain;
    charset=UTF-8
Content-Transfer-Encoding: 7bit
X-Custom-Header: Additional data

This is the message text.

Good night.

加密前移動標頭(注意額外的空行)

From: someone@somedomain.net
To: receipient@otherdomain.net
Subject: It's a test
X-Custom-Header: Additional data

MIME-Version: 1.0
Content-Type: text/plain;
    charset=UTF-8
Content-Transfer-Encoding: 7bit

This is the message text.

Good night.

加密后的消息

From: someone@somedomain.net
To: receipient@otherdomain.net
Subject: It's a test
X-Custom-Header: Additional data
MIME-Version: 1.0
Content-Disposition: attachment; filename="smime.p7m"
Content-Type: application/pkcs7-mime; smime-type=enveloped-data; name="smime.p7m"
Content-Transfer-Encoding: base64

MIJ5lAYJKoZIhvcNAQcDoIJ5hTCCeYECAQAxggHZMIIB1QIBADCBvDCBtjEaMBgG
A1UEAwwRc2F2aWduYW5vIENFUlQtaTIxJTAjBgNVBAoMHHNhdmlnbmFubyBzb2Z0
d2FyZSBzb2x1dGlvbnMxHjAcBgNVBAsMFUNlcnRpZmljYXRpb24gU2VydmljZTEL
(more encrypted data removed)

所以 Stefan 的評論讓我找到了解決方案。 未加密的電子郵件/tmp/email_to_be_sent.html在加密之前應該有一個像這樣的標題:

To: recipient@mail.com
From: sender@mail.com
Subject: Test: Encrypted message
MIME-Version: 1.0
Content-Type: text/html; charset=utf-8

<html><body><p> test message </p></body></html>

請注意,電子郵件標頭和 html 代碼之間需要一個換行符。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM