PostFix权威指南 目录

文章目录

  • 适用人群
  • 前言
  • 1. 简介
    • Internet E-mail传递流程
  • 2.基础概念
    • 在线说明书
    • 模拟SMTP对话
      • 常见响应状态码
  • 4.基本的配置与管理
    • 默认安装目录
    • 启动postfix
      • 两件准备工作
    • 配置文件
      • 重新加载
      • 配置变量
        • 对外统一邮箱
          • 创建查询数据库
          • 数据库格式
        • 别名文件
        • 重要考虑事项
        • 转发控制
        • 限制转发访问
        • SMTP身份验证
        • 管理
        • 日志记录
        • 启动、关闭和重新加载
          • 开机时自动启动postfix
            • Sys V风格的启动脚本
        • master.cf
        • 更改daemon端口
        • 收信限制
        • 地址自动补齐
        • 伪装网关主机名称
        • 改变投递地址
        • 不明用户
  • 5.队列管理
    • qmgr运行
    • 等待邮件
    • 队列调度
    • 错误通知函
    • 显示队列邮件列表
    • 重新排队
    • 显示邮件内容
    • 清空邮件
    • E-mail 与 DNS
      • 决定邮件路由
        • 推荐DNS资源
      • Postfix and DNS
        • 配置文件选项
      • 常见问题
  • 7.本地投递与POP/IMAP
    • Postfix 投递代理程序
    • 邮箱内容
      • 转发forward文件
    • Postfix and Cyrus IMAP
  • 8.虚拟网域
    • 虚拟网域的四种处理方式
      • shared domain and system user
      • 自动回信脚本
      • 自动回信程序的设计
        • 需要考虑
        • 假设
  • 9.邮件转发
    • 入站邮件网关
  • 11.反垃圾邮件
    • 挡信机制
      • 客户端判别规则
      • 设置限制条件
      • UBE限制条件
      • 反垃圾邮件的main.cf配置文件样本
  • 12.SASL身份验证
    • 验证架构
    • SASL专用密码
    • 启用SASL验证
      • 避免寄件人冒名
      • 核准授权用户
      • 设定验证机制
    • 设定sasl步骤
      • 测试SASL
        • 链接测试
        • 找不到db文件
  • 13.TLS
    • TLS证书
      • 自己开设认证中心
        • 服务端证书
      • 产生服务器端证书
        • 步骤
          • 第三方CA:
          • 自己做CA:
      • 安装CA证书
        • 安装方法
      • 设定Postfix/TLS
      • 设定过程整理
      • TLS/SMTP client
        • 设定客户端证书验证
        • TLS/SMTP client的服务器设定

适用人群

  • Postfix为Unix系统设计的网络应用系统
  • 如果不习惯Unix,推荐书 《Unix System Administration Handbook》(Prentice-Hall)

前言

  • 1-3章,Postfix与Email基础
  • 4-7章,Postfix Server基本功能
  • 8-15章,各特殊应用

1. 简介

Internet E-mail传递流程

2.基础概念

在线说明书

  • man mailq

模拟SMTP对话

telnet mail.example.com 25
HELO mail.example.com
MAIL from: info@example.com
rcpt to: destmail
data
xxx
.
quit

常见响应状态码

  • 2xx:完成
  • 3xx:信息不足
  • 4xx:暂时失败
  • 5xx:永久性失败

4.基本的配置与管理

默认安装目录

/etc/postfix/
- 配置文件与查询表
/usr/libexec/postfix/
- postfix的各个服务器程序
/var/spool/postfix/
- 队列文件
/usr/sbin/
- Postfix工具程序
/var/log/maillog
- 邮件日志

启动postfix

两件准备工作

  • 修改houstname
    postconf -e myhostname-mail.example.com
  • 确定db别名
    newaliases
  • 启动: postfix start

配置文件

/etc/postfix
- master.cf
- main.cf

  • 这两个拥有者必须是root

重新加载

postfix reload

  • 只要修改,就需要重新加载
    (restart) postfix
  • 重新启动

配置变量

mydomain = example.com
myorigin = $mydomain
  • 如果像放入到其他文件里:
mydest = /etc/postfix/destination

对外统一邮箱

  • main.cf中的canonical_maps参数指向外界的文件
