Debian + Postfix + Dovecot +多域+ SSL + IPv6 + OpenVPN +多接口+ SpamAssassin-learn +绑定

本文介绍如何设置现代邮件服务器。
Postfix + Dovecot。 SPF + DKIM + rDNS。 使用IPv6。
使用TLS加密。 支持多个域-部分带有真实的SSL证书。
在其他邮件服务器上具有反垃圾邮件保护和较高的反垃圾邮件评级。
支持多种物理接口。
使用OpenVPN,它通过IPv4连接并提供IPv6。

如果您不想学习所有这些技术,但是想要配置这样的服务器,那么本文适合您。

没有尝试解释本文中的每个细节。 从消费者的角度出发,对没有标准配置或重要的配置进行解释。

设置邮件服务器的动机是我的梦想。 听起来可能很愚蠢,但是恕我直言,这比梦见自己喜欢的品牌的新车要好得多。

配置IPv6的动机有两个。 IT专业人员需要不断学习新技术才能生存。 我想为反对检查制度的斗争做出不多的贡献。

设置OpenVPN的动机仅是为了使IPv6在本地计算机上工作。
设置多个物理接口的动机是,在我的服务器上,一个接口“慢而无限制”,而另一个接口“快速但有关税”。

设置绑定设置的动机是我的提供商提供了不稳定的DNS服务器,并且google也崩溃了。 我想要一个稳定的DNS服务器供个人使用。

撰写文章的动机-草案是10个月前写的,我已经对其进行了两次研究。 如果甚至作者经常需要它,那么其他人也很有可能需要它。

邮件服务器没有通用的解决方案。 但是,我将尝试写一些类似的内容,例如“这样做,然后在一切正常进行时-丢弃多余的内容”。

从tech.ru有一个托管服务器。 可以与OVH,Hetzner,AWS进行比较。 为了解决这个问题,与tech.ru的合作将更加有效。

服务器上已安装Debian 9。

在服务器上有2个接口eno1和eno2。 第一个是无限的,第二个是快速的。

接口eno1上有3个静态IP地址XX.XX.XX.X0和XX.XX.XX.X1和XX.XX.XX.X2,以及eno2接口上的XX.XX.XX.X5。

有XXXX:XXXX:XXXX:XXXX:// 64分配给接口eno1的IPv6地址池,并应我的请求从XXXX:XXXX:XXXX:XXXX:1:2 :: / 96分配给eno2。

有3个域“ domain1.com”,“ domain2.com”,“ domain3.com”。 对于“ domain1.com”和“ domain3.com”,有一个SSL证书。

有一个您要绑定邮箱“ vasya.pupkin @ domain1.com”的Google帐户(接收邮件并直接从gmail界面发送邮件)。
应该有一个邮箱support@domain2.com,这是我想从我的gmail中看到的邮件的副本。 而且几乎不可能通过Web界面代表“ support @ domain2.com”发送邮件。

应该有一个邮箱“ ivanov @ domain3.com”,Ivanov将在他的iPhone中使用该邮箱。

发送的信件必须符合所有当前的反垃圾邮件要求。
公共网络上应该提供最高级别的加密。
发送和接收电子邮件都必须有IPv6支持。
必须有一个SpamAssassin,它将永远不会删除电子邮件。 它将退回或跳过,或将垃圾邮件文件夹发送到IMAP。
应该配置SpamAssassin自动学习:如果我将字母移到Spam文件夹,我将从中学习; 如果我将信件从“垃圾邮件”文件夹中移出,则会从中学习。 SpamAssassin学习成果-应该影响垃圾邮件文件夹中邮件的覆盖范围。
PHP脚本应该能够代表该服务器上的任何域发送邮件。
应该有一个openvpn服务,该服务能够在没有IPv6的客户端上使用IPv6。

首先,您需要配置接口和路由,包括IPv6。
然后,您将需要配置OpenVPN,它将通过IPv4连接并为客户端提供静态的真实IPv6地址。 该客户端将有权访问服务器上的所有IPv6服务,并有权访问Internet上的任何IPv6资源。
然后,有必要将Postfix配置为发送字母+ SPF + DKIM + rDNS和其他类似的琐事。
然后,您将需要配置Dovecot并配置多域。
然后,您将需要配置SpamAssassin并配置培训。
最后,安装绑定。

=============多接口==============


要配置接口,您需要在“ / etc / network / interfaces”中注册它。

# The loopback network interface auto lo iface lo inet loopback # The primary network interface allow-hotplug eno1 iface eno1 inet static address XX.XX.XX.X0/24 gateway XX.XX.XX.1 dns-nameservers 127.0.0.1 213.248.1.6 post-up ip route add XX.XX.XX.0/24 dev eno1 src XX.XX.XX.X0 table eno1t post-up ip route add default via XX.XX.XX.1 table eno1t post-up ip rule add table eno1t from XX.XX.XX.X0 post-up ip rule add table eno1t to XX.XX.XX.X0 auto eno1:1 iface eno1:1 inet static address XX.XX.XX.X1 netmask 255.255.255.0 post-up ip rule add table eno1t from XX.XX.XX.X1 post-up ip rule add table eno1t to XX.XX.XX.X1 post-up ip route add 10.8.0.0/24 dev tun0 src XX.XX.XX.X1 table eno1t post-down ip route del 10.8.0.0/24 dev tun0 src XX.XX.XX.X1 table eno1t auto eno1:2 iface eno1:2 inet static address XX.XX.XX.X2 netmask 255.255.255.0 post-up ip rule add table eno1t from XX.XX.XX.X2 post-up ip rule add table eno1t to XX.XX.XX.X2 iface eno1 inet6 static address XXXX:XXXX:XXXX:XXXX:1:1::/64 gateway XXXX:XXXX:XXXX:XXXX::1 up ip -6 addr add XXXX:XXXX:XXXX:XXXX:1:1:1:1/64 dev $IFACE up ip -6 addr add XXXX:XXXX:XXXX:XXXX:1:1:1:2/64 dev $IFACE down ip -6 addr del XXXX:XXXX:XXXX:XXXX:1:1:1:1/64 dev $IFACE down ip -6 addr del XXXX:XXXX:XXXX:XXXX:1:1:1:2/64 dev $IFACE # The secondary network interface allow-hotplug eno2 iface eno2 inet static address XX.XX.XX.X5 netmask 255.255.255.0 post-up ip route add XX.XX.XX.0/24 dev eno2 src XX.XX.XX.X5 table eno2t post-up ip route add default via XX.XX.XX.1 table eno2t post-up ip rule add table eno2t from XX.XX.XX.X5 post-up ip rule add table eno2t to XX.XX.XX.X5 post-up ip route add 10.8.0.0/24 dev tun0 src XX.XX.XX.X5 table eno2t post-down ip route del 10.8.0.0/24 dev tun0 src XX.XX.XX.X5 table eno2t iface eno2 inet6 static address XXXX:XXXX:XXXX:XXXX:1:2::/96 up ip -6 addr add XXXX:XXXX:XXXX:XXXX:1:2:1:1/64 dev $IFACE up ip -6 addr add XXXX:XXXX:XXXX:XXXX:1:2:1:2/64 dev $IFACE down ip -6 addr del XXXX:XXXX:XXXX:XXXX:1:2:1:1/64 dev $IFACE down ip -6 addr del XXXX:XXXX:XXXX:XXXX:1:2:1:2/64 dev $IFACE # OpenVPN network iface tun0 inet6 static address XXXX:XXXX:XXXX:XXXX:1:3::/80 

