BIMIを使ってメールにロゴを表示する方法  (送信者編)

# BIMIを使ってメールにロゴを表示する方法  (送信者編)

## はじめに

送信者から見たBIMIとは、送信者がなりすまされていないときに限り、送信者が指定したロゴを受信者の環境に表示させる仕組みです。

ここでは、送信者としてどうやってロゴを表示させるかについて解説します。

3部作になっていますので、概要、受信側の仕組みについては以下をあわせてご覧ください。

- [概要編](https://qiita.com/hirachan/items/f904edd03abf25a83004): BIMIに至るまでの歴史と概要
- [受信編](https://qiita.com/hirachan/items/4922ae25a3d0602a140a): 受信側としてロゴを表示するための技術仕様
- 送信者編: 送信側としてロゴを表示してもらう方法 (本記事)


## もくじ

- VMC証明書について
- ロゴの形式について
- 自分のロゴを表示させるためのステップ
- 実際にやってみて苦労した話

## VMC証明書について

### VMC証明書とは
VMC証明書とは、簡単に言えばSSLのEV証明書のようなもので、
  - ドメイン名が正しいこと
  - 会社名が正しいこと
  - 実在していること
  - ロゴが正しいこと

を証明します。

### VMC証明書の取得方法

VMC証明書の発行機関は、現在DigicertとEntrustのみしかありません。
また、ロゴは商標登録されている必要がありますので、証明書を取得する前に商標登録しておく必要があります。

### 有効な商標の登録先

商標の登録先は日本の特許庁だけでなく、以下の機関であればどこでも有効です。
日本の特許庁での承認に時間がかかる場合は、海外の機関に登録するという方法もあるそうです。

- 日本の特許庁
- United States Patent and Trademark Office (USPTO)
- Canadian Intellectual Property Office
- European Union Intellectual Property Office
- UK Intellectual Property Office
- Deutsches Patent- und Markenamt
- Spanish Patent and Trademark Office O.A.
- IP Australia


### VMC証明書の利用率

BIMIが使用されているドメインのうち、VMC証明書が使用されているドメインがどのくらいあるのか内訳を調べてみました。

- 調査対象ドメイン: 76
  - 証明書記載あり: 28
    - 不正なa=記述: 6 (なぜかself, certなど)
    - 正しいa=の記述: 22 (30%くらい)
      - 重複排除後の証明書のURL数: 19
        - 存在しないURL: 1
        - 証明書の数: 18
          - DigiCert, Inc.: 12
          - Entrust, Inc.: 5
          - GMO BrightsConsulting Inc.: 1

### VMC証明書は必要なのか

BIMIの仕様ではVMC証明書はオプションです。
受信側は証明書のないロゴを表示しても構いません。

実際、例えばFastmailでは証明書がなくてもロゴが表示されます。
しかし、gmailではVMC証明書がない場合、ロゴは表示されません。

どこに表示させたいかでVMC証明書が必要かどうか判断することになりそうです。


## ロゴの形式について

### ロゴのフォーマット

ロゴのフォーマットは[draft-brand-indicators-for-message-identification](https://datatracker.ietf.org/doc/draft-brand-indicators-for-message-identification/)の[4.2.2 Supported Image Formats for l= tag](https://datatracker.ietf.org/doc/html/draft-brand-indicators-for-message-identification-02#section-4.2.2)に記載されていますが、

- 現時点では、SVG、SVGZのみ利用可能
  ⇨ [RFC6170の5.2](https://www.rfc-editor.org/rfc/rfc6170.html#section-5.2)で定義
- さらに制限がある
- 詳細は別のドキュメントで

という感じで、別のドキュメントを見ろとしか書いてありません。

[RFC6170の5.2](https://www.rfc-editor.org/rfc/rfc6170.html#section-5.2)を確認すると、

- SVGはSVG Tiny Profile + 以下の制約に従う
  - IRI(国際化URI)を参照しない
  - 'script' エレメントを含まない
  - SVGイメージのhashを計算するときは、改行はLFを使用する

だそうです。

また、[General Guidance](https://datatracker.ietf.org/doc/draft-brotman-ietf-bimi-guidance/)の[6.1. Image Display](https://www.ietf.org/archive/id/draft-brotman-ietf-bimi-guidance-06.html#name-image-display)によると、

- ロゴの縦横比については定義されていない
- しかし、正方形や円の領域に表示することを想定
- 1:1の縦横比で表示することを推奨

ということなので、1:1の縦横比で正方形や円の領域に表示させてもいいようなロゴにしておくのがよさそうです。

### 具体的なSVG P/Sのフォーマット

[General Guidance](https://datatracker.ietf.org/doc/draft-brotman-ietf-bimi-guidance/)の[8.2 Adherence to SVG P/S](https://www.ietf.org/archive/id/draft-brotman-ietf-bimi-guidance-06.html#name-adherence-to-svg-p-s)には、SVG P/Sにどのように対応したらいいか書いてあります。

- SVG P/Sに従おうとするといくつかの問題を経験するかも知れません
  - SVG P/SはSVG Tiny 1.2に基づいており、特定のタイプのグラデーションを許可していない
  - SVG Tiny 1.2として変換/保存しようとすると、通常、ラスターファイルが埋め込まれる。
    これはSVG P/Sには準拠しておらず、表示の問題が発生する可能性がある
  - Adobe IllustratorでSVG Tiny 1.2をエクスポートすると、SVGエレメントにアトリビュートx, yを出力するが、SVG P/Sに準拠するためにこれらを削除する必要がある

```xml
<svg x="0px" y="0px">
```

これは、フォーマットエラーなので、x= y=の部分を削除する必要があります。
この場合は、

```xml
<svg>
```

となります。

さらに、[SVG Tiny 1.2 Portable / Secure のドキュメント](https://datatracker.ietf.org/doc/draft-svg-tiny-ps-abrotman/)を調べてみると、`<title>`エレメントが必須ですよ、と書いてあります。

他にもいろいろ書いてありますが、SVGの書式なんてよくわからないので、深追いはやめときます・・・


## メール送信者としてBIMIに対応させるステップ

ここから、具体的に「example.jp」の場合を例にBIMIに対応させてロゴを表示するまでの手順を説明します。

### STEP 1
- Header From, Envelope Fromの両方をexample.jpにする

DMARCのSPFではヘッダFromとEnvelope Fromが一致している必要かありますので、まず、ヘッダFromとEnvelope Fromが揃うように環境を整えます。

### STEP 2
- SPF、DKIM署名を設定する
- DMARCをp=none で記述する
- DMARCのレポートを受け取れるようにする
➔ DMARCがPASS

DMARCがPASSするようにSPF、DKIM、DMARCを設定します。
ただし、不安があると思いますので、まずかp=noneで登録します。
もちろん、自身があればいきなりp=rejectでも大丈夫です。

### STEP 3
- DMARCのレポートを確認して、STEP2までの抜け漏れがないことを確認する

### STEP 3 平行して

- 正方形のロゴを作成する
- ロゴを商標登録する
- ロゴをSVG Tiny P/S形式に変換する
- ロゴをhttpsのサーバにデプロイする

ここでは、ロゴのフォーマットに注意してください。
SVG Tiny 1.2形式で出力しただけでは不十分で、`<title>`エレメントの追加と、

```xml
<svg x="0px" y="0px">
```
のx= y=の部分を削除することが必要です。

### STEP 4
- DMARCのポリシーを p=rejectにする
- BIMIのレコードを記述する (lだけ)

```
default._bimi.example.jp TXT “v=BIMI1; l=https://../ロゴ.svg”
```

BIMI Groupが用意したチェック用のサイトもあるので、確認できます。

チェックサイト: https://bimigroup.org/bimi-generator/


### STEP 4 一部のISPでロゴが表示されます

ここまでの作業で、FastmailなどVMC証明書を必要としないプロバイダでロゴが表示されます。

![fastmail.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/245486/3e790d48-0c9f-075c-0355-df401ff8f0d9.png)

### STEP 5
- 商標登録が終わったらVMC証明書を購入します

### STEP 6
- 証明書をhttpsで公開する
- BIMIのレコードを記述する (lとa)

```
default._bimi.example.jp TXT “v=BIMI1; l=https://.../ロゴ.svg; a=https://.../証明書”
```

### STEP 6 Gmailなどに表示されます

これで、gmailにもロゴが表示されるはずです。

![gmail.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/245486/c7257190-6e6d-9c9e-b854-6c6088b9e24e.png)



## やってみた

実際に`qualitia.co.jp`のドメインをBIMIに対応させてみました。

### はまりポイント１

- 正方形のロゴがない

![qualitia_log.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/245486/9965049f-95c5-a342-c290-7818be933e35.png)


**解決策**

    上下に空白を追加して正方形にしました

### はまりポイント２

- 登録商標されたロゴがない

**解決策**

  - 海外の早そうなところに申請する
  - 商標早期審査・審理を申請
  - など

今回は、「商標早期審査・審理を申請」をしました。

### はまりポイント３

- DMARCでp=rejectにしたのに反映されない

fastmailでAuthentication-Resultsヘッダを確認したところ、以下のようになっていました。

```
Authentication-Results: mx3.messagingengine.com;
arc=none (no signatures found);
bimi=skipped (DMARC Policy is not at enforcement);
dkim=pass (1024-bit rsa key sha256) header.d=qualitia.co.jp
header.i=@qualitia.co.jp header.b=QxKsWdTk header.a=rsa-sha256
header.s=20201023154424 x-bits=1024;
dmarc=pass policy.published-domain-policy=reject
policy.published-subdomain-policy=none policy.applied-disposition=none
policy.evaluated-disposition=none
(p=reject,sp=none,d=none,d.eval=none) policy.policy-from=p
header.from=qualitia.co.jp;
iprev=pass smtp.remote-ip=18.176.5.155 (ag01t.qualitia.co.jp);
spf=pass smtp.mailfrom=mihyon@qualitia.co.jp
smtp.helo=ag01t.qualitia.co.jp;
```

どうやら`sp=none`になっているのでBIMIの認証が失敗しているようです。
ARヘッダのBIMIの結果は`skipped`になっています。

情シスによると、サブドメインはすべてp=noneとして動作させたいということで、

```
_dmarc.qualitia.co.jp TXT v=DMARC1; p=reject; sp=none
```

のような設定にしたそうです。

**解決策**

    組織ドメインは`sp=`を書かずに`p=reject`のみにし、全サブドメインを洗い出して、それぞれにDMARCレコードをp=noneで記述しました。

```
_dmarc.qualitia.co.jp TXT v=DMARC1; p=reject
_dmarc.sub1.qualitia.co.jp TXT v=DMARC1; p=none
_dmarc.sub2.qualitia.co.jp TXT v=DMARC1; p=none
```

### はまりポイント４

- illustratorのSVG Tiny1.2出力そのままでは動かない

![svg_tiny.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/245486/c1b0a3fd-9cec-6ba1-3ff6-a05cd1c7ee6b.png)



### はまりポイント５

- なんか背景が灰色になっている

**解決策**

    背景を白く塗りました

fastmailでは透明背景は灰色になるようです。
ダークモードがあるような環境では黒のロゴは見えないかも知れません。

![fastmail_test1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/245486/22c41c94-d66d-2492-1e4a-7884c9575291.png)



### やっとできました

![fastmail_test2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/245486/a5202f59-8903-5856-5764-00a060769433.png)



Authentication-Resultsヘッダもpassになりました。

```
Authentication-Results: mx2.messagingengine.com;
... snip ...
bimi=pass header.d=qualitia.co.jp header.selector=default;
... snip ...
```

### 商標登録の早期審査選定 Failed!

![shinsa1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/245486/7f381272-7d02-f634-6c47-b4a3cf4d2bdc.png)

まだまだ道は長そうです。
これが2021年10月頃です。

### 商標登録完了！

2021年12月頃、ついに！！登録されました。

![shinsa2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/245486/a99d3571-943f-0e04-0ca1-2b0e8dabe0b3.png)


### あとはお金を払うだけ

入金が確認されたら登録されるそうです。

![shinsa3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/245486/c65f51d6-2f2b-c597-6c62-12871c1c809f.png)


### 商標登録のスケジュール感
- 2021/8/13 出願
- 2022/1/5 登録

早期審査しましたが 約5ヶ月かかりました。

## 証明書の購入

証明書の購入には、SVGのロゴ、商標登録番号が必要です。


### 証明書発行までのプロセス

結論として、以下のようなプロセスで証明書を発行してもらいました。
わりたスムーズに行った方なので、これ以上に時間がかかることもあるかも知れません。

- 申し込み (1/13)
- 会社の存在確認
- 公開されている代表番号に申請者の存在を確認 (1/18)
- 身分証明書の提出 (1/17)
- Zoomで申請者が身分証明書を提示 (1/17)
- Zoomで公証人の目前で申請者情報の書類を記載 (1/20)
- 公証人が承認 (1/20)
- 申請者が契約を承認 (1/21)
- 証明書の発行 (1/21)

### 申込時のはまりポイント

- ロゴのSVGがCR/LFだった

証明書に使うSVGの改行コードはLFである必要があります。

**解決策**

    ファイルの改行コードをLFにしました


### 会社の存在確認でのはまりポイント
- 代表電話番号が留守電になっている

会社の存在を確認するために公的に参照できる体表電話番号に電話がかかってきます。
その際、申請者の存在確認も同時に行われます。
うちの会社の代表電話は常に留守電になっていて、用件を聞いた担当者が折り返す仕組みになっています。
そのため、この、会社の存在確認ができませんでした。

**解決策**

留守電を一時的に解除して、その隙に電話をかけてもらいました。

留守電を解除するタイミングなどについて何度もメールや電話でやり取りしたので、存在を疑われるということはなかったと思うのですが、必要なプロセスです。

ほかには、郵送で確認コードを送ってもらって認証する方法もあるそうですが、こちらの方が時間がかかりそうなので、留守電解除の方法を選択しました。

### 契約の承認のはまりポイント

最後に契約内容に間違いがないかを確認して承認します。
今回は内容が違うところがあったのですが、表示の項目名が違う不具合だそうで、そのまま承認することになりました。

![digicert.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/245486/346a3702-de9d-0b98-46be-b30ad67640ba.png)


### 証明書の発行

発行された証明書をWebサーバに設置し、DNSを設定して完了です。

### Gmailにロゴが出ました

![gmail_success.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/245486/f5a80ecd-c4f5-350c-2bfe-843fa1a3f6e0.png)


### Authentication-Results

Fastmailの場合、`policy.authority`と`policy.authority-uri`という項目が追加されました。

![fastmail_success.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/245486/f9e57e7c-11c7-5fa4-0395-939dd8c1ce13.png)


```
Authentication-Results: mx5.messagingengine.com;
... snip ...
bimi=pass header.d=qualitia.co.jp header.selector=default
policy.authority=pass
policy.authority-uri=https://www.qualitia.co.jp/doc/logo/qualitia.pem;
... snip ...
```

## まとめ

BIMIについて歴史、概要、受信者としての実装プロセス、送信者としてロゴを表示する方法について3回にわたり説明しました。

ぜひ、これを機会にBIMIを使用して、メールにロゴを表示してみましょう。


## 前の発表資料

過去発表した資料も合わせてご参考ください。


本記事の元になった発表資料です。

- JANOG49 : [これから始めるBIMI ～メールにロゴを表示するまでの長い道のり（継続中）～](https://www.janog.gr.jp/meeting/janog49/wp-content/uploads/2021/12/bimi-pre_hirano_20220126.pdf)

送信ドメイン認証技術全般についての資料です。

- JPAAWG 3rd General Meeting: [送信ドメイン認証・暗号化 DeepDive ～ DMARCから MTA-STS, DANEまで全部PASSさせるまでの道のり](https://qiita.com/qualitia_cdev/items/9f01f4151ceafca1ef8d)