canonical_maps = hash:/etc/postfix/canonical_maps
# canonical查询表
# 格式
# key   value
fwx@example.com    kyle.dent@example.com
  • 对外输出value
  • 每个key必须是独一无二的
创建查询数据库

postmap /etc/postfix/canonical

  • 每次修改都必须用postmap来重建数据库文件
  • postmap -q指定要查询的LHS
    postmap -q fwx@example.com /etc/postfix/canonical
数据库格式
  • btree
  • dbm
  • hash
  • 默认数据库类型:postconf default_database_type

别名文件

  • 多组邮件列表有各自的别名文件
  • alias_maps = hash:/etc/aliases, nis:mail.aliases

重要考虑事项

  • MTA标识

    • myhostname
    • mydomain
    • myorigin
    • mydestination

转发控制

  • 11章

限制转发访问

  • mynetworks_style
  • mynetworks
    以上两个决定客户端具备的寄出邮件资格
  • 默认仅容许IP子网相同的转发
  • 服务器自己使用转发服务mynetworks_style设置为host或者是class
  • mynetworks指出主机享受转发服务,常用network/mask- 192.168.0.0/28

SMTP身份验证

服务对象没有固定ip时,使用此机制

  • SASL验证, 12章
  • 验证后,批准客户端转发服务一段时间

管理

  • 检查postfix配置是否存在问题等postfix check

日志记录

  • /etc/syslog.conf决定日志写在哪
  • 查看曾经出现的问题egrep '(reject|warning|error|fatal|panic):' /var/log/maillog
  • 查询非法攻击mail服务器的ip:
#!/bin/bash
#
#       获取非法攻击mail服务器的ip
#LOGFILE="/var/log/maillog"# 统计maillog中authentication failure的IP个数和IP
grep "authentication failure" $LOGFILE | awk '{print $7}' | grep -E -o "[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+" | sort | uniq -c > af_iplist.txt# 取出AF出现大于50次的IP
awk '$1 > 50 {print $2}' af_iplist.txt > block_ip_list.txt# 大于50次AF的IP添加到iptables中
cat block_ip_list.txt | while read line
do/sbin/iptables -nL | grep $lineif [ $? != 0 ]theniptables -I INPUT -s $line -j DROPfi
done

启动、关闭和重新加载

  • 启动:postfix start
  • 重新加载:postfix reload
  • 关闭:postfix stop
开机时自动启动postfix
  • sendmail-bd -q15m
  • queue_run_delayin main.cf,扫描队列的间隔时间
Sys V风格的启动脚本
#!/sbin/sh
#
#   使用自己的logger和postfix命令
# for linux
#   Logger = "/sbin/syslogd"
#   POSTFIX = "/usr/sbin/postfix"
#
LOGGER="/usr/bin/logger"
POSTFIX="/usr/sbin/postfix"
rc=0if [ ! -f $POSTFIX ]; then$LOGGER -t $0 -s -p mail.err "Unable to locate Postfix"exit 1
fiif [ ! -f /etc/postfix/main.cf ]; then$LOGGER -t $0 -s -p mail.err "Unable to locate Postfix configuration"exit 1
ficase "$1" instart)echo -n "Starting Postfix"$POSTFIX startrc=$?echo ".";;stop)echo -n "Stopping Postfix"$POSTFIX stoprc=$?echo ".";;restart)echo -n "Restarting Postfix"$POSTFIX reloadrc=$?echo ".";;*)echo "Usage: $0 {start|stop|restart}"rc=1
esac
exit $rc

master.cf

所有服务器程序的运行参数,都在此配置

更改daemon端口

/etc/services定义smtp端口

  • 如果要修改端口,直接在smtp后修改端口
  • 可以设置smtp2,但要注释smtp

收信限制

  • main.cf
  • smtpd daemon对邮件加强限制
  • 限制:邮件大小,同一封邮件的收件人数,内容长度上限等等
    • smtpd_recipient_limit收件人数
    • message_size_limit容量上限
  • 如果客户端频繁出错,通常是被攻击,设置延迟时间smtpd_error_sleep_time
  • smtpd_soft_error_limit,累积到错的地方,错一次延迟增加的时间
  • smtpd_hard_error_limit,错误次数超过次数,自动断开
smtpd_error_sleep_time = 1s
smtpd_soft_error_limit = 10
smtpd_hard_error_limit = 20

地址自动补齐

  • 避免自动附加邮件地址
  • append_at_myorigin = no
  • append_dot_mydomain = no