这些设置可以应用在tech.ru中的任何服务器上(与支持稍加协调),它将立即按预期工作。

如果为OVH的Hetzner建立类似的事情的经验-有女朋友。 辛苦了

eno1是网卡1的名称(缓慢但不受限制)。
eno2是2号网卡的名称(快速,但要收费)。
tun0是来自OpenVPN的虚拟网卡的名称。
XX.XX.XX.X0-eno1上的IPv4#1
XX.XX.XX.X1-eno1上的IPv4#2。
XX.XX.XX.X2-eno1上的IPv4#3。
XX.XX.XX.X5-eno2上的IPv4#1。
XX.XX.XX.1-IPv4网关
XXXX:XXXX:XXXX:XXXX :: / 64-整个服务器的IPv6。
XXXX:XXXX:XXXX:XXXX:1:2 :: / 96-IPv6 for eno2,其他所有内容都从外部传递给eno1。
XXXX:XXXX:XXXX:XXXX :: 1-IPv6网关(值得注意的是,您可以/需要在这里交个朋友。请指明IPv6交换机)。
dns-nameservers-指定127.0.0.1(因为bind是在本地安装的)和213.248.1.6(来自tech.ru)。

“表eno1t”和“表eno2t”-这些路由规则的含义是,通过eno1->的流量通过它,而通过eno2->的流量通过它。 服务器启动的连接也将通过eno1进行。

 ip route add default via XX.XX.XX.1 table eno1t 

使用此命令,我们可以设置任何在规则“表eno1t”标记为->的规则下无法理解的流量,将其发送到eno1接口。

 ip route add XX.XX.XX.0/24 dev eno1 src XX.XX.XX.X0 table eno1t 

使用此命令,我们将所有服务器启动的流量定向到eno1接口。

 ip rule add table eno1t from XX.XX.XX.X0 ip rule add table eno1t to XX.XX.XX.X0 

使用此命令,我们可以自己设置标记流量的规则。

 auto eno1:2 iface eno1:2 inet static address XX.XX.XX.X2 netmask 255.255.255.0 post-up ip rule add table eno1t from XX.XX.XX.X2 post-up ip rule add table eno1t to XX.XX.XX.X2 

此块定义eno1接口的第二个IPv4。

 ip route add 10.8.0.0/24 dev tun0 src XX.XX.XX.X1 table eno1t 

使用此命令,我们设置了从OpenVPN客户端到本地IPv4的路由,除了XX.XX.XX.X0。
为什么此命令对所有IPv4都足够-我仍然不明白。

 iface eno1 inet6 static address XXXX:XXXX:XXXX:XXXX:1:1::/64 gateway XXXX:XXXX:XXXX:XXXX::1 

这我们设置了接口本身的地址。 服务器将其用作“发送”地址。 将不再使用。

为什么显示“:1:1 ::”如此复杂? 该OpenVPN正常工作,并且仅用于此目的。 稍后再详细介绍。

关于网关的主题-这就是它的工作原理。 但是以正确的方式-在这里您必须指定服务器连接到的IPv6交换机。

但是,由于某些原因,如果执行此操作,IPv6将停止工作。 也许这是一些tech.ru的麻烦。

 ip -6 addr add XXXX:XXXX:XXXX:XXXX:1:1:1:1/64 dev $IFACE 

这会将IPv6地址添加到接口。 如果您需要一百个地址,则意味着此文件中有一百行。

 iface eno1 inet6 static address XXXX:XXXX:XXXX:XXXX:1:1::/64 ... iface eno2 inet6 static address XXXX:XXXX:XXXX:XXXX:1:2::/96 ... iface tun0 inet6 static address XXXX:XXXX:XXXX:XXXX:1:3::/80 

标记所有接口的地址和子网,以使其清晰可见。
eno1-它必须是“ / 64”-因为这是我们的整个地址池。
tun0-子网必须大于eno1。 否则,您将无法为OpenVPN客户端配置IPv6网关。
eno2-子网必须大于tun0。 否则,OpenVPN客户端将无法获取本地IPv6地址。
为了清楚起见,我选择了子网步骤16,但如果愿意,您甚至可以执行“ 1”步骤​​。
因此,64 + 16 = 80,而80 + 16 = 96。

为了更加清晰:
XXXX:XXXX:XXXX:XXXX:1:1:YYYY:YYYY-这些地址应分配给eno1界面上的特定站点或服务。
XXXX:XXXX:XXXX:XXXX:1:2:YYYY:YYYY-这些地址应分配给eno2界面上的特定站点或服务。
XXXX:XXXX:XXXX:XXXX:1:3:YYYY:YYYY是应分配给OpenVPN客户端或用作OpenVPN服务地址的地址。


要配置网络-应该可以重新启动服务器。
在执行期间拾取IPv4更改(请确保将其包装在屏幕中-否则此命令将简单地将服务器上的网络断开):

 /etc/init.d/networking restart 

在文件“ / etc / iproute2 / rt_tables”的末尾添加:

 100 eno1t 101 eno2t 

否则,您将无法在文件“ / etc / network / interfaces”中使用自定义表。
这些数字必须唯一且小于65535。

IPv6更改很容易更改而无需重新启动,但是为此,您至少需要学习三个命令:

 ip -6 addr ... ip -6 route ... ip -6 neigh ... 

