yuusuke-roughの日記

Java,SpringBoot,趣味等

SSL証明書の更新

はじめに

備忘録に近いブログですので、近況は最後に書きます。

 

いずれ理解したい知識

ちゃんと理解するSSL/TLS 前編 #Security - Qiita

 

acme.shによる手動での更新

GitHub - acmesh-official/acme.sh: A pure Unix shell script implementing ACME client protocol

 

以前の記事と同様にkeyファイルとcerファイルを合成し、pfxファイルを生成しました。

Let’sEncryptでNginxとHTTPS通信を行った in Amazon Linux 2 - yuusuke-roughの日記

 

 

近況

会社にも慣れてきたと思います。

現在はRuby on RailsとReactを研修で使用しており、一月よりOJTに入ります。

信じてきてよかったと思うと同時に、頂いた機会に応えられるよう頑張ろうと思った12月でした。

 

さて、私の作成しているアプリケーションですが、1月リリース予定です。

最初は小規模で利用してもらい、システムの改善を行っていきます。

最終的に知人経由で利用者は100~200人となる予定です。

他、アプリケーションに留まらない展開を考えていますが、まずは、私ができないといけないので仕事もこなせるよう時間配分してます。

Reactの環境構築 in Ubuntu

内容

Reactの環境を構築していきます。

 

Windows での React のインストール | Microsoft Learn

 

Ubuntuのパスワードを忘れたらこちら

wsl でパスワードを忘れてしまった際の対処 #WSL - Qiita

 

WSL 2 上で Node.jis を設定する | Microsoft Learn

Remote Development - Visual Studio Marketplace

 

...特に記載する点はありませんでしたが、久しぶりのWSL起動で仮想プラットフォームがオフになっているのに気づかず、ハマりかけました。

IP2Locationでハマった経過①

 

【内容】

製作しているアプリが国内からのみのアクセスを想定しているため、先週から海外IPを弾く実装をする挑戦をしていました。

https://blog.ip2location.com/knowledge-base/how-to-use-ip2location-geolocation-with-nginx/

動的モジュールとしてNginxに取り入れるため、-dynamicをつける事以外は、上記記事と同じ実装をしました。

nginx: [emerg] module "/usr/local/lib/ngx_http_ip2location_module.so" is not binary compatible in /etc/nginx/nginx.conf:9

出てきたのが、上記エラー...

調べると、

is not binary compatible · Issue #82 · leev/ngx_http_geoip2_module · GitHub

NginxのフラグをIP2Locationをビルドする際にも取り込まなくてはいけないようです。

 

nginx-1.9.11で動的モジュールをサポート - インフラエンジニアway - Powered by HEARTBEATS

 

→会社の方からIPアドレスホワイトリストで実装する方法を教えていただきました。

 

【余談】

JavaGoldの学習も行います。

JavaSilverを受けたのは二年前で、忘れてしまい危機感を持ちました。

 

フィールドやメソッドにおけるstaticの仕組み

・クラスがロードされたタイミングでstatic領域に配置

インスタンス生成無しで利用可

※通常のクラスはヒープ領域にインスタンスを生成する

 

ローカルクラス

・修飾子はfinalとabstractのみ許可される

・ローカルクラスを宣言したメソッドのローカル変数を扱うための条件は

①変数は実質的にfinalでないといけない。

②変数の宣言はローカルクラスの記述の前にされている事。

 

リレーションを含めたレコード検索を行う with JPQL in Spring Boot

 

目的

RDBMSを使用し、一対多の関係にある子テーブルから特定のレコードを取り出す。

取り出す条件には、子レコードの値に加え、リレーションのある親レコードの値も対象とする。

 

内容

 

Spring Data JPA - リファレンスドキュメント

【Spring Data JPA】自動実装されるメソッドの命名ルール - Qiita

上記のようにJPAでは、一つのテーブルへの検索は既に用意されているメソッドの組み合わせで問い合わせができる。

しかし、内部結合をしたうえで検索条件を適用しなくてはいけない今回のような場合はJPQLの使用が必要となる。

 

Spring Data JPA @Query | Baeldung

エイリアスを指定する(直でテーブル名を指定するとエラーがでました。後日、調査予定)

プレースホルダーは「?1」のように記述する

 

...あまり書く事がありませんでした。

 

感想