伪装网关主机名称

  • masquerade_domains = example.com
  • 排除特定的账户: masquerade_exceptions = admin, root

改变投递地址

  • 不愿意代收邮件的时候,查询表定义的新旧地址对应关系
  • relocated_maps = hash:/etc/postfix/relocated
kdent@ora.com xx@moxii.com
# 全域移动
@example.com   xx@moxixii.com
  • 当收到kdent的信时,都会拒收,并提醒送到xx

不明用户

  • 默认拒收写给不明用户的信
  • 收信:local_recipient_maps =,设置为空,接收不明用户
  • 集中到特定邮箱:luser_relay = catchall, catchall时一个实际的用户

5.队列管理

  • 队列管理单元的服务程序:qmgr
  • 默认队列目录:/var/spool/postfix
    • incoming
    • active
    • deferred
    • corrupt
    • hold

qmgr运行

  • 队列占用空间: queue_minfree

等待邮件

  • 退信: bounce_size_limit

队列调度

  • 失败延迟时间上限:maximal_queue_lifetime
  • 队列扫描间隔:queue_run_delay
  • 重新投递:minimal_backoff_time, maximal_backoff_time

错误通知函

  • main.cf
  • 错误通知类型:notify_classes

显示队列邮件列表

  • 列出队列里的所有邮件:postqueue -p
  • 删除队列邮件: postsuper -d ALL

重新排队

  • postsuper -r ALL

显示邮件内容

  • postcat -q queueId

清空邮件

  • 清空队列里的邮件:postqueue -f

E-mail 与 DNS

DNS是一个世界级的分布式数据库,主要是将“主机名称”和“IP地址”对应

  • 每个网域至少要有两部权威域名服务器
  • 网域数据关于邮件系统的四种资源记录:
    • A:主机名称和ip地址的对应关系
    • CNAME:没有对应ip地址,是一个主机名称的别名
    • MX:邮件的路由信息
    • PTR:ip地址和主机名称的关系,作用与A相反,常用来验证客户端是否可信
  • 只讨论MX资源记录:
    example.com IN MX 10 mail1.example.com
    结构说明:
  • 网域名称
  • IN:资源都在Internet上
  • MX:邮件交换器的资源记录
  • 10:优先值(0~65536)
  • mail1.example.com:主机名称

决定邮件路由

存在多个时,MX会被当作主要的邮件服务器进行投递

推荐DNS资源

  • 软件:BIND
  • 书籍:《DNS & BIND》

Postfix and DNS

  • Postfix从DNS里查出所有MX资源记录,然后根据优先值来排序

配置文件选项

  • smtp_skip_4xx_greeting = no: 寄信出现4xx状态码,放在等待队列,下次投递
  • smtp_skip_5xx_greeting = no: 直接将邮件退回给原寄件人

常见问题

  • DNS设定不当的问题,只能在日志文件里看到结果
  • 常见DNS有关的配置文件
    • /etc/resolv.conf
    • /etc/hosts
    • /etc/nsswitch

7.本地投递与POP/IMAP

  • 取走邮件的协议是IMAP/POP
  • Postfix将收下的邮件放入邮箱
  • POP/IMAP是Postfix之外的软件提供
    • POP/IMAP服务器软件:Popper, WU IMAP Kit等
    • Postfix 与 Cyrus IMAP server

Postfix 投递代理程序

  • 三种网域邮件:local, relay, virtual

邮箱内容

  • POP/IMAP读取邮件时:
  • postconf -l查看系统提供了哪些锁定机制
  • man flock查看锁定机制的详细信息

转发forward文件

  • 用来依据其设定内容来转寄邮件
  • 文件而已让用户设置自己的别名,格式与RHS-value格式一样

Postfix and Cyrus IMAP

  • 验证用户的身份
  1. 安装Cyrus SASL函数库
  2. 建构Cyrus IMAP server

不能将所有邮件都交付给Cyrus IMAP server:

  • 选择mailbox_transport指向lmtp MDA,并确定master.cf里的lmtp服务能否传递
  • Cyrus配置文件/etc/cyrus.conf

8.虚拟网域

  • 同一台主机搭建多个网域。
  • 例如:xxnet.comorr.com
  • 共享网域,独立网域;
  • 系统用户,虚拟用户