设置“ /etc/sysctl.conf”

 # Uncomment the next line to enable packet forwarding for IPv4 net.ipv4.ip_forward = 1 # Do not accept ICMP redirects (prevent MITM attacks) net.ipv4.conf.all.accept_redirects = 0 net.ipv6.conf.all.accept_redirects = 0 # Do not send ICMP redirects (we are not a router) net.ipv4.conf.all.send_redirects = 0 # For receiving ARP replies net.ipv4.conf.all.arp_filter = 0 net.ipv4.conf.default.arp_filter = 0 # For sending ARP net.ipv4.conf.all.arp_announce = 0 net.ipv4.conf.default.arp_announce = 0 # Enable IPv6 net.ipv6.conf.all.disable_ipv6 = 0 net.ipv6.conf.default.disable_ipv6 = 0 net.ipv6.conf.lo.disable_ipv6 = 0 # IPv6 configuration net.ipv6.conf.all.autoconf = 1 net.ipv6.conf.all.accept_ra = 0 # For OpenVPN net.ipv6.conf.all.forwarding = 1 net.ipv6.conf.all.proxy_ndp = 1 # For nginx on boot net.ipv6.ip_nonlocal_bind = 1 

这些是我服务器的sysctl设置。 我注意到重要。

 net.ipv4.ip_forward = 1 

否则,OpenVPN将无法以任何方式工作。

 net.ipv6.ip_nonlocal_bind = 1 

任何在接口启动后立即尝试绑定IPv6(例如nginx)的人都会收到错误消息。 这样的地址不可用。

为了避免这种情况,进行了这样的设置。

 net.ipv6.conf.all.forwarding = 1 net.ipv6.conf.all.proxy_ndp = 1 

没有这些IPv6设置,来自OpenVPN客户端的流量就不会进入世界。

其他设置无关紧要,或者我不记得为什么。
但以防万一,我“照原样”离开。

为了能够在不重新引导服务器的情况下获取此文件中的更改,您需要运行以下命令:

 sysctl -p 

有关“表格”规则的更多详细信息: habr.com/post/108690

============= OpenVPN ==============


没有iptables,OpenVPN IPv4无法正常工作。

我有用于VPN的以下iptables:

 iptables -A INPUT -p udp -s YY.YY.YY.YY --dport 1194 -j ACCEPT iptables -A FORWARD -i tun0 -o eno1 -j ACCEPT iptables -t nat -A POSTROUTING -s 10.8.0.0/24 -o eno1 -j SNAT --to-source XX.XX.XX.X0 ##iptables -t nat -A POSTROUTING -s 10.8.0.0/24 -o eno1 -j MASQUERADE iptables -A FORWARD -m state --state RELATED,ESTABLISHED -j ACCEPT iptables -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT iptables -A INPUT -p udp --dport 1194 -j DROP iptables -A FORWARD -p udp --dport 1194 -j DROP 

YY.YY.YY.YY是我在本地计算机上的静态IPv4地址。
10.8.0.0/24-IPv4 openvpn网络。 openvpn客户端的IPv4地址。
规则的顺序很重要。

 iptables -A INPUT -p udp -s YY.YY.YY.YY --dport 1194 -j ACCEPT iptables -A FORWARD -i tun0 -o eno1 -j ACCEPT ... iptables -A FORWARD -m state --state RELATED,ESTABLISHED -j ACCEPT iptables -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT iptables -A INPUT -p udp --dport 1194 -j DROP iptables -A FORWARD -p udp --dport 1194 -j DROP 

这是一个限制,因此只有我可以从我的静态IP使用OpenVPN。

 iptables -t nat -A POSTROUTING -s 10.8.0.0/24 -o eno1 -j SNAT --to-source XX.XX.XX.X0 --  -- iptables -t nat -A POSTROUTING -s 10.8.0.0/24 -o eno1 -j MASQUERADE 

要在OpenVPN客户端和Internet之间转发IPv4数据包,您需要注册以下命令之一。

对于不同的情况,其中一种选项不合适。
两支球队都适合我的情况。
阅读文档后,我选择了第一个选项,因为它消耗的CPU更少。

这样,所有iptables设置在重新启动后都会被提取-您需要将它们保存在某个地方。

 iptables-save > /etc/iptables/rules.v4 ip6tables-save > /etc/iptables/rules.v6 

这样的名字并非偶然。 iptables-persistent包使用它们。

 apt-get install iptables-persistent 

安装主要的OpenVPN软件包:

 apt-get install openvpn easy-rsa 

设置证书模板(替换您的值):

 make-cadir ~/openvpn-ca cd ~/openvpn-ca ln -s openssl-1.0.0.cnf openssl.cnf 

让我们编辑证书模板设置:

 mcedit vars 

 ... # These are the default values for fields # which will be placed in the certificate. # Don't leave any of these fields blank. export KEY_COUNTRY="RU" export KEY_PROVINCE="Krasnodar" export KEY_CITY="Dinskaya" export KEY_ORG="Own" export KEY_EMAIL="admin@domain1.com" export KEY_OU="VPN" # X509 Subject Field export KEY_NAME="server" ... 

创建服务器证书:

 cd ~/openvpn-ca source vars ./clean-all ./build-ca ./build-key-server server ./build-dh openvpn --genkey --secret keys/ta.key 

我们将准备机会创建生成的“ client-name.opvn”文件:

 mkdir -p ~/client-configs/files chmod 700 ~/client-configs/files cp /usr/share/doc/openvpn/examples/sample-config-files/client.conf ~/client-configs/base.conf mcedit ~/client-configs/base.conf 

 # Client mode client # Interface tunnel type dev tun # TCP protocol proto tcp-client # Address/Port of VPN server remote XX.XX.XX.X0 1194 # Don't bind to local port/address nobind # Don't need to re-read keys and re-create tun at restart persist-key persist-tun # Remote peer must have a signed certificate remote-cert-tls server ns-cert-type server # Enable compression comp-lzo # Custom ns-cert-type server tls-auth ta.key 1 cipher DES-EDE3-CBC 

