S/MIME 加密邮件使用效果测试

S/MIME 单签名效果

image-20201013220718322

S/MIME 单加密效果

image-20201013220641404

S/MIME 签名&加密效果

image-20201013210818040

Outlook 设置(Microsoft-MacOutlook/16.39.20071300)

位置:偏好设置 -》账户 -》高级… -》安全性

image-20201013210218871

发现几个有意思的地方:

  1. 签名证书和加密证书可以单独配置

这样加密证书可以指定一个私有CA签发的证书,签名证书使用国际可信的证书。

当配置这种组合来给另外一方发送签名邮件,对方给我回复加密邮件会使用我指的加密证书,而不是用我的签名证书。

  1. 封装格式的不同

签名邮件【启用】以明文方式发送带有数字签名的邮件

Content-type: multipart/signed;
	protocol="application/pkcs7-signature";
	micalg=sha256;
	boundary="B_3685446578_974091680"
MIME-Version: 1.0

签名邮件【不启用】以明文方式发送带有数字签名的邮件

Content-Type: application/pkcs7-mime; smime-type=signed-data; name="smime.p7m"
Content-Disposition: attachment; filename="smime.p7m"
Content-Transfer-Encoding: base64
MIME-Version: 1.0
  1. 发出的加密邮件一般用自己的公钥和对方(接受者)的公钥同时加密加密密钥(例如 aes-256-cbc 的对称密钥)

    下面是我用自己的邮箱给自己发的加密邮件,Outlook傻傻的也用同样的公钥加密了两次。

    image-20201013224107235

  2. Outlook 是用Enveloped-data来做签名和加密的数字信封,而不是 SignedAndEnvelopedData

    它用的是 Enveloped-data(1.2.840.113549.1.7.3),导致想不用私钥解开邮件证书是没发看到签名者的,如果用 SignedAndEnvelopedData(1.2.840.113549.1.7.4),就和单签名S/MIME的SignedData (1.2.840.113549.1.7.2) 一样,可以在不解密的情况下做到验证和识别签名者证书信息。三者的数据结构如下:

1.2.840.113549.1.7.2

SignedData ::= SEQUENCE {
   version Version,
   digestAlgorithms DigestAlgorithmIdentifiers,
   contentInfo ContentInfo,
   certificates
      [0] IMPLICIT ExtendedCertificatesAndCertificates
        OPTIONAL,
   crls
     [1] IMPLICIT CertificateRevocationLists OPTIONAL,
   signerInfos SignerInfos }

1.2.840.113549.1.7.3

 EnvelopedData ::= SEQUENCE {
      version Version,
      recipientInfos RecipientInfos,
      encryptedContentInfo EncryptedContentInfo }

1.2.840.113549.1.7.4

   SignedAndEnvelopedData ::= SEQUENCE {
       version Version,
       recipientInfos RecipientInfos,
       digestAlgorithms DigestAlgorithmIdentifiers,
       encryptedContentInfo EncryptedContentInfo,
       certificates
          [0] IMPLICIT ExtendedCertificatesAndCertificates
            OPTIONAL,
       crls
         [1] IMPLICIT CertificateRevocationLists OPTIONAL,
       signerInfos SignerInfos }

参考:

https://tools.ietf.org/html/rfc2315