虚拟网域的四种处理方式

  • 共享网域搭配系统账户
  • 独立网域搭配系统账户
  • 独立网域搭配虚拟账户
  • 虚拟网域搭配飞Postfix控制管理的特殊格式邮箱

shared domain and system user

  • 每位用户都可以收到每个网域的邮件
  • 一个邮箱有多个地址
  1. 设定虚拟网域的DNS,MX指向此服务器
  2. 修改mydestination
# 正式网域
mydomain = xxx.com
# 虚拟网域
mydestination = $myhostname, $mydomain, ora.com, xxxy.com
  • 重新启动postfix reload

自动回信脚本

#!/usr/bin/perl -w
#
#   inforeply.pl    - Automatic E-mail reply.
#
# 所有信息都记录在邮件日志文件(/var/log/maillog)
# 运行本程序后,可以从日志文件看到结果
#
# 使用本程序之前,你可能需要调整某些变量的值,
# 以下是各项重要的变量的说明:
#
# $UID是本程序的运行标识
# 正确值应该是master.cf中调用本程序的那一行,
#   其user=属性所设的UID
#   如果想在命令行测试本程序,则$UID就是你的UID
#
# $ENV_FROM是回信信封上的FROM地址
# 默认是空白,<>表示使用空地址
# 可以将它设定为一个专用来接退信的地址
#   注意:不要使用触发本程序的那个地址,
#   否则会造成邮件循环
#
# $INFOFILE是含有回信内容的文本文件
#   此文件应该包含完整的回信
#       包括Subject:与From:等必要的标题
#   唯一例外的是To:字段,本程序使用来信这的地址来自动设定此栏
#   注意:标题和正文之间至少药隔一空白行
#
#   $MAILBIN是sendmail程序文件的完整路径
#   如果你的sendmail不是安装在/usr/sbin/sendmail
#   如实修改
#
#   @MAILOPTS是一个包含sendmail命令行选项的数组
#
#   本程序调用了syslog,所以Perl环境必须先安装Sys::Syslog模块
## Sys::Syslog模块的setlogsock
require 5.004;
use strict;
use Sys::Syslog qw(:DEFAULT setlogsock);#
# 配置变量。
#
my $UID = 500;
my $ENV_FROM = "";
my $INFOFILE = "/etc/postfix/common/inforeply.txt";
my $MAILBIN = "/usr/sbin/sendmail";
my @MAILOPTS = ("-oi", "-tr", "$ENV_FROM");
my $SELF = "inforeply.pl";#
#   main
#
my $EX_TEMPFAIL = 75;
my $EX_UNAVAILABLE = 69;
my $EX_OK = 0;
my $sender;
my $euid = $>;$SIG{PIPE} = \&PipeHandler;
$ENV{PATH} = "/bin:/usr/bin:/sbin:/usr/sbin";setlogsock('unix');
openlog($SELF, 'ndelay,pid', 'user');#
# 检查环境
#
if ( $euid != $UID ) {syslog('mail|err', "error:invalid uid: $> (expecting: $UID)");exit($EX_TEMPFAIL);
}if ( @ARGV != 1 ) {syslog('mail|err', "error: invalid invocation (expecting 1 argument)");exit($EX_TEMPFAIL);
} else {$sender = $ARGV[0];if ( $sender =~ /([\w\-.%]+\@[\w.-]+)/ ) {$sender = $1;} else {syslog('mail|err', "error: Illegal sender address");exit($EX_UNAVAILABLE);}
}if ( ! -x $MAILBIN ) {syslog('mail|err', "error: $MAILBIN not found or not executable");exit($EX_TEMPFAIL);
}if( ! -f $INFOFILE ) {syslog('mail|err', "error: $INFOFILE not found");exit($EX_TEMPFAIL);
}#
#   检查异常寄件人
#
if ( $sender eq "" || $sender =~ /^owner-|-(request|pwner)\@|^(mailer-daemon|postmaster)\@/i )
{exit($EX_OK);
}#
#   检查来信标头里的Prededence字段
#
while ( <STDIN> ) {last if (/~$/);exit($EX_OK)    if(/^Precedence:\s+(bulk|list|junk)/i);
}#
#   开启邮件文件
#
if ( !open(INFO, "<$INFOFILE") ) {syslog('mail|err', "error: can't open $INFOFILE: %m");exit($EX_TEMPFAIL);
}#
#   将本程序的输出接到寄信程序的输入
#
my $pid = open(MAIL, "|-") || exec("$MAILBIN", @MAILOPTS);#
#   送出回信
#
print MAIL "To: $sender\n";
print MAIL while (<INFO>);if ( ! close(MAIL) ) {syslog('mail|err', "error: failure invoking $MAILBIN: %m");exit($EX_UNAVAILABLE);
}close(INFO);
syslog('mail|info', "sent reply to $sender");
exit($EX_OK);sub PipeHandler {syslog('mail|err', "error: broken pipe to mailer");
}