我们将准备一个脚本,将所有文件拼接到单个opvn文件中。

 mcedit ~/client-configs/make_config.sh chmod 700 ~/client-configs/make_config.sh 

 #!/bin/bash # First argument: Client identifier KEY_DIR=~/openvpn-ca/keys OUTPUT_DIR=~/client-configs/files BASE_CONFIG=~/client-configs/base.conf cat ${BASE_CONFIG} \ <(echo -e '<ca>') \ ${KEY_DIR}/ca.crt \ <(echo -e '</ca>\n<cert>') \ ${KEY_DIR}/${1}.crt \ <(echo -e '</cert>\n<key>') \ ${KEY_DIR}/${1}.key \ <(echo -e '</key>\n<tls-auth>') \ ${KEY_DIR}/ta.key \ <(echo -e '</tls-auth>') \ > ${OUTPUT_DIR}/${1}.ovpn 

我们创建第一个OpenVPN客户端:

 cd ~/openvpn-ca source vars ./build-key client-name cd ~/client-configs ./make_config.sh client-name 

文件“〜/ client-configs / files / client-name.ovpn”被发送到客户端。

对于iOS客户端,您需要执行以下操作:
tls-auth标记的内容应无注释。
并且还应在标签“ tls-auth”之前紧接着放置“ key-direction 1”。

配置OpenVPN服务器配置:

 cd ~/openvpn-ca/keys cp ca.crt ca.key server.crt server.key ta.key dh2048.pem /etc/openvpn gunzip -c /usr/share/doc/openvpn/examples/sample-config-files/server.conf.gz | tee /etc/openvpn/server.conf mcedit /etc/openvpn/server.conf 

 # Listen port port 1194 # Protocol proto tcp-server # IP tunnel dev tun0 tun-ipv6 push tun-ipv6 # Master certificate ca ca.crt # Server certificate cert server.crt # Server private key key server.key # Diffie-Hellman parameters dh dh2048.pem # Allow clients to communicate with each other client-to-client # Client config dir client-config-dir /etc/openvpn/ccd # Run client-specific script on connection and disconnection script-security 2 client-connect "/usr/bin/sudo -u root /etc/openvpn/server-clientconnect.sh" client-disconnect "/usr/bin/sudo -u root /etc/openvpn/server-clientdisconnect.sh" # Server mode and client subnets server 10.8.0.0 255.255.255.0 server-ipv6 XXXX:XXXX:XXXX:XXXX:1:3::/80 topology subnet # IPv6 routes push "route-ipv6 XXXX:XXXX:XXXX:XXXX::/64" push "route-ipv6 2000::/3" # DNS (for Windows) # These are OpenDNS push "dhcp-option DNS 208.67.222.222" push "dhcp-option DNS 208.67.220.220" # Configure all clients to redirect their default network gateway through the VPN push "redirect-gateway def1 bypass-dhcp" push "redirect-gateway ipv6" #For iOS # Don't need to re-read keys and re-create tun at restart persist-key persist-tun # Ping every 10s. Timeout of 120s. keepalive 10 120 # Enable compression comp-lzo # User and group user vpn group vpn # Log a short status status openvpn-status.log # Logging verbosity ##verb 4 # Custom config tls-auth ta.key 0 cipher DES-EDE3-CBC 

为了为每个客户端设置一个静态地址,这是必需的(不是必需的,但是我使用):

 # Client config dir client-config-dir /etc/openvpn/ccd 

最困难和最关键的细节。

不幸的是,OpenVPN尚不能为客户端独立配置IPv6网关。
我们必须为每个客户手动转发。

 # Run client-specific script on connection and disconnection script-security 2 client-connect "/usr/bin/sudo -u root /etc/openvpn/server-clientconnect.sh" client-disconnect "/usr/bin/sudo -u root /etc/openvpn/server-clientdisconnect.sh" 

文件“ /etc/openvpn/server-clientconnect.sh”:

 #!/bin/sh # Check client variables if [ -z "$ifconfig_pool_remote_ip" ] || [ -z "$common_name" ]; then echo "Missing environment variable." exit 1 fi # Load server variables . /etc/openvpn/variables ipv6="" # Find out if there is a specific config with fixed IPv6 for this client if [ -f "/etc/openvpn/ccd/$common_name" ]; then # Get fixed IPv6 from client config file ipv6=$(sed -nr 's/^.*ifconfig-ipv6-push[ \t]+([0-9a-fA-F\\:]+).*$/\1/p' "/etc/openvpn/ccd/$common_name") echo $ipv6 fi # Get IPv6 from IPv4 if [ -z "$ipv6" ]; then ipp=$(echo "$ifconfig_pool_remote_ip" | cut -d. -f4) if ! [ "$ipp" -ge 2 -a "$ipp" -le 254 ] 2>/dev/null; then echo "Invalid IPv4 part." exit 1 fi hexipp=$(printf '%x' $ipp) ipv6="$prefix$hexipp" fi # Create proxy rule /sbin/ip -6 neigh add proxy $ipv6 dev eno1 


文件“ /etc/openvpn/server-clientdisconnect.sh”:
 #!/bin/sh # Check client variables if [ -z "$ifconfig_pool_remote_ip" ] || [ -z "$common_name" ]; then echo "Missing environment variable." exit 1 fi # Load server variables . /etc/openvpn/variables ipv6="" # Find out if there is a specific config with fixed IPv6 for this client if [ -f "/etc/openvpn/ccd/$common_name" ]; then # Get fixed IPv6 from client config file ipv6=$(sed -nr 's/^.*ifconfig-ipv6-push[ \t]+([0-9a-fA-F\\:]+).*$/\1/p' "/etc/openvpn/ccd/$common_name") fi # Get IPv6 from IPv4 if [ -z "$ipv6" ]; then ipp=$(echo "$ifconfig_pool_remote_ip" | cut -d. -f4) if ! [ "$ipp" -ge 2 -a "$ipp" -le 254 ] 2>/dev/null; then echo "Invalid IPv4 part." exit 1 fi hexipp=$(printf '%x' $ipp) ipv6="$prefix$hexipp" fi # Delete proxy rule /sbin/ip -6 neigh del proxy $ipv6 dev eno1 

这两个脚本都使用文件“ / etc / openvpn / variables”:

 # Subnet prefix=XXXX:XXXX:XXXX:XXXX:2: # netmask prefixlen=112 

为什么在这里写-我觉得很难记住。

现在看起来很奇怪,netmask = 112(右边应该是96)。
前缀很奇怪,与tun0网络不匹配。
但是好吧,我“照原样”保留它。

 cipher DES-EDE3-CBC 

这是一个业余爱好者-我选择了这种加密连接的方法。

有关设置OpenVPN IPv4的更多信息。

有关设置OpenVPN IPv6的更多信息。

=============后缀==============