SQLとは違いますが、書けると実装の幅が広がるので試して良かったと思います。

設計の重要性についてひしひしと感じる毎日です。

 

関係ない話

一分チェスを息抜きにしていたのですが、短い時間で相手を出し抜く手が浮かんだ時は嬉しいですが、そんなにポンポン浮かびません。

パズルは無料会員なので一日数問まで。それでも、レート2100くらいだとすぐ解法が浮かぶので、戦略の問題かなと思います。そうなると、チェスの本や動画を観て、ちゃんと時間を割かなくてはいけなくなるので迷いどころです。(東京だと沢山できるところがありそうなので、時間さえ許せばありなのでしょうが...)

裏を返すと、今は、基本的にミスをするしないの勝負しかしていないのかなと落ち込みます。

Let’sEncryptでNginxとHTTPS通信を行った in Amazon Linux 2

Let’sEncryptを使用してCertBotの使用を試みましたが、snapdのインストールが出来ず断念しました。

代わりに、acme.shによるSSL証明書の発行をして、Nginxへの設定を行いました。

今回は、単純に悔しかったので自戒を込めて記録に残します。

初めて読むと情報量の多さと慣れないLinuxの操作に辟易しますが、要はLet’sEncryptの操作の仕組みに合わせて、acme.shで設定していきます。

 

Let'sEcryptとは

Let's Encrypt - フリーな SSL/TLS 証明書

CertBotとは

Certbot

acme.shとは

GitHub - acmesh-official/acme.sh: A pure Unix shell script implementing ACME client protocol

 

前記事からの続きです。

以上で、クライアント-Nginx間はHttps、Nginx-アプリケーション間はHttpという状況になりました。

そして、発生したエラーがMixedContent

This request has been blocked; the content must be served over HTTPS.

 

Nginx-アプリケーション間もHttpsにする必要性がでたので、組み込みTomcat側でも設定を行います。

権限は一般ユーザーで実行する事を考え、ポートは8443とします。

設定についてはこちらを参照しました。

Securing Spring Boot Applications With SSL

Spring bootでSSL(HTTPS)を有効にする - Qiita

Let’sEncryptで用意していたSSL証明書はCRTファイルとKEYファイルで構成されていました。しかし、上記サイトにある通り、pfx形式での設定が必要です。

pfxは、CRTファイルとKEYファイルの合成で作成できるので、OpenSSLで実行します。

パスワードの設定を求められるので、設定し、これらをSpring Boot側に設定します。

 

以上で、Httpsの通信ができました。

 

続いての問題が、WebSocket部分が全く動作しない事です。

WebSocketは通信時にハンドシェイクというものを行います。

WebSocket についてまとめてみる - Qiita

この、wssプロトコルでの最初の接続がうまくいきませんでした。

理由はこちら

①ヘッダーの問題

Nginxを用いたWebSocketサーバのReverseProxy構成及びSSL/TLS接続 - tail my trail

②Stompブローカー側の問題

CORSを絶対に理解する

WebSocket API :: Spring Framework - リファレンス

 

Spring Bootアプリケーションのデプロイ with AWS その2

 

JDKのインストール

Amazon Corretto 17 Installation Instructions for Amazon Linux 2 and Amazon Linux 2022 - Amazon Corretto 17

 

SpringBootアプリケーションのデプロイ

Spring Boot アプリケーションのデプロイ - リファレンス

ElasticBeanStalkを使用するのが主流のようですが、今回は使用しません...

 

Jarファイルの設置場所を決めます。

Linuxディレクトリ構造 - Qiita

homeに専用のユーザーをuseraddコマンドで作成し、アプリの実行権限のみを持たせ、ログの管理は別のユーザーで行う事にしました。

SCPでJarファイルを転送します。

 

問題点は、443番ポートや80番ポートは、特権ポートのため、実行にはroot権限が必要なようです。

明日使えない Linux の capabilities の話 - @nojima's blog

よって、(HTTPS化もしたかったので)Nginxを導入しクライアントからは443でListen、Tomcatは8080でListenするものとします。

 

インスタンス起動ごとにIPアドレスが変わってしまうため、ElasticIPを使用します。

Elastic IP アドレス - Amazon Elastic Compute Cloud

 

以下、長くなるためHTTPSの設定は別記事とします。

 

メモ

DNSゾルバーについて

DNSクエリとTTLの関係

DNSレコード