自动回信程序的设计

需要考虑

  • 程序的数据来源是网络,是不可信赖的数据源
  • 永远不要用shell处理不可信的外来数据
  • 回信前,检查寄件人的地址是否是owner-list或者list-request

假设

假设邮件服务器规范网域是:example.com,虚拟网域是:ora.com,客服请求信息提供的服务邮箱是info@ora.cominforeply.pl自动回复客户寄到info@ora.com的邮件,需要以下步骤:

  1. 创建可用inforeply.pl的虚账户,确定有足够的权限
  2. master.cf里,为inforeply.pl设置新的投递服务,名字改成inforeply
inforeply    unix    -   n   n   -   -   pipe    flags= user=autoresp argv=/usr/local/bin/inforeply.pl ${sender}
  • ${sender}代表寄件人地址
  • ${recipient}代表收件人地址
  1. 没有传输机制的话,main.cftransport_maps参数指向一个传输表
    transport_maps = hash:/etc/postfix/transport
  2. 传输表结构:收件地址 -> 投递服务
    autoresp@ora.com inforeply
  3. 使用postmap将传输表换成数据库格式postmap /etc/postfix/transport
  4. virtual_alias_maps指向虚拟别名查询表:
    virtual_alias_maps = hash:/etc/postfix/virtual_alias
  5. 虚拟别名表定义服务地址与收件地址:info@ora.com autoresp@ora.com, service@oreilly.com
  6. 虚拟别名转换成数据库:postmap /etc/postfix/virtual_alias
    所有送去info@ora.com的邮件都会被投递到autoresp@ora.comservice@oreilly.com
  7. 重新读取配置文件:postfix reload
    处理流程:
    外界的信 -> info@ora.com
    postfix:
  • 先检查virtual_alias
  • 展开地址
  • 查看transport,利用设定的reply执行投递
  • infoply使用pipe传送给外部,回信给原寄件人

9.邮件转发

入站邮件网关

网关的两个意义:

  1. 网络之间的联络
  2. 协议的转换

企业网络:
一家企业有多个部门,各部门有自己的子网域,有内部服务器。
网关系统:gw.example.com,负责手下所有的邮件。
人力资源:位于mail.example.com, 员工是user@hr.example.com
业务部门:位于mail2.example.com, 员工是user@sales.example.com

11.反垃圾邮件

目前Postfix没有表示垃圾邮件的机制,但可和Spamassassin搭配

挡信机制

  • 客户端判别规则
  • 语法检查参数
  • 内容检查
  • 自定义过滤规则

客户端判别规则

  • smtpd_client_restrictions
  • smtpd_helo_restrictions
  • smtpd_sender_restrictions
  • smtpd_recipient_restrictions
  • smtpd_data_restrictions

设置限制条件

smtpd_client_restrictions =
smtpd_helo_restrictions =
smtpd_sender_restrictions =
smtpd_recipient_restrictions = permit_mynetworks, reject_unauth_destination
  • 只允许寄给postfix所统辖局域网的用户

UBE限制条件

任何限制条件都可以用于任何过滤规则
例如:

  • check_helo_access适用于smtpd_helo_restrictions和smptd_sender_restrictions或者其他
  • postfix不会立刻返回拒收信,如果要立刻拒收,需要在main.cf里修改smtpd_delay_reject = no

反垃圾邮件的main.cf配置文件样本