安装主软件包:

 apt-get install postfix 

安装时,选择“互联网站点”。

我的“ /etc/postfix/main.cf”看起来像这样:

 smtpd_banner = $myhostname ESMTP $mail_name (Debian/GNU) biff = no # appending .domain is the MUA's job. append_dot_mydomain = no readme_directory = no # See http://www.postfix.org/COMPATIBILITY_README.html -- default to 2 on # fresh installs. compatibility_level = 2 # TLS parameters smtpd_tls_cert_file=/etc/ssl/domain1.com.2018.chained.crt smtpd_tls_key_file=/etc/ssl/domain1.com.2018.key smtpd_use_tls=yes smtpd_tls_auth_only = yes smtp_bind_address = XX.XX.XX.X0 smtp_bind_address6 = XXXX:XXXX:XXXX:XXXX:1:1:1:1 smtp_tls_security_level = may smtp_tls_ciphers = export smtp_tls_protocols = !SSLv2, !SSLv3 smtp_tls_loglevel = 1 smtpd_relay_restrictions = permit_mynetworks permit_sasl_authenticated defer_unauth_destination myhostname = domain1.com alias_maps = hash:/etc/aliases alias_database = hash:/etc/aliases myorigin = domain1.com mydestination = localhost relayhost = mynetworks = 127.0.0.0/8 [::ffff:127.0.0.0]/104 [::1]/128 mailbox_size_limit = 0 recipient_delimiter = + inet_interfaces = all inet_protocols = ipv4 internal_mail_filter_classes = bounce # Storage type virtual_transport = lmtp:unix:private/dovecot-lmtp virtual_mailbox_domains = mysql:/etc/postfix/mysql-virtual-mailbox-domains.cf virtual_mailbox_maps = mysql:/etc/postfix/mysql-virtual-mailbox-maps.cf virtual_alias_maps = mysql:/etc/postfix/mysql-virtual-alias-maps.cf # SMTP-Auth settings smtpd_sasl_type = dovecot smtpd_sasl_path = private/auth smtpd_sasl_auth_enable = yes smtpd_recipient_restrictions = permit_sasl_authenticated, permit_mynetworks, #reject_invalid_hostname, #reject_unknown_recipient_domain, reject_unauth_destination, reject_rbl_client sbl.spamhaus.org, check_policy_service unix:private/policyd-spf smtpd_helo_restrictions = #reject_invalid_helo_hostname, #reject_non_fqdn_helo_hostname, reject_unknown_helo_hostname smtpd_client_restrictions = permit_mynetworks, permit_sasl_authenticated, reject_non_fqdn_helo_hostname, permit # SPF policyd-spf_time_limit = 3600 # OpenDKIM milter_default_action = accept milter_protocol = 6 smtpd_milters = unix:var/run/opendkim/opendkim.sock non_smtpd_milters = unix:var/run/opendkim/opendkim.sock # IP address per domain sender_dependent_default_transport_maps = pcre:/etc/postfix/sdd_transport.pcre 

让我们考虑一下此配置的详细信息。

 smtpd_tls_cert_file=/etc/ssl/domain1.com.2018.chained.crt smtpd_tls_key_file=/etc/ssl/domain1.com.2018.key 



根据哈布罗夫斯克市民的说法,此区块包含“错误信息和虚假内容”。
在职业生涯开始仅8年之后,我就开始了解SSL的工作原理。

因此,我将随意描述如何使用SSL(无需回答“它如何工作?”以及“它为什么工作?”的问题)。

现代加密的基础是创建密钥对(两行很长的字符)。

一个“密钥”是私有的,另一个是“公共”的。 我们非常谨慎地将私钥保密。 我们将公钥分发给每个人。

使用公共密钥,您可以加密文本字符串,以便只有私有密钥的所有者才能解密。
嗯,这就是技术的全部基础。

步骤1-https网站。
访问该站点时,浏览器从Web服务器获悉该站点为https,因此请求公共密钥。
Web服务器提供公共密钥。 浏览器使用公共密钥加密http请求并发送它。
只有拥有私钥的人(即,只能向其发出呼叫的服务器)才能读取http-request的内容。
Http-request至少包含一个URI。 因此,如果该国家/地区试图将访问权限限制为不限于整个网站,而不仅限于特定页面,那么对于https网站,则无法做到。

步骤2是加密的答案。
Web服务器提供了一个易于阅读的答案。
解决方案非常简单-浏览器在本地为每个https站点生成相同的私钥-公钥对。
连同对站点公共密钥的请求,它发送其本地公共密钥。
Web服务器会记住它,并在发送http响应时使用特定客户端的此公共密钥进行加密。
现在,http响应只能由客户端浏览器私钥的所有者(即客户端本身)解密。

步骤3-通过公共渠道建立安全连接。
在示例2中,存在一个漏洞-没有什么可以阻止好心人拦截HTTP请求并编辑公共密钥信息。
因此,中介将看到几乎所有已发送和已接收消息的内容,直到通信通道更改为止。
解决这个问题非常简单-只需将浏览器的公钥发送为使用Web服务器的公钥加密的消息即可。
然后,Web服务器首先发送诸如“您的公共密钥就是这样”的响应,并使用相同的公共密钥对该消息进行加密。
浏览器会查看答案-如果收到消息“您的公钥就像这样”-那么这100%保证了此通信通道的安全。
有多安全?
这样的安全通信通道本身的创建以ping * 2速度进行。 例如20ms。
攻击者必须事先拥有双方的私钥之一。 或拿起私钥几毫秒。
破解一个现代私钥将在一台超级计算机上花费数十年。

步骤#4-公共密钥的公共数据库。
显然,在整个故事中,攻击者有可能坐在客户端和服务器之间的通信通道上。
服务器向客户端提供机会,客户端向服务器提供机会。 并在两个方向上模拟一个密钥对。
然后,攻击者将看到所有流量,并将能够“编辑”流量。
例如,更改汇款地址或从网上银行复制密码或阻止“令人反感”的内容。
为了对抗此类攻击者,他们提出了一个公共数据库,其中包含每个https站点的公共密钥。
每个浏览器“知道”这些数据库中大约有200个存在。 它已预安装在每个浏览器中。
每个证书均由公共密钥备份“知识”。 也就是说,不可能伪造与每个特定证书颁发机构的连接。

