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通信を行うことができます。