#
#   本文件为postfix下的main.cf的配置文件的样本
#   功能:
#       反垃圾文件的配置
#
smtpd_restrictions_classes = spamloverspamhaterspamhater = reject_invalid_hostnamereject_non_fqdn_hostnamereject_unknown_sender_domainreject_rbl_client nospam.example.comspamlover = permitsmtpd_helo_required = yes
smtpd_client_restrictions = check_client_access hash:/etc/postfix/check_client_access
smtpd_helo_restrictions =reject_invalid_hostnamecheck_helo_access hash:/etc/postfix/check_helo_access
smtpd_sender_restrictions =reject_non_fqdn_senderreject_unknown_sender_domaincheck_sender_access hash:/etc/postfix/check_sender_access
smtpd_recipient_restrictions =permit_mynetworksreject_unauth_destinationreject_non_fqdn_recipientreject_unknown_recipient_domain
smtpd_data_restrictions = reject_unauth_pipelining
header_checks = /etc/postfix/header_checks
body_checks = /etc/postfix/body_checks

12.SASL身份验证

验证架构

Cyrus SASL提供配置文件是smtpd.conf,位于/usr/local/lib/sasl2/smtpd.conf

SASL专用密码

  • smtpd.conf配置文件:pwcheck_method: auxprop
  • auxprop要求使用外部的SASL密码文件
  • /etc/sasldb2密码文件
  • saslpasswd2 -c -u \postconf -h myhostname` username`
    -c:创建用户,-u:指出所属网域,值都取自postfix配置文件

启用SASL验证

smtpd_sasl_auth_enable = yes

避免寄件人冒名

建立对应关系查询表:
kdent@example.com kdent
进入main.cf文件中,修改:
smtpd_sender_login_maps = hash:/etc/postfix/sasl_senders

核准授权用户

smtpd_recipient_restrictions = permit_mynetworks, permit_sasl_authenticated, reject_unauth_destination

设定验证机制

smtpd_sasl_security_options = xx

  • noplaintext:不允许明文流经网络,但是不能使用saslauthd
  • noactive: 排除主动攻击
  • nodictionary:字典攻击
  • noanonymous: 排除匿名登录
  • mutual auth:双方验证协议

设定sasl步骤

  1. 确定验证机制和架构
  2. 安装SASL
  3. 重新安装Postfix
  4. 创建/etc/sasl2/smtpd.conf,将pwcheck_method参数设定为saslauthd
    • saslauthd: 使用SASL saslauthd与系统密码
    • auxprop: SASL的专属密码文件
  5. 如果验证架构是Unix系统密码,启动saslauthd daemon,指出系统验证方式。否则使用saslpasswd2在系统上创建SMTP client的账户和密码
  6. 进入main.cf,启动SASL验证功能
smtpd_sasl_auth_enable = yes
smtpd_recipient_restrictions = permit_mynetworks,permit_sasl_authenticated, reject_unauth destination
  1. 重新加载postfix

测试SASL

#!/usr/bin/perl
#
#   产生测试用的base64字符串
#   需要用到MIME::Base64模块,如果没有,去CPAN下载一个
#use strict;
use MIME::Base64;if ( $#ARGV != 1 ) {die "Usage: encode_sasl_plain.pl <username> <password>\n";
}print encode_base64("$ARGV[0]\0$ARGV[0]\0$ARGV[1]");
exit 0;
  • 运行程序perl encode_sasl_plain.pl user pwd

链接测试

telnet mail.example.com portEHLO mail.example.com
AUTH PLAIN base64string
mail from:xx@example.com
rcpt to:xxx@example.com
data
sss
.
quit

找不到db文件

确定saslpasswd2所产生的密码文件在/etc文件下

13.TLS

传输层安全协议TLS

TLS证书

  • yum install OpenSSL
  • openssl管理证书
  • OpenSSL默认在/usr/local/ssl/

自己开设认证中心

自己收信

服务端证书

自己签署证书:

  • OpenSSL安装目录下:misc/CA.pl -newca
  • ./demoCA开设CA所需的全部文件
  • 获取CA数字签名

产生服务器端证书

  1. openssl工具,产生一对公钥和私钥
  2. 产生一个证书签署请求,CSR
  3. CSR+公钥->CA签署
  4. 私钥保密

步骤

  • 产生公私钥
    openssl req -new -nodes -keyout mailkey.pem -out mailreq.pem -days 365
  • new: 产生公私+CSR
  • nodes:不加密
  • keyout: 私钥文件名
  • out: CSR文件名
  • days: 有效期
第三方CA:
  • 提出mailreq.pem来签署
自己做CA:

openssl ca -out mail_signed_cert.pem -infiles mailreq.pem

  • mail_signed_cert.pem就是CA核发的证书

