クライアント マシンでデータに署名して暗号化する必要があります。その後、SFTP を使用してファイルをサーバー マシンに送信します。サーバー上で署名を検証し、データを復号化したい。
このスキームは安全ですか? セキュリティを向上させるにはどうすればよいですか?
次の手順を実行しています。
- Java キーストアの作成。
- 自己署名 X509 v3 証明書を作成し、JKS キーストアに挿入します。
- この JKS キーストアをクライアントとサーバーの両方に提供します。
- 署名データ : JKS キーストアからプライベート キーと証明書を取得し、 and を使用してデータに署名し
CMSSignedDataGenerator
ますCMSSignedData
。 - を使用して、前のステップの署名付きバイトを暗号化し
CMSEnvelopedDataGenerator
ます。
サーバー側では、次の手順を実行します。
- JKS をロードします。
- JKS から秘密鍵を取得します。
- CMSEnvelopedData を取得してコンテンツを取得します。
- X509 証明書をロードし、CMSSignedData を使用して署名を検証し、データを復元します。
公開鍵と秘密鍵のペアは 1 つしかありません。Bouncy Castle と PKCS 7 を使用しています。
JKSの作成:
public static KeyStore createKeyStore() throws Exception {
KeyStore keyStore = KeyStore.getInstance("JKS");
keyStore.load(null, null);
X500PrivateCredential rootCredential = createRootCredential();
X500PrivateCredential interCredential = createIntermediateCredential(
rootCredential.getPrivateKey(), rootCredential.getCertificate());
X500PrivateCredential endCredential = createEndEntityCredential(
interCredential.getPrivateKey(),
interCredential.getCertificate());
keyStore.setCertificateEntry(rootCredential.getAlias(),
rootCredential.getCertificate());
keyStore.setKeyEntry(
endCredential.getAlias(),
endCredential.getPrivateKey(),
ConfigurationClass.PRIVATE_KEY_PASSWORD.toCharArray(),
new Certificate[]{endCredential.getCertificate(),
interCredential.getCertificate(),
rootCredential.getCertificate()});
keyStore.store(new FileOutputStream(ConfigurationClass.JAVA_KEY_STORE_PATH), ConfigurationClass.KEY_STORE_PASSWORD.toCharArray());
return keyStore;
}