现在对如何将SSL用于https有了一个简单的了解。
如果您动动脑筋,就会发现特殊服务如何在此设计中造成裂痕。 但这将使他们付出巨大的努力。
与NSA或CIA相比规模较小的组织-几乎不可能破解现有的保护级别,即使对于VIP也是如此。

我还将添加有关ssh连接的信息。 没有公共密钥,该怎么办。 该问题有两种解决方法。
SSH密码选项:
在第一个连接中,ssh客户端应警告,此处我们有来自ssh服务器的新公钥。
并通过进一步的连接,如果出现警告“来自ssh服务器的新公共密钥”,则表明它们正在尝试听您的声音。
或者,在您第一次收听连接时,现在您正在与服务器进行对话,而无需中介。
实际上,由于容易,快速且轻松地发现窃听事实,因此该攻击仅在特定情况下用于特定客户端。

关键ssh选项:
我们拿一个闪存驱动器,在上面为ssh服务器写一个私钥(为此有一些术语和许多细微差别,但是我正在写一个教育程序,而不是使用说明)。
我们将公用密钥保留在ssh客户端所在的计算机上,并且我们也将其保密。
我们将闪存驱动器带到服务器,插入,复制私钥,然后刻录闪存驱动器并将灰尘撒在风中(或至少将其格式化为零)。
就是这样-完成这样的操作后,将不可能破解这样的ssh连接。 当然,十多年来,您可以在超级计算机上看到流量-但这是另一回事。

我为题外话道歉。
因此,现在该理论已广为人知。 我将告诉您有关创建ssl证书的流程。

使用“ openssl genrsa”,我们创建一个私钥,并为公钥创建“空白”。
我们将“空白”发送给第三方公司,为此,我们向其支付了大约9美元的最简单证书。

在几个小时内,我们从该第三方公司收到了我们的“公钥”和另一组几个公钥。

第三方公司为什么要为我的公开密钥的发行付费(这是一个单独的发行,我们在这里不予考虑)。

现在很清楚题词的含义是:

 smtpd_tls_key_file=/etc/ssl/domain1.com.2018.key 

在“ / etc / ssl”文件夹中,存储了有关ssl问题的所有文件。
domain1.com-域名。
2018年是密钥创建的一年。
“密钥”-指定文件是私钥。

以及这个文件的含义:

smtpd_tls_cert_file = /etc/ssl/domain1.com.2018.chained.crt
domain1.com-域名。
2018年是密钥创建的一年。
链接的-表示有一连串的公钥(第一个是我们的公钥,其余的是来自发布公钥的公司的东西)。
crt-表示已准备好证书(带有技术说明的公钥)。

 smtp_bind_address = XX.XX.XX.X0 smtp_bind_address6 = XXXX:XXXX:XXXX:XXXX:1:1:1:1 

在这种情况下不使用此设置,仅作为示例。

因为此参数中的错误将导致从服务器发送垃圾邮件(没有您的意愿)。

然后向所有人证明您不应该受到责备。

 recipient_delimiter = + 

也许许多人不知道,所以这是放牧的标准符号,大多数现代邮件服务器都支持。

例如,如果您有一个邮箱“ username@gmail.com”,请尝试将其发送到“ username+spam@gmail.com”-看看会发生什么。

 inet_protocols = ipv4 

也许这会令人困惑。

但这不仅仅是。默认情况下,每个新域仅是IPv4,然后我分别为每个域启用IPv6。

 virtual_transport = lmtp:unix:private/dovecot-lmtp virtual_mailbox_domains = mysql:/etc/postfix/mysql-virtual-mailbox-domains.cf virtual_mailbox_maps = mysql:/etc/postfix/mysql-virtual-mailbox-maps.cf virtual_alias_maps = mysql:/etc/postfix/mysql-virtual-alias-maps.cf 

在这里,我们将所有传入的邮件都发送到鸽舍。
以及域,邮箱,别名的规则-查找数据库。

/etc/postfix/mysql-virtual-mailbox-domains.cf

 user = usermail password = mailpassword hosts = 127.0.0.1 dbname = servermail query = SELECT 1 FROM virtual_domains WHERE name='%s' 

/etc/postfix/mysql-virtual-mailbox-maps.cf

 user = usermail password = mailpassword hosts = 127.0.0.1 dbname = servermail query = SELECT 1 FROM virtual_users WHERE email='%s' 

/etc/postfix/mysql-virtual-alias-maps.cf

 user = usermail password = mailpassword hosts = 127.0.0.1 dbname = servermail query = SELECT destination FROM virtual_aliases WHERE source='%s' 

 # SMTP-Auth settings smtpd_sasl_type = dovecot smtpd_sasl_path = private/auth smtpd_sasl_auth_enable = yes 

现在,postfix知道您只能接受通过dovecot授权进行进一步发送的邮件。

我真的不明白为什么在这里重复了这一点。我们已经在virtual_transport中指出了所有需要的内容。

但是后缀系统非常古老-可能是过去的城堡。

 smtpd_recipient_restrictions = ... smtpd_helo_restrictions = ... smtpd_client_restrictions = ... 

为每个邮件服务器配置了自己的方式。

我可以使用3台邮件服务器,由于使用要求不同,这些设置也有很大差异。

您必须仔细配置-否则垃圾邮件会淹没您,或更糟的是,垃圾邮件会淹没您。

 # SPF policyd-spf_time_limit = 3600 

配置某种与SPF检查传入消息相关的插件。

 # OpenDKIM milter_default_action = accept milter_protocol = 6 smtpd_milters = unix:var/run/opendkim/opendkim.sock non_smtpd_milters = unix:var/run/opendkim/opendkim.sock 

配置所有外发字母,我们必须提供DKIM签名。

 # IP address per domain sender_dependent_default_transport_maps = pcre:/etc/postfix/sdd_transport.pcre 

从php脚本发送电子邮件时,这是电子邮件路由中的关键细节。

文件“ /etc/postfix/sdd_transport.pcre”:

 /^www-domain1@domain1\.com$/ domain1: /^www-domain2@domain1\.com$/ domain2: /^www-domain3@domain1\.com$/ domain3: /@domain1\.com$/ domain1: /@domain2\.com$/ domain2: /@domain3\.com$/ domain3: 

— . — , .
Postfix — .

postfix — «master.cf».

4, 5, 6 — . — .
php «from». .

— nginx+fpm.

— linux-user . fpm-pool.

Fpm-pool使用任何版本的php(在相邻站点的同一服务器上可以使用不同版本的php甚至不同的php.ini时,这非常有用)。

