🐡

sslめも

2024/11/06に公開

1. SSL/TLS 証明書の取得

SSL/TLS証明書はWebサーバーのHTTPS化に必要で、サイトとユーザー間の通信を暗号化する役割を果たす。証明書は以下のように、信頼された証明書発行機関(CA: Certificate Authority)から取得する方法と、自己署名証明書を自分で作成する方法がある。

  • 商用証明書
    信頼性が高く、特に商用サイトや顧客向けのサービスに適している。DigiCertやGlobalSignといったCAから購入し、認証プロセスを経て発行される。費用がかかるが、一般的なブラウザやクライアントが信頼するため、ユーザーが警告を受けることがない。

  • 無料証明書
    Let's Encryptなどの無料サービスを利用して取得できる。無料のため個人サイトや小規模サイトに適しているが、有効期間が短いため自動更新設定が推奨される。Let's Encryptは広く信頼されており、一般的なブラウザやクライアントでも信頼される。

  • 自己署名証明書
    自分で証明書を発行し、Webサーバーに設定できる。この方法は費用がかからず簡単に発行できるが、一般のユーザーから信頼されないため、ブラウザやクライアントに警告が表示される。自己署名証明書は、内部ネットワークや開発・テスト環境など、外部ユーザーがアクセスしない用途に適している。

自己署名証明書の発行手順

秘密鍵と証明書の作成
OpenSSLなどを使用して自己署名証明書を発行する。例として、OpenSSLで証明書を発行する手順は以下の通り。

openssl req -x509 -newkey rsa:2048 -keyout selfsigned.key -out selfsigned.crt -days 365
  • selfsigned.key: 秘密鍵ファイル
  • selfsigned.crt: 自己署名証明書ファイル
  • -days 365: 証明書の有効期間

3. Apacheでの証明書設定とHTTPS有効化

証明書を取得し、所有確認を完了したら、Apacheで設定を行いHTTPSを有効にする。

証明書のインストール手順

  1. 取得した証明書ファイル(例: server.crt)と秘密鍵ファイル(例: server.key)をサーバーにアップロード。
  2. Apache設定ファイルに以下のように証明書と秘密鍵を指定する。
    <VirtualHost *:443>
        ServerName example.com
        SSLEngine on
        SSLCertificateFile /path/to/server.crt
        SSLCertificateKeyFile /path/to/server.key
        SSLCertificateChainFile /path/to/ca-bundle.crt
    </VirtualHost>
    
    設定後、Apacheを再起動して反映させる。

4. HTTPからHTTPSへのリダイレクト設定

HTTPでアクセスされた際、自動的にHTTPSにリダイレクトする設定を追加することで、すべての通信を安全に保つ。

Apacheでのリダイレクト設定例

以下の設定を追加し、HTTPからHTTPSへのリダイレクトを行う。

<VirtualHost *:80>
    ServerName example.com
    Redirect permanent / https://example.com/
</VirtualHost>

5. RetrofitでのHTTPS接続設定

Spring Bootアプリケーションから外部のHTTPSエンドポイントに接続するには、Retrofitを設定する必要がある。Retrofitを使用する場合、自己署名証明書を利用する場合は証明書の信頼を設定する必要がある。

RetrofitのSSL設定手順

  1. OkHttpClientのSSL設定:自己署名証明書を使用する場合、OkHttpClientでSSL設定を行う。信頼マネージャーをカスタムで設定し、Retrofitに渡す。

    import okhttp3.OkHttpClient;
    import retrofit2.Retrofit;
    import retrofit2.converter.gson.GsonConverterFactory;
    import javax.net.ssl.*;
    import java.security.cert.CertificateException;
    import java.security.cert.X509Certificate;
    
    public class RetrofitClient {
    
        public static Retrofit getClient(String baseUrl) {
            try {
                TrustManager[] trustAllCerts = new TrustManager[]{
                        new X509TrustManager() {
                            public void checkClientTrusted(X509Certificate[] chain, String authType) throws CertificateException {}
                            public void checkServerTrusted(X509Certificate[] chain, String authType) throws CertificateException {}
                            public X509Certificate[] getAcceptedIssuers() { return new X509Certificate[0]; }
                        }
                };
    
                SSLContext sslContext = SSLContext.getInstance("SSL");
                sslContext.init(null, trustAllCerts, new java.security.SecureRandom());
                SSLSocketFactory sslSocketFactory = sslContext.getSocketFactory();
    
                OkHttpClient.Builder builder = new OkHttpClient.Builder();
                builder.sslSocketFactory(sslSocketFactory, (X509TrustManager) trustAllCerts[0]);
                builder.hostnameVerifier((hostname, session) -> true);
    
                OkHttpClient okHttpClient = builder.build();
    
                return new Retrofit.Builder()
                        .baseUrl(baseUrl)
                        .client(okHttpClient)
                        .addConverterFactory(GsonConverterFactory.create())
                        .build();
            } catch (Exception e) {
                throw new RuntimeException(e);
            }
        }
    }
    
    • TrustManagerで自己署名証明書を許可し、ホスト名検証を無効にする(開発環境向け。運用環境では信頼された証明書を使用する)。

6. 証明書の自動更新

Let's Encryptなどの無料証明書は短期間(通常90日)しか有効でないため、自動更新を設定するのが一般的。Certbotなどのツールで設定できる。

Certbotでの自動更新設定

  1. Certbotをインストールする。

    sudo apt install certbot
    
  2. 自動更新の設定を行い、証明書の更新をApacheに反映させる。

    sudo certbot renew --apache
    
  3. 自動更新スケジュールを設定(cronに登録)。

    0 0,12 * * * root certbot renew --quiet
    

7. システム構成図(UML図)

以下のUML図は、Spring BootアプリケーションがRetrofitを用いてApacheサーバーにHTTPSで接続する構成を示す。

┌─────────────────────────────┐                 ┌──────────────────────────────┐
│    Spring Boot Application  │                 │          Apache Server       │
│  ─────────────────────────  │                 │ ──────────────────────────   │
│  │ Retrofit + OkHttpClient │◀─────HTTPS──────▶│     SSL/TLS Certificate      │
│  │(クライアントサイド)     │                 │   (サーバーサイド)         │
└─────────────────────────────┘                 └──────────────────────────────┘
  • クライアント側(Spring Bootアプリ)は、Retrofitを使ってサーバーに接続し、OkHttpClientでSSL/TLS設定を行う。
  • サーバー側(Apache)は、SSL/TLS証明書を設定して、HTTPS通信を提供する。

以上が、Apacheを使ったHTTPSサーバーとSpring BootアプリからのRetrofitでの接続に必要な詳細な手順と設定内容。

Discussion