当前位置: 首页 > 知识库问答 >
问题:

如何使用OPENSSL签署电子邮件消息并将其卷曲发送?

荀豪
2023-03-14

我想知道如何用电子邮件数字证书签名,然后使用CURL发送这个签名的电子邮件消息。

下面是一个简单的文本/普通电子邮件的例子,我想签署。

Content-Type: text/plain; charset="utf-8"
Content-Transfer-Encoding: 7bit
MIME-Version: 1.0 (Created with SublimeText 3)
Date: Fri, 01 Jan 2021 23:59:59 -0700
Message-ID: <aade2ef2-960f-4e0d-94e4-d100f5270d28@initech.com>
Subject: TPS Report #1001
From: "Michael @ Initech" <michael@initech.com>
To: "Peter @ Initech" <peter@initech.com>
User-Agent: CURL/7.75.0

Good morning.

This is a message in plain text format.

It contains no inline images or attachments.

Each line is no more than 76 characters in length.

Please reach out if you have any questions.


Thank you,

Michael Bolton
SENIOR DEVELOPER
michael@initech.com
P | 801.555.1234

我将整个消息放在一个名为singlepart--text-plain.eml文件中,然后使用CURL发送它。

curl --verbose -ssl smtps://secure.email.com:465 --login-options AUTH=PLAIN --user michael@initech.com:Letmein --mail-from michael@initech.com --mail-rcpt peter@initech.com --mail-rcpt-allowfails --upload-file singlepart--text-plain.eml

砰。仅此而已。

下面的链接描述了如何使用OpenSSL对mime消息进行签名。

https://www.misterpki.com/openSSL-smime/

openssl smime -sign -in singlepart--text-plain.eml -text -out signed-singlepart--text-plain.eml -signer michael-digital-signature.pem

RFC8551第3.5、3.5.1和3.5.2节展示了关于如何构造消息结构的有限示例,我的问题是如何正确地这样做。

https://tools.ietf.org/html/RFC8551#Section-3.5

我不知道的是,我在签什么?全部内容?只是消息的字面正文?这应该是一个包含文本主体未改变和作为base64附件的数字签名的多部分消息吗?

或者它应该像text/plain一样在单个部分中包含修改/签名的文本吗?

如您所知,RFC文档不适合胆小的人。

共有1个答案

贺文彬
2023-03-14

仅对邮件正文进行签名。这就是标题后面的空行之后的所有内容。

由于邮件服务器和邮件客户端可以在发送到收件人的途中更改邮件头(修改现有的邮件头或添加新的邮件头),因此无法包括邮件头。

但是,有一些方法可以通过将一些重要的标题(如tosubject)复制到正文中来包含它们,但是它们还没有得到广泛的支持。

OpenSSL SMIME知道如何正确处理S/MIME消息,因此它的输入是完整的消息(在您的示例中是singlepart--text-plain.eml)。

以下是我从http://openssl.cs.utah.edu/docs/apps/smime.html页面复制的一系列有用的OpenSSL smime示例,遗憾的是,这些示例似乎不见了:

创建明文签名消息:

openssl smime -sign -in message.txt -text -out mail.msg \
    -signer mycert.pem

创建不透明签名邮件:

openssl smime -sign -in message.txt -text -out mail.msg -nodetach \
    -signer mycert.pem

创建一个签名消息,包括一些附加证书,并从另一个文件中读取私钥:

openssl smime -sign -in in.txt -text -out mail.msg \
    -signer mycert.pem -inkey mykey.pem -certfile mycerts.pem

创建具有两个签名者的签名邮件:

openssl smime -sign -in message.txt -text -out mail.msg \
    -signer mycert.pem -signer othercert.pem

将Unix下签名的消息直接发送到sendmail,包括标头:

openssl smime -sign -in in.txt -text -signer mycert.pem \
    -from steve@openssl.org -to someone@somewhere \
    -subject "Signed message" | sendmail someone@somewhere

验证消息,如果成功,则提取签名者的证书:

openssl smime -verify -in mail.msg -signer user.pem -out signedtext.txt

使用三重DES发送加密邮件:

openssl smime -encrypt -in in.txt -from steve@openssl.org \
    -to someone@somewhere -subject "Encrypted message" \
    -des3 user.pem -out mail.msg

对邮件进行签名和加密:

openssl smime -sign -in ml.txt -signer my.pem -text \
    | openssl smime -encrypt -out mail.msg \
    -from steve@openssl.org -to someone@somewhere \
    -subject "Signed and Encrypted message" -des3 user.pem

注意:encryption命令不包括-text选项,因为正在加密的消息已经具有MIME头。

解密邮件:

openssl smime -decrypt -in mail.msg -recip mycert.pem -inkey key.pem
-----BEGIN PKCS7-----
-----END PKCS7-----
 openssl smime -verify -inform PEM -in signature.pem -content content.txt
openssl smime -verify -inform DER -in signature.der -content content.txt

使用128位Camellia创建加密消息:

openssl smime -encrypt -in plain.txt -camellia128 -out mail.msg cert.pem

向现有邮件添加签名者:

 openssl smime -resign -in mail.msg -signer newsign.pem -out mail2.msg
 类似资料:
  • 问题内容: 我在网站上使用PHP,并且想添加电子邮件功能。 我已经安装了WAMPSERVER。 如何使用PHP发送电子邮件? 问题答案: 使用PHP的功能是可能的。请记住,邮件功能在本地服务器上不起作用。

  • 问题内容: 我目前正在使用从服务器获取电子邮件并处理内容和附件的方法。 我想以状态/错误消息回复这些消息,并链接到我的网站上生成的结果内容(如果可以处理)。这应包括原始消息,但应删除所有附件(附件很大),最好仅用其文件名/大小替换它们。 由于我已经遍历了MIME消息部分,因此我假设需要做的是构建一个包含原始消息副本的新MIME消息树,并删除/替换附件节点。 在我走这条路之前,我希望有人能给我一些提

  • 我正在使用Laravel 7,我想使用sendemail驱动程序和Laravel Mail Facade发送电子邮件,因为当我使用php邮件功能时,它可以工作,但我想使用Laravel Mail Facade。 这是我的. env文件电子邮件配置 这是我在config/mail中的默认邮件。php 什么是正确的配置?如何使其工作?

  • 问题内容: 香港专业教育学院一直从Java发送最简单的电子邮件没有问题,但我现在正尝试发送html如下: 但是,当我在客户端收到它时,它以纯文本电子邮件的形式接收,即它显示所有html标记,而不是用于格式化,并且我已经检查了电子邮件标题,并说 在邮件标题中 但是为什么因为我将“ text / html”传递给setContent()方法,那似乎是您唯一要做的事情。 问题答案: 您可以尝试以下方法:

  • 我是Laravel的新手,正在尝试修复电子邮件验证消息。场景是: > 如果我发送空值,验证器会返回一个响应“需要用户电子邮件字段”。 如果我发送一个无效的值,如“my_email_id”[不带@符号],它仍然返回“用户电子邮件字段是必需的”。 如果我发送空值,如“my\u email”_id@domain,它仍然返回“用户电子邮件必须是有效的电子邮件地址。”。 现在,我的问题是如何返回回答“用户电

  • 我有一个活动,它有两个文本字段,用户可以在其中输入一些文本。 在它们下面有一个按钮,我想将输入的信息提交到两个文本字段。可以是电子邮件或消息。 是否有一种方法可以让活动基本上向我提交用户信息?