✍️blog

技術系のこととか

Springですべてのレスポンスに任意のHTTPヘッダを追加したい

様々な事情からレスポンスに任意のHTTPヘッダを追加したいことがあるかと思います。
それも、特定のパスだけではなくすべてのレスポンスに対してという。

Spring内ではなくリバースプロキシとかアプリの前段階で付与というパターンもあるような気もしますが、
Interceptorを使って実装することがあったので残しておきます。

前提

  • Spring Boot 2.7.4

Interceptorの準備

以下のような形でInterceptorを用意します。
ヘッダーの追加はpostHandleで行います。

// ※)importなど細かい部分は省略しています。  

public class HeaderAppendInterceptor implements HandlerInterceptor {

    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView mav) throws Exception {

        response.addHeader("Custom-Header", "hoge");  
    }
}

InterceptorをBean登録

Configクラスで作成したInterceptorをBean登録します。

@Configuration
public class AppConfig {

@Bean
HeaderAppendInterceptor headerAppendInterceptor() {
  return new HeaderAppendInterceptor();
}

InterceptorをRegistryに登録

Interceptorとして機能するようにRegistryに登録します。

@Configuration
public class InterceptorConfig implements WebMvcConfigurer {

  @Autowired
  HeaderAppendInterceptor headerAppendInterceptor;
  