证书位置:
Postfix目录下

  • cp /usr/local/ssl/mailkey.pem /etc/postfix
  • cp /usr/local/ssl/mail_signed_cert.pem /etc/postfix
    由于postfix不能使用密封的私钥文件,应该用严格权限
chown root /etc/postfix/mailkey.pem
chmod 400 /etc/postfix/mailkey.pem

安装CA证书

Postfix/TLS server 必须能够访问CA的公开证书

  • 如果服务端证书是自己签发给自己,将CA.pl脚本产生的cacert.pem文件复制到postfix目录下
    cp /usr/local/ssl/demoCA/cacert.pem /etc/postfix
  • 如果是第三方,获取PEM,然后放在/etc/postfix/cacert.pem

安装方法

  1. 所有根证书集中在一个文件,smtpd_tls_CAfile指向此文件
    只需要将新证书附加在现有文件末端:
  • 原有CA在/etc/postfix/cacert.pem, 新CA在newCA.pem
    新纳入认同:
    cp /etc/postfix/cacet.pem /etc/postfix/cacert.pem.old
    cat newCA.pem >> /etc/postfix/cacert.pem
  1. 每个CA根证书集中在专用目录下的个别文件里,smtpd_tls_CApath指向目录
    每当需要安装新的CA证书时,只要将新的证书文件放到目录下就行,然后执行一次OpenSSL的c_rehash命令
    新证书:newCA.pem 根证书目录:/etc/postfix/certs/
    cp newCA.pem /etc/postfix/certs
    c_rehash /etc/postfix/certs

postfix reload

设定Postfix/TLS

main.cf配置文件中设置
smtpd_use_tls = yes: 启动TLS支持
smtpd_tls_key_file = /etc/postfix/mailkey.pem: 指向服务器私钥文件
smtpd_tls_cert_file = /etc/postfix/mail_signed_cert.pem: 指向经过CA的PEM证书
smtpd_tls_CAfile = /etc/postfix/cacert.pem: 指向CA根证书
smtpd_tls_CApath = /etc/postfix/certs: 指向CA证书文件目录

  • postfix reload重启

设定过程整理

  1. 安装OpenSSL,产生TLS证书
  2. 产生CSR,CA签署(自己或第三方)
  3. 密钥,CSR,CA放在Postfix下
  4. 编辑main.cf
  5. 重启

TLS/SMTP client

客户端

  1. openssl req -new -keyout kdentkey.pem -out kdentreq.pem -days 365
  2. openssl ca -out kdent_signed_cert.pem -infiles kdentreq.pem
  3. 转换格式:
openssl pkcs12 -in kdent_signed_cert.pem \-inkey kdentkey.pem -certfile /etc/postfix/cacert.pem \-out kdent.p12 - export -name "kdent@ora.com"
  • 生成的文件可以交给用户

设定客户端证书验证

  1. 计算指纹:openssl x509 -fingerprint -noout -in kdent_signed_cert.pem | cut -d= -f2
  2. 集中在/etc/postfix/clientcerts文件,并注明辨别名称
    xxxxx:xx kdent@ora.com
  3. postmap /etc/postfix/clientcerts
  4. main.cf配置
relay_clientcerts = hash:/etc/postfix/clientcerts
smtpd_tls_ask_ccert = yes
smtpd_recipient_restrictions =permit_mynetworkspermit_tls_clientcertsreject_unauth_destination
  1. 重启

TLS/SMTP client的服务器设定

寄信到其他服务器。

  1. 打算让smtp和smtpd用相同的证书.
    smtp_use_tls = yes: 启动TLS支持
    smtp_tls_key_file = /etc/postfix/mailkey.pem: 指向服务器私钥文件
    smtp_tls_cert_file = /etc/postfix/mail_signed_cert.pem: 指向经过CA的PEM证书
    smtp_tls_CAfile = /etc/postfix/cacert.pem: 指向CA根证书
    smtp_tls_CApath = /etc/postfix/certs: 指向CA证书文件目录
  • postfix reload重启