因此,特定的Linux用户“ www-domain2”具有domain2.com网站。该站点有一个用于发送信件的代码,无需指定“发件人”字段。

因此,即使在这种情况下,这些信件也将正确消失并且永远不会进入垃圾邮件。
我的“ /etc/postfix/master.cf”看起来像这样:

 ... smtp inet n - y - - smtpd -o content_filter=spamassassin ... submission inet n - y - - smtpd -o syslog_name=postfix/submission -o smtpd_tls_security_level=encrypt -o smtpd_sasl_auth_enable=yes -o smtpd_client_restrictions=permit_sasl_authenticated,reject ... policyd-spf unix - nn - 0 spawn user=policyd-spf argv=/usr/bin/policyd-spf spamassassin unix - nn - - pipe user=spamd argv=/usr/bin/spamc -f -e /usr/sbin/sendmail -oi -f ${sender} ${recipient} ... domain1 unix - - n - - smtp -o smtp_bind_address=XX.XX.XX.X1 -o smtp_helo_name=domain1.com -o inet_protocols=all -o smtp_bind_address6=XXXX:XXXX:XXXX:XXXX:1:1:1:1 -o syslog_name=postfix-domain1 domain2 unix - - n - - smtp -o smtp_bind_address=XX.XX.XX.X5 -o smtp_helo_name=domain2.com -o inet_protocols=all -o smtp_bind_address6=XXXX:XXXX:XXXX:XXXX:1:2:1:1 -o syslog_name=postfix-domain2 domain3 unix - - n - - smtp -o smtp_bind_address=XX.XX.XX.X2 -o smtp_helo_name=domain3 -o inet_protocols=all -o smtp_bind_address6=XXXX:XXXX:XXXX:XXXX:1:1:5:1 -o syslog_name=postfix-domain3 

文件未完全给出-它已经很大。
仅记录已更改的内容。

 smtp inet n - y - - smtpd -o content_filter=spamassassin ... spamassassin unix - nn - - pipe user=spamd argv=/usr/bin/spamc -f -e /usr/sbin/sendmail -oi -f ${sender} ${recipient} 

这些是与spamassasin相关的设置,稍后进行介绍。

 submission inet n - y - - smtpd -o syslog_name=postfix/submission -o smtpd_tls_security_level=encrypt -o smtpd_sasl_auth_enable=yes -o smtpd_client_restrictions=permit_sasl_authenticated,reject 

我们允许您通过端口587连接到邮件服务器。
为此,请务必登录。

 policyd-spf unix - nn - 0 spawn user=policyd-spf argv=/usr/bin/policyd-spf 

打开SPF验证。

 apt-get install postfix-policyd-spf-python 

安装上述SPF检查软件包。

 domain1 unix - - n - - smtp -o smtp_bind_address=XX.XX.XX.X1 -o smtp_helo_name=domain1.com -o inet_protocols=all -o smtp_bind_address6=XXXX:XXXX:XXXX:XXXX:1:1:1:1 -o syslog_name=postfix-domain1 

. IPv4/IPv6 .

rDNS. rDNS — - IP .
, helo rDNS , email.

helo , — .

Helo rDNS — .
IP .
OVH — rDNS.
tech.ru — .
AWS — .
“ Inet_protocols”和“ smtp_bind_address6”-这就是我们启用IPv6支持的方式。
对于IPv6,还需要注册rDNS。
“ Syslog_name”-这是为了方便阅读日志。
建议在这里购买证书

在这里设置一堆postfix + dovecot

SPF设置。

==============鸽舍===============


 apt-get install dovecot-imapd dovecot-pop3d dovecot-lmtpd dovecot-mysql dovecot-antispam 

配置mysql,自行安装软件包。

文件“ /etc/dovecot/conf.d/10-auth.conf”

 disable_plaintext_auth = yes auth_mechanisms = plain login 

授权仅加密。

文件“ /etc/dovecot/conf.d/10-mail.conf”

 mail_location = maildir:/var/mail/vhosts/%d/%n 

在这里,我们指出字母的位置。

我希望将它们存储在文件中并按域分组。

文件“ /etc/dovecot/conf.d/10-master.conf”

 service imap-login { inet_listener imap { port = 0 } inet_listener imaps { address = XX.XX.XX.X1, XX.XX.XX.X2, XX.XX.XX.X5, [XXXX:XXXX:XXXX:XXXX:1:1:1:1], [XXXX:XXXX:XXXX:XXXX:1:2:1:1], [XXXX:XXXX:XXXX:XXXX:1:1:5:1] port = 993 ssl = yes } } service pop3-login { inet_listener pop3 { port = 0 } inet_listener pop3s { address = XX.XX.XX.X1, XX.XX.XX.X2, XX.XX.XX.X5, [XXXX:XXXX:XXXX:XXXX:1:1:1:1], [XXXX:XXXX:XXXX:XXXX:1:2:1:1], [XXXX:XXXX:XXXX:XXXX:1:1:5:1] port = 995 ssl = yes } } service lmtp { unix_listener /var/spool/postfix/private/dovecot-lmtp { mode = 0600 user = postfix group = postfix } } service imap { } service pop3 { } service auth { unix_listener auth-userdb { mode = 0600 user = vmail } unix_listener /var/spool/postfix/private/auth { mode = 0666 user = postfix group = postfix } user = dovecot } service auth-worker { user = vmail } service dict { unix_listener dict { } } 

这是主要的鸽舍设置文件。
在这里,我们断开不安全的连接。
并启用安全连接。

文件“ /etc/dovecot/conf.d/10-ssl.conf”

 ssl = required ssl_cert = </etc/nginx/ssl/domain1.com.2018.chained.crt ssl_key = </etc/nginx/ssl/domain1.com.2018.key local XX.XX.XX.X5 { ssl_cert = </etc/nginx/ssl/domain2.com.2018.chained.crt ssl_key = </etc/nginx/ssl/domain2.com.2018.key } 

配置ssl。我们指出需要ssl。
还有证书本身。一个重要的细节是“本地”指令。指示何时连接到哪个本地IPv4-要使用哪个SSL证书。

顺便说一下,此处未配置IPv6,稍后将更正此遗漏作为线程。
XX.XX.XX.X5(域2)-无证书。要连接客户端,必须指定domain1.com。
XX.XX.XX.X2(domain3)-有一个证书,您可以指定domain1.com或domain3.com来连接客户端。
文件“ /etc/dovecot/conf.d/15-lda.conf”

 protocol lda { mail_plugins = $mail_plugins sieve } 

