1

对于学校作业,我们必须发送来自银行的安全电子邮件(我们就是银行)。为了保护这些电子邮件,我使用 PHPMailer。PHPMailer 包含一个 Sign($cert_filename, $key_filename, $key_pass) 方法,该方法使用证书对电子邮件进行签名。我猜这会使电子邮件“安全”,并且客户可以真正知道是银行发送电子邮件。我正在使用 SMTP 通过我自己的域发送电子邮件。

为了获得证书,我在这个网站上创建了一个证书,安装在我的浏览器中。

现在的问题是:如何使用该证书来签署我使用 PHP 脚本和 PHPMailer 发送的电子邮件?我已经从我的浏览器 (FF) 中导出了证书,这会生成一个 .p12 文件,但我认为 .p12 文件不是我想要的。

任何帮助,将不胜感激。

4

2 回答 2

3

在您的 class.phpmailer.php 文件中更改数据:

public   $sign_cert_file = ’’; 
public   $sign_key_file  = ’’; 
public   $sign_key_pass  = ’’; 

比找到出现的:

if (@openssl_pkcs7_sign($file, $signed, "file://".$this->sign_cert_file, array("file://".$this->sign_key_file, $this->sign_key_pass), null)) {

并更改为:

if (@openssl_pkcs7_sign($file, $signed, file_get_contents($this->sign_cert_file), array(file_get_contents($this->sign_key_file), $this->sign_key_pass), null)){

这意味着您通过对象 $this->sign_key_file 而不是文件包含 file://

比更改您的临时名称:

$file = tempnam(’’, ’mail’);
...
$signed = tempnam("", "signed");

到:

$file = tempnam(’./tmp/’, ’mail’);
...
$signed = tempnam("./tmp/", "signed");

这意味着您正在使用 tmp 目录服务器。

现在如何显示发送和放置数据证书文件的示例:

require("class.phpmailer.php");
$mail = new PHPMailer();
$mail->IsMail();

$mail->AddAddress("email@example.com");
$mail->Subject = "Test 1";
$mail->Body = "Test 1 of PHPMailer.";

// CUSTOMISED SIGN EMAIL : START
$mail->sign_cert_file="/xxx/key.pem";
$mail->sign_key_file="/xxx/key.pem";
$mail->sign_key_pass="yyy";
// CUSTOMISED SIGN EMAIL : END

$mail->Send(); // Send encrypted email!
于 2012-10-14T21:21:37.277 回答
1

您现在可以使用以下sign()功能添加签名证书:

require_once 'PHPMailerAutoload.php';
$mail = new PHPMailer();
$mail->AddAddress("email@example.com");
$mail->Subject = "Test";
$mail->Body = "Test";

$mail->sign(
    'cert.crt',
    'cert.key',
    'password',//required even if empty
    'certchain.pem'
);

if( !$mail->Send() ){
    echo $mail->ErrorInfo;
}

https://github.com/PHPMailer/PHPMailer/blob/master/examples/smime_signed_mail.phps#L77

于 2019-06-07T18:29:12.143 回答