blastengineでDKIM作成者署名を設定する

この記事は[「意外な落とし穴！？ Webサービスに必須のメール送信機能の実装ナレッジ・運用ノウハウ・失敗談などあなたのTipsを投稿してください！ by blastengine Advent Calendar 2023](https://qiita.com/advent-calendar/2023/blastengine)」16日目の記事です。

blastengineのDKIM作成者署名の具体的な設定手順がわからなかったので調べながら試しました。**blastengineでは秘密鍵をPKCS#8形式で登録する必要があるようで、形式を誤ると以下のようなエラーになります。**

![2023-12-21_18h20_38.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/47737/3acab249-7de4-cae7-e112-ee8c1081fbdf.png)

ということで、PKCS#8形式で登録する手順を紹介します。

## DKIM作成者署名の設定

画面右上の「設定」を開くと以下の画面になるので、DKIM作成者署名の設定に表示されている「確認・変更」を押します。

![2023-12-22_21h08_59.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/47737/83643dc1-b798-fd03-7108-07f87ee52790.png)

ダイアログが表示されたら「新規登録」を選びます。

![2023-12-22_21h15_31.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/47737/e7b4a58c-9132-864a-c5ac-1d5e74cfd14e.png)

以下の画面が表示されるので、DKIMのセレクタとドメイン、そして秘密鍵を登録します。

![2023-12-22_21h15_44.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/47737/5b273cfa-c28f-94b0-49a6-83a29807273f.png)

今回は

- セレクタ：dkim
- ドメイン：kikutaro.tech

としました。

![2023-12-22_21h17_26.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/47737/d07900fb-469e-5574-ac71-dd0608fa1fbb.png)

## 秘密鍵の生成

まずは秘密鍵を生成します。opensslコマンドを使った例です。

```bash
> openssl genrsa 2048 > private.key
> cat private.key

-----BEGIN RSA PRIVATE KEY-----
MIIEpAIBAAKCAQEA1uakNHIzYJNR9+y/VWsX6KapJUapsFRhpYLVxMaBfC4mspsN
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
Uxy/dM8zgU2LJNUWecYG58E98LMzl/bb7TNOuyx5TkTmkhB/mFc9Vw==
-----END RSA PRIVATE KEY-----
```

## 秘密鍵をPKCS#8形式に変換

先ほど生成した秘密鍵をPKCS#8形式に変換します。最初に紹介したエラーはこの変換を行っていないために発生していました。

```bash
> openssl pkcs8 -topk8 -in private.key -out private_pkcs8.key -nocrypt
> cat private_pkcs8.key 

-----BEGIN PRIVATE KEY-----
MIIEvgIBADANBgkqhkiG9w0BAQEFAASCBKgwggSkAgEAAoIBAQDW5qQ0cjNgk1H3
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
9tvtM067LHlOROaSEH+YVz1X
-----END PRIVATE KEY-----
```

private.keyとprivate_pkcs8.keyの形式をみると差がわかるのですが、前者は開始と終了が「BEGIN RSA PRIVATE KEY」「END RSA PRIVATE KEY」なのに対して後者はRSAのない「BEGIN PRIVATE KEY」「END PRIVATE KEY」となっています。

## blastengineに登録

セレクタ・ドメインの下の秘密鍵に入力して確認ボタンを押すと以下のダイアログが表示されます。

![2023-12-22_21h26_29.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/47737/600f54f4-9db9-3d67-a48c-fe5618527097.png)

追加ボタンを押したら登録完了です。

## 公開鍵の生成

続けて公開鍵を生成します。

```bash
> cat private_pkcs8.key | openssl rsa -pubout > public_pkcs8.key
> cat public_pkcs8.key

-----BEGIN PUBLIC KEY-----
MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA1uakNHIzYJNR9+y/VWsX
6KapJUapsFRhpYLVxMaBfC4mspsNc3FjpV9kHjsKaVtYSvi1IYWdKFYUodvlF0mU
0kRFE0RhWJja4pusCAkVV82ihfmlrti4Azu9hQE1vQFHq9j1hqsg4mDeAngWsXNd
D5kOSgPh/oYxGedIdZOYU7taaRoX2Sgx7vPAGwiL9cP9cayezn3ZWLRf3YD9xwiw
hMVnlo18gkYe/BfQitqGDHXb+zA8uNwo/f8PXyrfA7/iTE6FqJanGchyy17RcD7h
w5d7atVtETnnzcJKUoi2A9BtK3UCFi3e0lBrbbUPgbjgS4KR3axuOl4geYM+SaZG
AwIDAQAB
-----END PUBLIC KEY-----
```

## 公開鍵をDNSサーバのTXTレコードに登録

公開鍵をDKIMレコードに登録します。ホスト名はFQDNに表示されていたdkim._domainkey.kikutaro.techでTYPEはTXT、VALUEには[DKIM](https://salt.iajapan.org/wpmu/anti_spam/admin/tech/explanation/dkim/)のタグを使って定義します。

![2023-12-22_21h23_25.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/47737/e8df7895-155e-7f59-d11a-9a2fc70fecd2.png)

## OpenDKIMを使う場合

さきほどはopensslを使いましたがOpenDKIMでも同様のことができます。opendkim-genkeyで秘密鍵を生成すればよく、あとの手順は前述の「秘密鍵をPKCS#8形式に変換」以降と同じです。

```
> sudo apt-get install opendkim
> sudo apt-get install opendkim-tools
> opendkim-genkey -d kikutaro.tech -d . -s dkim

> ls
dkim.private  dkim.txt
```

## メールの確認

### DKIM作成者署名の設定前

besender-s.jpドメインでDKIM署名がPASSしていました。
![2023-12-22_21h35_38.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/47737/e1b593a5-533d-d91c-06b5-0dc542448b46.png)

### DKIM作成者署名の設定後

設定したドメインkikutaro.techでDKIM署名がPASSしています。
![2023-12-22_21h35_45.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/47737/e53ba790-8bc1-f5fa-c069-b5a1978b060b.png)

以上、blastengineでDKIM作成者署名を設定する方法の紹介でした。