如何使用 OpenDKIM 中的 KeyTable/SigningTable 连接到 MySQL 套接字(不是 TCP)?
需要使用的数据集是“dsn:”,手册上说:
如果字符串以“dsn:”开头,并且 OpenDKIM 库已编译为支持该数据库类型,则字符串的其余部分是数据存储名称,用于描述 ODBC 或 SQL 数据库的类型、位置参数和访问凭据。DSN 的格式为:backend://[user[:pwd]@][port+]host/dbase[/key=value[?...]]
其中 backend 是受支持的后端数据库机制的名称(例如“mysql”),用户和密码是数据库的可选登录凭据,端口和主机描述连接到该数据库的 TCP 连接的目标,dbase 是要访问的数据库的名称,并且 key=value 对必须至少指定“table”、“keycol”和“datacol”值,指定表的名称、要视为键的列的名称以及要视为值的列的名称(以逗号分隔)。例如(所有内容都在一行中):
mysql:://dbuser:dbpass@3306+dbhost/odkim/table=macros?keycol=host?datacol=v1,v2
定义一个在主机“dbhost”上监听端口 3306 的 MySQL 数据库;应使用用户 ID“dbuser”和密码“dbpass”来访问数据库;数据库名称为“odkim”,数据位于表“macros”内的列“host”(键)和“v1”和“v2”(值)中。因此,当找到匹配项时,此示例将返回两个值。
DSN 中的任何值都不能包含用于将 DSN 各部分相互分隔的六个标点符号(“:”、“/”、“@”、“+”、“?”和“=”)。
似乎无法连接到 MySQL 套接字,只能通过 TCP?
答案1
OpenDKIM用途OpenDBX 库用于连接后端数据库,包括 MySQL;目前只有OpenDBX 1.2+ 支持 MySQL 的 UNIX 套接字. OpenDBX 1.1仅支持 PostgreSQL 的 UNIX 套接字。
此外,OpenDKIM 限制其配置使用 DSN 字符串,要求其解析 DSN 字符串分解成各个组成部分(host
,,,...)。port
database
尽管 OpenDBX 可以使用 UNIX 套接字连接到 MySQL,但即使在最新master
(20220402) 分支中,OpenDKIM 也期望/
字符 (在 DSN 后端之后) 作为主机+端口和数据库名称之间的分隔符,而不是 UNIX 套接字路径组件。使用 DSN 值如下:
mysql://user:pass@3306+/path/to/mysql.socket/odkim/table=macros?keycol=host?datacol=v1,v2
应该会导致一个空的主机名(dsn->dsn_host
)并且 OpenDKIM 返回一个错误。
可能会打开一个问题他们的 Github 页面向开发人员提出这一担忧。
答案2
我刚刚设置了 OpenDKIM 以通过其套接字连接到 MySQL。
opendkim
首先,在 MySQL 服务器中创建用户:
CREATE USER 'opendkim'@'localhost' IDENTIFIED VIA unix_socket;
GRANT SELECT ON opendkim.* TO 'opendkim'@'localhost';
并在 opendkim 配置文件(Debian 上为 /etc/opendkim.conf)中添加以下行:
SigningTable dsn:mysql://localhost/opendkim/table=dkim?keycol=domain_name?datacol=id
KeyTable dsn:mysql://localhost/opendkim/table=dkim?keycol=id?datacol=domain_name,selector,private_key
如您所见,您只需定义 MySQL 服务器的主机名(无用户、无密码)localhost
:。
配置 :
- Debian 11
- OpenDKIM 2.11.0(从 apt 安装)
- libopendbx1-mysql 1.4.6
- MariaDB 服务器 10.5.15