使用PHP发送签名的电子邮件

时间:2011-11-25 12:27:13

标签: php email openssl phpmailer sign

我希望能够发送签名的电子邮件,以便用户的电子邮件客户端显示可信的邮件(例如,在Thunderbird中,有时此类电子邮件标有封闭的信封图标)。

我找到了一个PHPMailer库,它应该发送签名的电子邮件,但我认为它只包含了openssl_pkcs7_sign PHP函数。我不知道是什么以及如何获取和使用作为函数参数的密钥和证书。有参数:$ signcert和$ privkey。根据我的理解,$ signcert应该是公开的证书,用于验证消息是否已正确签名。 $ privkey与证书相结合,应保密,用于签署电子邮件。到目前为止我是否正确?

我的问题是如何获得适当的证书。我认为OpenSSL允许我生成自己的证书,但这些证书是否足以满足我的需求?如果是,我该如何正确生成它们?我的意思是可能有不同长度的证书和其他选项可能很重要,我不知道。顺便说一句,我注意到“https”自签名证书会在浏览器中引发警告。邮件也一样吗?在那种情况下,我可能应该从可靠的证书中心购买证书。你能给我一个我应该考虑的中心建议吗?

2 个答案:

答案 0 :(得分:2)

  

我认为OpenSSL允许我生成自己的证书,但这些证书是否足以满足我的需求?

我们不知道您的需求是什么。

证书本身对于签名消息毫无用处。该值出现在证书本身(可验证)由发件人和转发者都可接受的第三方进行身份验证的地方。第三方是证书颁发机构(例如Thawte,Verisign等),尽管在组织内部提供您自己的CA可能就足够了。 OpenSSL文档详细说明了如何创建自己的CA证书,您可以使用它来签署其他证书。

在你能够实现任何代码之前,你已经有了很长的学习历程 - 你可能比开始使用openssl howto和x509 cerificates how更糟糕。

答案 1 :(得分:1)

这里[1]暗示用于签署电子邮件的证书必须由证书颁发机构颁发(因此电子邮件客户端不会发出任何警告)。可以在此处找到颁发免费证书的一些单位的名单:[2]。我选择的那个通过将证书直接安装到Web浏览器来提供证书。所以要做更多的事情,它应该被导出。流行格式为* .p12,可以存储公钥和私钥。但似乎使用PHP函数openssl_pkcs7_sign()并使用两个证书指向它的文件的参数不起作用 - OpenSSL返回错误的error:0906D06C:PEM routines:PEM_read_bio:no start line。分离密钥后(使用OpenSSL)签名工作正常。

顺便说一下,即使PHPMailer应该能够唱电子邮件,它的当前版本也不起作用。邮件正在签名,存储在临时文件中,文件被删除,然后文件内容被发送(因此邮件为空)。

[1] - http://kb.mozillazine.org/Message_security

[2] - http://kb.mozillazine.org/Getting_an_SMIME_certificate