将来对于spamassassin来说是需要的。

文件“ /etc/dovecot/conf.d/20-imap.conf”

 protocol imap { mail_plugins = $mail_plugins antispam } 

这是一个反垃圾邮件插件。从Spam文件夹转移到Spamassasin或从Spam文件夹转移时,有必要对spamassasin进行培训。

文件“ /etc/dovecot/conf.d/20-pop3.conf”

 protocol pop3 { } 

就是这样的文件。

文件“ /etc/dovecot/conf.d/20-lmtp.conf”

 protocol lmtp { mail_plugins = $mail_plugins sieve postmaster_address = admin@domain1.com } 

配置lmtp。

文件“ /etc/dovecot/conf.d/90-antispam.conf”

 plugin { antispam_backend = pipe antispam_trash = Trash;trash antispam_spam = Junk;Spam;SPAM antispam_pipe_program_spam_arg = --spam antispam_pipe_program_notspam_arg = --ham antispam_pipe_program = /usr/bin/sa-learn antispam_pipe_program_args = --username=%Lu } 

从Spam文件夹转移到Spamassasin培训设置。

文件“ /etc/dovecot/conf.d/90-sieve.conf”

 plugin { sieve = ~/.dovecot.sieve sieve_dir = ~/sieve sieve_after = /var/lib/dovecot/sieve/default.sieve } 

指示如何处理传入电子邮件的文件。

文件“ /var/lib/dovecot/sieve/default.sieve”

 require ["fileinto", "mailbox"]; if header :contains "X-Spam-Flag" "YES" { fileinto :create "Spam"; } 

有必要编译文件:“ sievec default.sieve”。

文件“ /etc/dovecot/conf.d/auth-sql.conf.ext”

 passdb { driver = sql args = /etc/dovecot/dovecot-sql.conf.ext } userdb { driver = static args = uid=vmail gid=vmail home=/var/mail/vhosts/%d/%n } 

指定用于授权的sql文件。
文件本身是一种授权方式。

文件“ /etc/dovecot/dovecot-sql.conf.ext”

 driver = mysql connect = host=127.0.0.1 dbname=servermail user=usermail password=password default_pass_scheme = SHA512-CRYPT password_query = SELECT email as user, password FROM virtual_users WHERE email='%u'; 

这对应于后缀的相同设置。

文件“ /etc/dovecot/dovecot.conf”
 protocols = imap lmtp pop3 listen = *, :: dict { } !include conf.d/*.conf !include_try local.conf 

主要配置文件。
重要的是我们在此处指定添加协议。

============= SpamAssassin ==============


 apt-get install spamassassin spamc 

安装软件包。

 adduser spamd --disabled-login 

代表添加用户。

 systemctl enable spamassassin.service 

在启动时打开自动下载spamassassin服务。

文件“ / etc / default / spamassassin”:

 CRON=1 

默认情况下启用规则自动更新。

文件“ /etc/spamassassin/local.cf”:

 report_safe 0 use_bayes 1 bayes_auto_learn 1 bayes_auto_expire 1 bayes_store_module Mail::SpamAssassin::BayesStore::MySQL bayes_sql_dsn DBI:mysql:sa:localhost:3306 bayes_sql_username sa bayes_sql_password password 

必须在mysql中使用用户“ sa”和密码“ password”来创建数据库“ sa”(用适当的替换)。

report_safe-将发送一封有关垃圾邮件的报告,而不是信件。
use_bayes是spamassassin机器学习设置。

其余的spamassassin设置已在本文前面应用。

一般设置为spamassassin
关于将新的垃圾邮件发送到IMAP垃圾邮件文件夹
关于一堆简单的Dovecot + SpamAssassin
我建议在imap文件夹中移动字母时阅读有关学习spamassasin的理论(不建议使用)

==============联系社区==============


我也想向社区提出有关如何提高转发信件安全性的想法。由于我是如此沉浸在邮件主题中。

这样用户可以在其客户端上创建密钥对(外观,雷鸟,浏览器插件等)。公共和私人。公开-发送到DNS。私人-保存到客户端。邮件服务器将能够使用公共密钥发送给特定的收件人。

并且为了防止此类电子邮件发送垃圾邮件(是的,邮件服务器将无法看到内容)-有必要引入3条规则:

  1. 强制性真实DKIM签名,强制性SPF,强制性rDNS。
  2. 客户端上有关反垃圾邮件培训+ DB的神经网络。
  3. 加密算法应确保发送方在加密上花费的CPU能力比接收方多100倍。

除了公开信-制定标准的邀请函“开始进行安全通信”。一个用户(邮箱)将一封带有附件的信发送到另一个邮箱。在信函中,建议以文本形式启动安全的通信通道,以进行通信和邮箱所有者的公钥(在客户端具有私钥)。

您甚至可以为每个对应关系专门制作一对键。接收者用户可以接受此要约并发送其公共密钥(也专门为此通信而制成)。接下来,第一用户发送服务控制信件(用第二用户的公共密钥加密)-收到第二用户可以认为所形成的通信信道可靠的服务控制信件。然后,第二个用户发送一个控制字母-然后,第一个用户也可以将所形成的频道视为受保护的频道。

为了防止道路上的钥匙被窃听,在协议中必须提供使用闪存驱动器传输至少一个公共钥匙的可能性。

最重要的是,这一切都起作用(问题是“谁来为此付费?”):
推出价值10美元的邮件证书,期限为3年。这将使发件人在dns中指示“我的公钥在那里”。他们将提供机会开始安全连接。同时,免费服用此类化合物。
gmail最终通过其用户获利。3年内,只需10美元,即可创建安全的通讯渠道。

=============结论=============


为了测试整篇文章,我打算租用一个专用服务器一个月,然后购买带有ssl证书的域。

但是生活条件发展了,所以这个问题拖了两个月。
当空闲时间再次出现时-我决定按原样发布该文章,而不必冒险将发布推迟一年。

如果有很多类似“但是没有足够详细地描述”的问题-那么可能会迫使采用带有新域和新SSL证书的专用服务器并进行更详细地描述,最重要的是-确定所有缺少的重要细节。

我也希望收到有关邮件证书的想法的反馈。如果您喜欢这个主意,我将尽力为RFC撰写草案。

— .
— .
.

Source: https://habr.com/ru/post/zh-CN413689/


All Articles