0
0

(調査中)Javaのkeytoolを使ったキーストアとトラストストアの処理(PKCSを使った例)

Last updated at Posted at 2024-05-26

PKCS(Public-Key Cryptography Standards)を使用した例を見てみましょう。特に、PKCS#12フォーマットを使ってキーストアとトラストストアを管理し、JavaでのSSL通信に利用する方法を説明します。

基本概念

キーストア (Keystore):

自分の証明書と秘密鍵を格納するための場所です。
クライアント認証を行う際に、自分自身を証明するために使用します。

トラストストア (Truststore):

信頼できる証明書、特にサーバーの証明書や証明書を発行する認証局 (CA) の証明書を格納します。
サーバーとの通信を確立する際に、サーバーの証明書が信頼できるかどうかを検証するために使用します。

PKCS#12のキーストアとトラストストアの作成

1. キーストアの作成

OpenSSLを使って秘密鍵と証明書を生成:

openssl req -newkey rsa:2048 -nodes -keyout client-key.pem -x509 -days 365 -out client-cert.pem

PKCS#12フォーマットのキーストアに変換:

openssl pkcs12 -export -in client-cert.pem -inkey client-key.pem -out client-keystore.p12 -name client-cert

2. トラストストアの作成

openssl pkcs12 -export -in server-cert.pem -out server-truststore.p12 -name server-cert

Javaプログラムでの使用

以下は、PKCS#12フォーマットのキーストアとトラストストアを使用してSSL通信を行うJavaプログラムの例です。

import javax.net.ssl.*;
import java.security.KeyStore;
import java.io.FileInputStream;

public class SSLClientPKCS12 {

    public static void main(String[] args) throws Exception {
        // PKCS#12キーストアの設定
        KeyStore keyStore = KeyStore.getInstance("PKCS12");
        try (FileInputStream keyStoreStream = new FileInputStream("client-keystore.p12")) {
            keyStore.load(keyStoreStream, "keystorePassword".toCharArray());
        }
        
        KeyManagerFactory keyManagerFactory = KeyManagerFactory.getInstance("SunX509");
        keyManagerFactory.init(keyStore, "keyPassword".toCharArray());
        
        // PKCS#12トラストストアの設定
        KeyStore trustStore = KeyStore.getInstance("PKCS12");
        try (FileInputStream trustStoreStream = new FileInputStream("server-truststore.p12")) {
            trustStore.load(trustStoreStream, "truststorePassword".toCharArray());
        }
        
        TrustManagerFactory trustManagerFactory = TrustManagerFactory.getInstance("SunX509");
        trustManagerFactory.init(trustStore);
        
        // SSLコンテキストの設定
        SSLContext sslContext = SSLContext.getInstance("TLS");
        sslContext.init(keyManagerFactory.getKeyManagers(), trustManagerFactory.getTrustManagers(), null);
        
        SSLSocketFactory sslSocketFactory = sslContext.getSocketFactory();
        try (SSLSocket sslSocket = (SSLSocket) sslSocketFactory.createSocket("serverHost", 443)) {
            // 通信処理
            sslSocket.startHandshake();
            
            // 通信の実行コードは省略
        }
    }
}

解説

PKCS#12キーストアのロード:

KeyStore.getInstance("PKCS12")を使用して、PKCS#12フォーマットのキーストアをロードします。キーストアにはクライアント証明書と秘密鍵が含まれています。

PKCS#12トラストストアのロード:

同様に、PKCS#12フォーマットのトラストストアをロードします。トラストストアには信頼するサーバーの証明書が含まれています。

SSLコンテキストの初期化:

キーマネージャーとトラストマネージャーを使用してSSLコンテキストを初期化します。

SSLソケットの作成と通信:

SSLソケットを作成し、サーバーとの安全な通信を確立します。

これにより、PKCS#12フォーマットのキーストアとトラストストアを利用して、クライアント証明書を使ったSSL通信を行うことができます。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0