Postfix权威指南-阅读笔记-架设和维护邮箱服务器相关推荐

  1. MyCat权威指南阅读笔记(基础篇)

    1.1何为数据切分? 简单来说,就是指通过某种特定的条件,将我们存放在同一个数据库中的数据分散存放到多个数据库(主 机)上面,以达到分散单台设备负载的效果. 数据的切分(Sharding)根据其切分规 ...

  2. Hadoop权威指南阅读笔记

    2019独角兽企业重金招聘Python工程师标准>>> 1.MR和关系型数据 MR和传统的关系型数据库处理的数据是不同,传统关系型数据库处理的是较结构化数据,对于半结构化和非机构话数 ...

  3. HTTP权威指南阅读笔记五:Web服务器

    Web服务器会做些什么: 1.建产连接:接受一个客户端连接,或者如果不希望与这个客户端建立连接,就将其关闭. 1)处理新连接 2)客户端主机名识别 3)通过ident确定客户端用户 ident在组织内 ...

  4. HTTP权威指南阅读笔记一:HTTP概述

    HTTP协议版本: 1.HTTP/0.9:HTTP的1991原型版本称为HTTP/0.9.这个协议有很多严重的缺陷,只应该用与与老客户端的交互.HTTP/0.9只支持GET方法,不支持多媒体内容的MI ...

  5. JS权威指南阅读笔记

    2019独角兽企业重金招聘Python工程师标准>>> 词法结构 unicode以\u为前缀,其后跟随4个十六进制数 标识符必须以字母.下划线或$开始,后续字符可以是字母.数字.下划 ...

  6. HTTP权威指南读书笔记

    <<HTTP权威指南>>读书笔记 第一部分:Web的基础 第1章:HTTP概述 主要内容 1.什么是HTTP 2.HTTP的基本组件 HTTP HTTP:HTTP(Hypert ...

  7. mysql数据库权威指南_MySQL_MySQL权威指南读书笔记(三),第二章:MYSQL数据库里面的数 - phpStudy...

    MySQL权威指南读书笔记(三) 第二章:MYSQL数据库里面的数据 用想用好MYSQL,就必须透彻理解MYSQL是如何看待和处理数据的.本章主要讨论了两个问题:一是SQL所能处理的数据值的类型:二是 ...

  8. 《JavaScript权威指南》笔记(一)

    2019独角兽企业重金招聘Python工程师标准>>> <JavaScript权威指南>真是名符其实的好书!真遗憾初学JavaScript时没有立即读这本书,甚为遗憾.不 ...

  9. JavaScript 权威指南-学习笔记(一)

    本文所有教程及源码.软件仅为技术研究.不涉及计算机信息系统功能的删除.修改.增加.干扰,更不会影响计算机信息系统的正常运行.不得将代码用于非法用途,如侵立删! JavaScript 权威指南-学习笔记 ...

最新文章

  1. 【java】过滤器filter的使用
  2. 前端小项目之在线便利贴
  3. Notepad++使用vs2015主题教程
  4. sgi 之vector
  5. 优先级调度算法实现_一篇讲透嵌入式操作系统任务调度
  6. 一行代码搞定 GitHub 访问徽章
  7. __call、__set 和 __get的用法
  8. Android-入门学习笔记-图片和外观改善
  9. 云南计算机专升本数据结构_云南省统招专升本考些什么科目(三)
  10. Java动态绑定与多态
  11. Axis2发布webservice(3)--axis2生成wsdl文件,并利用wsdl文件来生成WebService的Java代码
  12. 数据结构与算法课程笔记(七)
  13. python字符串与url编码的转换
  14. php输出次方,PHP 计算2的N次方代码
  15. 三维分子图的球面信息传递
  16. unity简单实现融合树动画
  17. 国内CDN的排名情况
  18. HDMI/type-c一线通EDP驱动板|应用高清便携显示器支持2K/1080P
  19. NoSuchMethodError 错误——包冲突解决办法
  20. 【杰理AC696X】MIC能量采集的三种方式

热门文章

  1. python ,ffprobe获取音频文件头信息,文件格式等
  2. 【C语言】C语言实现一个函数 判断是否是素数
  3. 低效的CMMI周例会
  4. 一道面试题:火车运煤问题
  5. Python图形用户界面设计-Delphi For Python高级开发教程
  6. 使用paddlehub制作酷炫视频
  7. 基于SnowNLP的购物评论文本情感分析及准确率验证
  8. java 文件下载 迅雷下载_java文件下载用迅雷
  9. 【问题解决】关于爬虫被封的处理方法(同花顺数据获取问题)
  10. PMP试题 | 每日一练,快速提分 6.4