  @Override
  public void addInterceptors(InterceptorRegistry registry) {
    // その他にレスポンスを変更するInterceptorがある場合は追加する順番に注意
    registry.addInterceptor(headerAppendInterceptor);
  }
}

以上の処理を加えてアプリを動かせば、レスポンスにInterceptorで追加したヘッダーが入っているかと思います。

まとめ

たぶん、Springをそこそこやっている人ならInterceptorでやれるというぐらいの
アイディアは普通に思いつくと思うんだ...

via GIPHY

開発用のメールサーバー(SMTP)を用意したい

メール送信を行う機能を開発しているときになかなか正式なメールサーバーは使えず(特に開発初期だと)、
環境の用意に苦しむわけですが、最近たまたまよさげなツールを見つけました。
もしかすると割とメジャーなツールなのかもしれませんけど。。。

その名も「smtp4dev」です。
まさに開発用と言わんばかりの命名に心打たれましたw
github.com

Windows以外にもmaclinuxでも使えるみたいです。

TL;DR

wikiページが割と充実しているので、使い方はこれ見れば十分ですw

github.com

インストール

リリースページからダウンロードできます。
試していませんが、dockerコンテナもあるらしい。

github.com

今回はWindowsのDesktop app版を使用します。

暗号化なしのSMTPサーバーとして起動

Rnwood.Smtp4dev.Desktop.exeを実行します。

こんな感じの画面が表示されるかと思います。
おめでとうございます。SMTPサーバーが起動しましたw

SMTP 25ポート、IMAP 143ポートで起動しています。

今回は試しにThunderbirdで送信を確認します。

Thunderbirdにはこんな感じでメールアドレスとかは適当に設定すればよいです。

別に特別なことは何もないですねw

メールを適当に作成して送信します。 パスワードとか聞かれた場合は適当な文字を入れてあげればよいです。

正しく送信できていれば、以下のような感じでメールがアプリの画面に表示されます。

もちろん開発用のサーバーなので、「Source」を選べば簡単にメールヘッダなど全体を確認できます。

TLSアリのSMTPメールサーバーとして起動

正直ただの暗号化なしの開発用のSMTPサーバーは探せば割とありますが、
TLSに対応しているものは少ないです。

STARTTLSとImplicit TLSに対応しているらしいです。
個人的にはSTARTTLSしか使用したことないので、STARTTLSを試してみたいと思います。

smtp4devはappsettings.jsonを変更、コマンドラインオプション、環境変数で設定を行います。

今回はappsettings.jsonを編集しますが、編集するファイルは %APPDATA%\smtp4dev\appsettings.jsonです。
(1回アプリを起動させるとこのファイルができるはずです。)

TlsModeの設定を以下のようにします。
TLSの証明書は設定されなければ勝手に自己証明書を作成してくれます。
開発用であればたいていの場合は自己証明書だと思うのでこれはありがたいですね。

{
  "ServerOptions": {
...
    "TlsMode": "StartTls",
....
  },
...
}

Thunderbirdの設定は以下のような感じでSMTPの方はSTARTTLSとします。

適当にメールを書いて送信しようとするとこんな感じで警告されます。
ちゃんとTLSが動いているということですね。

そのまま強引に送信しようとすると1回はエラーになりますが再度送信しようとするとちゃんと送信できているかと思います。

まとめ

こんな感じでSTARTTLSに対応したサーバーを構築できます。
(構築ってほど何かしているわけではないですけど。。。)

smtp4devはこのほかにもいろいろ機能があるような気がしますが、アプリ開発で使う分には
大抵TLSでメールが送れれば十分ですかね。

ちなみに、個人的にsmtp4devのデスクトップアプリ版の残念?なところとして
別にインストールアプリでもないのに一度アプリを起動するとスタートメニューにsmtp4devが追加されてしまいます。
まぁ、別にいいんだけど。。。

via GIPHY

SSH用の鍵の作り方もそろそろ覚えたい

先週、オレオレ証明書の作成方法をまとめながらそういえばSSHで使ってる鍵も調べるよなと思ったのでまとめておきます。

sabiz.hateblo.jp

前提

Windowsに標準で入っているOpenSSHを使用します。

鍵の生成

速度及び、強度的にRSAより良いとされている?ED25519を使用した鍵を生成します。

ssh-keygen -t ed25519 -f ssh_key

パスフレーズを聞かれるので、必要であれば入力します。

出力されたssh_key秘密鍵ssh_key.pubが公開鍵のファイルとなります。

おまけ

クラウド環境用であれTerraformでインスタンスの設定と
同時に鍵の生成もしてあげた方が何かと便利なのでTerraformでの鍵の作成方法です。

# 秘密鍵
resource "tls_private_key" "private_key" {
  algorithm = "ED25519"
}

# 秘密鍵ファイル
resource "local_file" "private_key_file" { 
  filename = "${path.module}/ssh_key"
  content = tls_private_key.private_key.private_key_openssh
}

# 公開鍵ファイル
resource "local_file" "public_key_file" { 
  filename = "${path.module}/ssh_key.pub"
  content = tls_private_key.private_key.public_key_openssh
}

こんな感じのtfファイルをapplyしてあげると秘密鍵と公開鍵のファイルが生成されます。

というか、まとめるほどでもないぐらいにシンプルだよなSSH鍵の生成って...

via GIPHY

そろそろオレオレ証明書の作り方を覚えたい

これまでおそらく1万回以上はググっているだろうオレオレ証明書の作成方法をまとめておきます。
この手の解説記事は五万とありますが、自分向けの備忘録として残します。

前提

秘密鍵の作成

openssl genrsa -out private_key.pem {ビット数}

証明書署名要求(CSR)の作成

openssl req -new -key private_key.pem -out csr.pem

以下のような質問を聞かれますが何も入力せずスルーします。

Country Name (2 letter code) [AU]:
State or Province Name (full name) [Some-State]:
Locality Name (eg, city) []:
Organization Name (eg, company) [Internet Widgits Pty Ltd]:
Organizational Unit Name (eg, section) []:
Common Name (e.g. server FQDN or YOUR name) []:
Email Address []:

Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:
An optional company name []:

証明書の作成

有効期間10年で作成しています。

openssl x509 -req -days 3650 -signkey private_key.pem -in csr.pem -out cert.pem

ちなみに、以下のコマンドならCSRなしで証明書発行できるはずです。
エラーが出ますが発行者が空の証明書が作成されます。

openssl req -x509 -key .\private_key.pem -subj /O= -out cert.pem

証明書の確認

以下のコマンドで証明書の中身を確認できます。

openssl x509 -text -in cert.pem

Windowsであれば、拡張子を.crtに変えてあげれば証明書をそのまま開くことができて情報を確認できます。


これでもう、オレオレ証明書の作成はいつでも問題ないですね。

via GIPHY