https://github.com/masa23/arcmilter
A milter that performs DKIM and ARC signatures.
https://github.com/masa23/arcmilter
arc dkim golang mail milter
Last synced: about 1 month ago
JSON representation
A milter that performs DKIM and ARC signatures.
- Host: GitHub
- URL: https://github.com/masa23/arcmilter
- Owner: masa23
- License: mit
- Created: 2024-08-17T05:49:54.000Z (almost 2 years ago)
- Default Branch: main
- Last Pushed: 2026-01-23T04:59:49.000Z (5 months ago)
- Last Synced: 2026-01-23T22:14:23.620Z (5 months ago)
- Topics: arc, dkim, golang, mail, milter
- Language: Go
- Homepage:
- Size: 196 KB
- Stars: 9
- Watchers: 1
- Forks: 1
- Open Issues: 2
-
Metadata Files:
- Readme: README.ja.md
- Changelog: CHANGELOG.md
- License: LICENSE
Awesome Lists containing this project
README
# arcmilter [](https://goreportcard.com/report/github.com/masa23/arcmilter) [](https://godoc.org/github.com/masa23/arcmilter) [](https://raw.githubusercontent.com/masa23/arcmilter/main/LICENSE)
* [日本語](README.ja.md)
* [English](README.md)
DKIM署名およびARCの署名を行うmilterです。
[RFC6376](https://datatracker.ietf.org/doc/html/rfc6376)、[RFC8617](https://datatracker.ietf.org/doc/html/rfc8617)に準拠させたつもりですが、
個人での利用を想定しているため、実際の運用には十分なテストが必要です。
フィードバックやプルリクエストをお待ちしています。
## 署名条件
* DKIM
* Fromのドメインの秘密鍵があれば署名する
* すでにDKIM署名済のメールは署名しない
* ARC
* Rcpt-Toのドメインの秘密鍵があれば受信時に署名する
* 送信時には署名しない
## インストール
### バイナリインストール
* リリースページからバイナリをダウンロードしてください。
* [リリースページ](https://github.com/masa23/arcmilter/releases/latest/)
* CentOS/RHELの場合は、以下のコマンドでインストールできます。
``` bash
# rpm -ivh arcmilter_*_amd64.rpm
```
* Debian/Ubuntuの場合は、以下のコマンドでインストールできます。
``` bash
# dpkg -i arcmilter_*_amd64.deb
```
### 手動ビルド&インストール
* golangが入ってる環境が必要です。
``` bash
# git clone github.com/masa23/arcmilter
# (cd arcmilter/cmd/arcmilter && go build)
# install -m 700 arcmilter/cmd/arcmilter/arcmilter /usr/local/bin/
# install -m 600 arcmilter/cmd/arcmilter/arcmilter.yaml /usr/local/etc/arcmilter.yaml
# sed -e 's#/usr/bin/arcmilter#/usr/local/bin/arcmilter#' -e '#/etc/arcmilter.yaml#/usr/local/etc/arcmilter/arcmilter.yaml#' \
arcmilter/misc/files/arcmilterctl.service > /etc/systemd/system/arcmilterctl.service
# systemctl daemon-reload
```
## 設定
* 設定ファイル
``` bash
# vi /etc/arcmilter/arcmilter.yaml
MilterListen:
Network: tcp
Address: 127.0.0.1:10029
#MilterListen:
# Network: unix
# Address: /var/run/arcmilter.sock
# Mode: 0600
# Owner: postfix # デフォルト: 実行ユーザ
# Group: postfix # デフォルト: 実行グループ
ControlSocketFile:
Path: /var/run/arcmilterctl.sock
Mode: 0600
PIDFile:
Path: /var/run/arcmilter.pid
LogFile:
Path: /var/log/arcmilter.log
Mode: 0600
MyNetworks:
- 127.0.0.0/8
- ::1/128
Domains:
# ドメイン名は以下のパターンマッチング構文で指定できます:
#
# 1. 完全一致: "example.jp" - 完全一致するドメインのみ
# 2. ワイルドカード: "*.example.jp" - example.jp およびそのサブドメインにマッチ
# 3. デフォルト: "*" - どのパターンにもマッチしない場合に使用
#
# マッチングの優先順位: 完全一致 > ワイルドカード(より具体的なもの) > デフォルト
#
# 複数のドメイン・パターンをカンマ区切りで一括指定することもできます:
# "list:example.com,sub.example.com,*.example.net"
#
"example.jp": # DKIM署名するFromのドメイン、ARC署名するRcpt-Toのドメイン
HeaderCanonicalization: "relaxed" # ヘッダの正規化方法
BodyCanonicalization: "relaxed" # ボディの正規化方法
Selector: "default" # セレクタ
PrivateKeyFile: "/etc/arcmilter/keys/example.jp.key" # 秘密鍵のパス
DKIM: true # DKIM署名を行うか
ARC: true # ARC署名を行うか
"example.com": # 複数のドメインを設定可能
HeaderBodyCanonicalization: "relaxed"
BodyCanonicalization: "relaxed"
Selector: "default"
ARCSelector: "default"
PrivateKeyFile: "/etc/arcmilter/keys/example.com.key"
DKIM: true
ARC: true
User: mail # milterの子プロセス実行ユーザ デフォルト: 実行ユーザ
Group: mail # milterの子プロセス実行グループ デフォルト: 実行グループ
ARCSignHeaders: # ARC署名するヘッダ
- "DKIM-Signature"
- "Date"
- "From"
- "To"
- "Message-Id"
DKIMSignHeaders: # DKIM署名するヘッダ
- "Date"
- "From"
- "To"
- "Reply-To"
- "Message-ID"
- "Subject"
Debug: false
```
* 秘密鍵の生成
``` bash
# openssl genpkey -algorithm rsa -out /etc/arcmilter/keys/example.jp.key -pkeyopt rsa_keygen_bits:2048
```
* 公開鍵の生成
``` bash
# openssl pkey -in /etc/arcmilter/keys/example.jp.key -pubout -out /etc/arcmilter/keys/example.jp.pub
```
* DNSレコードの設定
``` bash
# openssl pkey -in /etc/arcmilter/keys/example.jp.pub -pubin -outform DER | openssl base64 -A | tr -d '\n' | fold -w 120 | sed -e 's/^/"/g' -e 's/$/"/g'
```
* DNSレコードの例
``` zonefile
._domainkey IN TXT ("v=DKIM1; h=sha256; k=rsa; p="
"MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAxBYDpP2LvLICZKSyzA9noR39zm8FGi2F2f83zldwvxyqaKgnmJ0sNsx86zfcbF1JosTLVXdyPE/u"
"eaILXQ4CLK065m39NTv+UzIyg1Jsp9KeOnfia1/Bn3dYjLV/Ix84SwMtP15k7zY+2l4or38/uyhTGFpLF/bET2LlP8eBxXHtg6t1A798qR4/ZGVauKCDkbye"
"YHjGJ6DktYmjk9Cv2DC7x3SYekHjGQMamswHZl7kYlKgiZKDVevXWcd5IFWONOObzZdgO2boDf/wrqS1eA0BFstbTRdENj1tH573pku3vrOPfJF123E8h6ii"
"86jISHmtWg500WPJ8LB8Gzc7CQIDAQAB")
```
## 起動
``` bash
# systemctl start arcmilter.service
```
## Postfixの設定例
``` bash
# vi /etc/postfix/main.cf
TCPの場合
smtpd_milters = inet:127.0.0.1:10029
UNIXソケットの場合
smtpd_milters = unix:/var/run/arcmilter.sock
```
## Thanks!
以下の外部ライブラリを使用しています。
* [d--j/go-milter](https://github.com/d--j/go-milter)
* [k0kubun/pp](https://github.com/k0kubun/pp)
* [yaml.v3](https://gopkg.in/yaml.v3)
以下のライブラリは制作に当たって参考にさせていただきました。
* [emersion/go-msgauth](https://github.com/emersion/go-msgauth/)